Contacts
صفحه اصلی پورتال | صفحه اصلی تالار | ثبت نام | اعضاء | گروه ها | جستجو | پرسش و پاسخ | فروشگاه الکترونیکی | خرید پستی بازی های کامپیوتری





صفحه اول انجمنها -> ساخت بازی با نرم افزار Unity -> مشکل عجیب یونیتی در Static Batching
 

ارسال يك موضوع جديد   پاسخ به يك موضوع ديدن موضوع قبلي :: ديدن موضوع بعدي

مشکل عجیب یونیتی در Static Batching
نويسنده
پيغام
Quarantine
در حال رشد
در حال رشد


تاريخ عضويت: 4 شنبه 2 فروردين 1391
تعداد ارسالها: 48


2 شنبه 26 تير 1391 - 02:14
پاسخ بصورت نقل قول
سلام...

همینطور که می دونین چند راه برای برطرف کردن مشکل drawcall ها وجود داره:

1. ترکیب کردن آبجکت ها در نرم افزار های تری دی
2. ترکیب آبجکت ها تو خود یونیتی با استفاده از کد ها
3. ترکیب آبجکت ها با استفاده از سیستم batch خودکار یونیتی ...

بهینه ترین روش، گزینه سوم ه... یعنی اینکه اجازه بدیم که خود یونیتی بیاد و آبجکت ها رو batch کنه... تنها کاری که باید انجام بدیم اینه که بیایم تیک static آبجکت ها رو فعال کنیمو تنها یک متریال بینشون شر کنیم (به این منظور میشه تمام عکس ها با شیدر مورد نظر رو تو یه اطلس داشت)

متاسفانه مشکلی وجود داره... مشکل کار اینجاس که یونتی به صورت عجیب و غریبی همیشه یک drawcall اضافه رسم می کنه... فرضا اگه سه تا آبجکت با یه متریال تو صحنه باشه به جای اینکه یک drawcall داشته باشیم بیشتر وقتا دو تا داریم.

البته عواملی هم برای اضافه شدن به تعداد drawcall ها وجود داره و اونم استفاده از shader ها و light هاس... اما تو تستی که تو یه صحنه ساده و حتی بدون هیچ ligh ی انجام دادم یه drawcall اضافه بیشتر وقتا تو صحنه رندر میشه...

بالاخره بعد از چندین روز ، به صورت تصادفی و در واقع انگولک بازی Very Happy به نتیجه عجیب و غریبی رسیدم... دیدم که اگه بخوایم اشیاء رو کمی با فاصله از هم قرار بدیم اونوقت batch کردن کاملا عجیب و غریب تر میشه..

یعنی اگه آبجکت ها نزدیک تر باشن batch کردن بهتر انجام میشه و اگه دورتر باشن batch بدتر انجام میشه...

واقعا آخرش نفهمیدم... آیا batch کردن به دوری و نزدیکی مربوطه ؟
آیا واقعا این می تونه باگ پنجره آمار یونیتی باشه ؟ (که بعضی ها بهش معتقد بودن)
آیا کلا batching دچار باگه ؟
آیا شما تا به الان به همچین مشکلی برخوردین ؟

بر اساس اون چیزی که خود Documentation یونیتی گفته، static batching باس به این صورت عمل کنه:
http://www.rbcafe.com/Softwares/Unity/Documentation/Manual/iphone-DrawCall-Batching.html

الان من واقعا متحیر و مبهوت شدم که چیکار کنم ؟ اگه بخواد drawcall اضافه وجود داشته باشه که بهتره تمام آبجکت هایی رو که از یک متریال بهره می برن رو با هم ترکیب کنم. اما این کار کاملا Occlusion Culling رو در هم می کوبه.... اگه بخوام همین راه رو ادامه بدم اونوقت یه drawcall اضافه رسم میشه... موندم که چیکار کنم...

من یه پروژه تست رو آماده کردم بهتره شما هم یه نیگاه بهش بندازین... البته اینو به عنوان باگ واسه خود سایت یونیتی هم ارسال کردم...

تست من شامل یه Plane و سه تا مکعب نزدیک هم و سه تا مکعب دور از هم میشه...(6 معکب از یه متریال یکسان بهره می برن).. یه Directional Light هم وجود داره که رو Forward رندرینک تاثیری نداره اما رو deferred چرا... الان من دنبال Forward م... کلا باس 4 تا draw تو صحنه باشه...
2 تا شخصیت ما
یکی plane
یکی هم واسه سه آبجکت
اما همونطوری که گفتم بیشتر وقتا یه draw اضافه رسم میشه...

اونایی که نزدیک همه ن خوب batch میشن... (4draws and 3 batched) اونایی که دور از همه ن تو بعضی قسمتا (5draws and 2batched)

بهتره خودتون ببینین.. من که دارم روانی میشم...

http://www.mediafire.com/?lfjjt6tclryafra
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي
 

نويسنده
پيغام
iran_adventure
مدیر انجمن
مدیر انجمن


تاريخ عضويت: شنبه 4 آذر 1385
تعداد ارسالها: 2069
محل سكونت: تهران


2 شنبه 26 تير 1391 - 15:14
پاسخ بصورت نقل قول
drawcall ها به تعداد پلیگان هم وابسته هست. مثلا هر 300 مثلث یک drawcall اضافه می کنه. البته بر اساس تجربه ای که من داشتم این کار به سیستم هم مربوط می شه. مثلا توی یک مک بوک همچین اتفاقی نمی افتاد ولی توی ویندوز این طور بود...

یک مسئله دیگه هم فاصله آبجکت ها از دوربین هستش. اگه یک آبجکت با متریال جدا بین حد فاصل دو آبجکت با یک متریال یکسان باشه با این که شما دو متریال دارید 3 drawcall دارید. مثلا برای یک بازی دو بعدی باید سعی کنید بکگراند دارای یک متریال آبجکتهای میانی دارای یک متریال و gui دارای متریال جداگانه باشد. تا در بهترین حالت 3 drawcall داشته باشید.

نکته سوم هم مربوط به scale می شه که آبجکتهایی که scale متفاوت داشته باشند با هم Batch نمی شوند و drawcall اضافه می شود. البته در یک حالتی این اتفاق نمی افته ( در خود document گفته شده ولی دلیلش رو نگفته ) که من به شخصه هیچ وقت scale رو عوض نمی کنم که در آینده دچار مشکل نشم ...

من فعلا با Static Batching کار نکردم. این اطلاعاتی بود که در مورد drawcall داشتم

_________________
Make something happen
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل نام كاربري در پيغامگير Yahoo
 

نويسنده
پيغام
Quarantine
در حال رشد
در حال رشد


تاريخ عضويت: 4 شنبه 2 فروردين 1391
تعداد ارسالها: 48


2 شنبه 26 تير 1391 - 21:59
پاسخ بصورت نقل قول
نقل قول:
drawcall ها به تعداد پلیگان هم وابسته هست. مثلا هر 300 مثلث یک drawcall اضافه می کنه.

این محدودیت ها گمونم مربوط به Dynamic batching میشه... و مقدارشم بر حسب ورتکس سنجدیده میشه. البته این نامبر ها فیکس نیستن و در آینده به این حد شمارش اضافه هم میشه.
Batching dynamic objects has certain overhead per vertex, so batching is applied only to meshes containing less than 900 vertex attributes in total.

If your shader is using Vertex Position, Normal and single UV, then you can batch up to 300 verts and if your shader is using Vertex Position, Normal, UV0, UV1 and Tangent, then only 180 verts.
Please note: attribute count limit might be changed in future

اما این در مورد static batching صدق نمی کنه:
http://docs.unity3d.com/Documentation/Manual/iphone-DrawCall-Batching.html

تو تست بالا 4 تا مکعب ساده درست و حسابی با هم بتچ نمیشن.

نقل قول:
مثلا توی یک مک بوک همچین اتفاقی نمی افتاد ولی توی ویندوز این طور بود

این نکته جدیدی بود ...مرسی... میشه یه لطفی بکنی و پروژه ی تستی که اون بالا دادمو یه تستی بکنی ؟ شخصیت رو جایی تنظیم کردم که با شروع بازی پنج drawcall نشون داده بشه... ببین شما هم پنج تا داری یا 4 تا....


نقل قول:
یک مسئله دیگه هم فاصله آبجکت ها از دوربین هستش. اگه یک آبجکت با متریال جدا بین حد فاصل دو آبجکت با یک متریال یکسان باشه با این که شما دو متریال دارید 3 drawcall دارید. مثلا برای یک بازی دو بعدی باید سعی کنید بکگراند دارای یک متریال آبجکتهای میانی دارای یک متریال و gui دارای متریال جداگانه باشد. تا در بهترین حالت 3 drawcall داشته باشید.

جالب بود مرسی... اما تو تست ساده بالا ما فقط سه تا آبجکت داریم که همه شون از یه متریال ساده استفاده می کنن. و دوری و نزدیکی هم همونطوری که گفتم تاثیر خاصی رو drawcall ها داره... تو بحثی که اینجا:
http://answers.unity3d.com/questions/283345/is-batching-and-also-atlas-almost-useless.html
داشتم آخرش به این نتیجه رسیدم که ممکنه خطای پنجره آمار یونیتی باشه..

نقل قول:
نکته سوم هم مربوط به scale می شه که آبجکتهایی که scale متفاوت داشته باشند با هم Batch نمی شوند و drawcall اضافه می شود. البته در یک حالتی این اتفاق نمی افته ( در خود document گفته شده ولی دلیلش رو نگفته ) که من به شخصه هیچ وقت scale رو عوض نمی کنم که در آینده دچار مشکل نشم ...

البته scale کردن هم بازم مربوط میشه به dynamic batching طبق documentation خود یونیتی:
http://docs.unity3d.com/Documentation/Manual/iphone-DrawCall-Batching.html

Don't use scale. Objects with scale (1,1,1) and (2,2,2) won't batch.
Uniformly scaled objects won't be batched with non-uniformly scaled ones.

Objects with scale (1,1,1) and (1,2,1) won't be batched. On the other hand (1,2,1) and (1,3,1) will be.

منم واقعیتش اصلا scale خود یونیتی رو عوض نمی کنم... سعی میکنم که Xform آبجکت ها رو قبل از اکسپورت ریست کنم تا تو یونیتی مشکل scale نداشته باشم...

نقل قول:
من فعلا با Static Batching کار نکردم. این اطلاعاتی بود که در مورد drawcall داشتم

ممنونم.... سعی می کنم که اطلاعات بیشتر رو به زودی ارائه بدم.
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي
 

نويسنده
پيغام
iran_adventure
مدیر انجمن
مدیر انجمن


تاريخ عضويت: شنبه 4 آذر 1385
تعداد ارسالها: 2069
محل سكونت: تهران


2 شنبه 26 تير 1391 - 23:24
پاسخ بصورت نقل قول
پروژه رو دیدم.
بله مشکلی که می گید هست.
البته برای تست بهتر هستش که فقط همون 3 آبجکت و یک دوربین باشه.
چند نکته دیگر رو در نظر داشته باشید.

اول اینکه خود شیدر هم در تعداد drawcall تاثیر داره.
دوم اینکه نوع rendering path هم در تعداد drawcall تاثیر داره.
نکته سوم که در واقع یک باگ هستش ( حداقل تا قبل از 3.5 ) برای update تعداد drawcall دوربین رو باید کمی جابه جا کنید.

من shader ای که برای پروژه های دوبعدی ازش استفاده می کنیم رو به آبجکت ها دادم و نوع rendering path هم vertex lit گذاشتم و drawcall یک شد. ولی برای پروژه های 3 بعدی تا به حال فکری نکردم و فعلا راه حلی رو نمی دونم ( یا اینکه دلیلش رو نمی دونم )

خوشحال می شم که دلیل یا راه حلش رو بدونم. اگه متوجه شدید لطفا اعلام کنید. من هم خیلی علاقه دارم بدونم ( برای پروژه های 3 بعدی و rendering path به غیر از vertex lit )

_________________
Make something happen
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل نام كاربري در پيغامگير Yahoo
 

نويسنده
پيغام
Quarantine
در حال رشد
در حال رشد


تاريخ عضويت: 4 شنبه 2 فروردين 1391
تعداد ارسالها: 48


3 شنبه 27 تير 1391 - 05:22
پاسخ بصورت نقل قول
نقل قول:
اول اینکه خود شیدر هم در تعداد drawcall تاثیر داره.

دقیقا..
اطلاعات بیشتر:
http://answers.unity3d.com/questions/9857/what-exactly-in-a-shader-stops-batching-from-happe.html

نقل قول:
دوم اینکه نوع rendering path هم در تعداد drawcall تاثیر داره.

کاملا.. تو همون تستی که انجام دادم VertexLit دقیق عمل میکرد...

نقل قول:
نکته سوم که در واقع یک باگ هستش ( حداقل تا قبل از 3.5 ) برای update تعداد drawcall دوربین رو باید کمی جابه جا کنید.

متوجه نشدم.. شما جابجاش کردین ؟ مطمئنا نتیحه ای نداد درسته ؟

نقل قول:
من shader ای که برای پروژه های دوبعدی ازش استفاده می کنیم رو به آبجکت ها دادم و نوع rendering path هم vertex lit گذاشتم و drawcall یک شد. ولی برای پروژه های 3 بعدی تا به حال فکری نکردم و فعلا راه حلی رو نمی دونم ( یا اینکه دلیلش رو نمی دونم )

من کل سایت یونیتی رو برای پیدا کردن جوابش زیرو رو کردم. حتی به عنوان باگ هم براشون ارسال کردم اما جوابی ندادن..والا از روی شانس اومدم گزینه های receive shadows و cast shadows رو هم غیر فعال کردم و دیدم که غیر فعال کردن receive shadows کاملا باعث میشه که drawcall ها بدون نقص عمل کنن... Shocked
نمی دونم ما که شیدر خاصی هم تو صحنه نداریم... چرا غیر فعال کردن این گزینه باعث میشه که همه چیز به درستی عمل کنه.. شاید بشه این گزینه رو به عنوان ترفندی تو بازی استفاده کرد.. جایی که آبجکت ها سایه ای رو دریافت نمی کنن بیایم تیکشو غیر فعال کنیم...
یا آخرین راه حل پیشنهادی من کمباین کردن آبجکت هاس..
رو تستی که انجام دادم بهتره که آبجکتهای lowpoly رو کمباین کنیم تا بخوایم به عهده batching بسپاریمشون... چون اگه تعداد آبجکت ها زیاد باشه اونوقت تعداد batch افزایش پیدا می کنه و تاثیرشو روی VBO می بینیم...
نقل قول:

خوشحال می شم که دلیل یا راه حلش رو بدونم. اگه متوجه شدید لطفا اعلام کنید. من هم خیلی علاقه دارم بدونم ( برای پروژه های 3 بعدی و rendering path به غیر از vertex lit )

والا من دیگه کلا بی خیال این قضیه شدم.. به نظر میرسه که تو فورام یونیتی هر کسی سعی می کنه که رو این قضیه سرپوش بذاره و یه جورایی طفره بره...

بر اساس آخرین تاپیکم دراین مورد:
http://answers.unity3d.com/questions/283345/is-batching-and-also-atlas-almost-useless.html

بهم گفتن که نیازی نیست که زیاد به این قضیه گیر بدم.. همینکه از اطلس استفاده می کنی و متریال هات کمتر باشن ، رندرینگ بهتر انجام میشه و مشکلی هم وجود نداره...
منم فعلا دارم همین روند رو پیش میبرم اما واقعا خیلی ناراحتم که بعد از این همه سرچ نتونستم به جوابی برسم... Neutral
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي
 

نويسنده
پيغام
Quarantine
در حال رشد
در حال رشد


تاريخ عضويت: 4 شنبه 2 فروردين 1391
تعداد ارسالها: 48


5 شنبه 29 تير 1391 - 01:07
پاسخ بصورت نقل قول
خب بالاخره جوابمو گرفتم... اون یه دونه drawcall اضافی رو همونطوری که حدسشو میزدم مربوط به خود سایه هاس... یعنی چه بخوای و چه نخوای همیشه یه drawcall اضافه رندر میشه.
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي
 

نويسنده
پيغام
iran_adventure
مدیر انجمن
مدیر انجمن


تاريخ عضويت: شنبه 4 آذر 1385
تعداد ارسالها: 2069
محل سكونت: تهران


5 شنبه 29 تير 1391 - 02:12
پاسخ بصورت نقل قول
خوبه ...

منظور من از جابه جایی دوربین این بود که بعد از هر تغییر دوربین رو چند واحد جابه جا کنید و برش گردونید سر جاش چون بعضی اوقات اگه این کار رو نکنی پنجره statistics آپدیت نمی شه ...

_________________
Make something happen
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل نام كاربري در پيغامگير Yahoo
 

نويسنده
پيغام
Quarantine
در حال رشد
در حال رشد


تاريخ عضويت: 4 شنبه 2 فروردين 1391
تعداد ارسالها: 48


5 شنبه 29 تير 1391 - 14:01
پاسخ بصورت نقل قول
جالب بود.. نکته خوبی بود مرسی...
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي
 

نمايش نامه هاي ارسال شده قبلي:   
ارسال يك موضوع جديد   پاسخ به يك موضوع    صفحه 1 از 1 تمام ساعات و تاريخها بر حسب 3.5+ ساعت گرينويچ مي باشد


 
پرش به:  


شما نمي توانيد در اين انجمن نامه ارسال كنيد.
شما نمي توانيد به موضوعات اين انجمن پاسخ دهيد
شما نمي توانيد نامه هاي ارسالي خود را در اين انجمن ويرايش كنيد
شما نمي توانيد نامه هاي ارسالي خود را در اين انجمن حذف كنيد
شما نمي توانيد در نظر سنجي هاي اين انجمن شركت كنيد


unity3d

بازگردانی به فارسی : علی کسایی @ توسعه مجازی کادوس 2004-2011
Powered by phpBB © 2001, 2011 phpBB Group
| Home | عضويت | ليست اعضا | گروه هاي كاربران | جستجو | راهنماي اين انجمن | Log In |