تاريخ عضويت: 2 شنبه 23 آذر 1388 تعداد ارسالها: 431
5 شنبه 11 شهريور 1389 - 21:58
سلام .
من دیروز بعد از این که یک مدل رو داخل مکس طراحی کردم و به موتور ایمپورت کردم متوجه شدم که به علت گستردگی محلی که ساخته بودم و زیاد بودن مجموع پلیگانهای موجد در اون صحنه کارم دچار افت فریم شده . همین بود که به فکر افتادم اگر بشه یک کار کوچیک کرد که در طول بازی مشها تا زمانی که به آنها نیاز ندارم رندر نشون و جی پی یو رو مشغول نکنند میتونه خیلی کار رو روونتر کنه .
برای این کار بعد از چندی فکر کردن یک روش خیلی خیلی ساده پیدا کردم و خوش بختانهجواب داد (به خصوص اگر در کارتون از سایه استفاده میکنید خیلی میتونه کمکتون کنه.)
(البته در همه نوع بازی و صحنه اگر بخواهید استفاده کنید ممکنه کارتو زیاد جالب در نیاد. بیشتر در کارهای اول شخص و سوم شخص و کلا کارهایی که در اونها به طور کامل به کل صحنه اشراف ندارید میخوره)
ببینید شما ممکنه نخواهید همه ی اجسام بازیتون شامل این نوع رندر بشه پس اول یک Game Object/ Creat Empty بسازید و اسم اون رو Render بگذارید . حالا هر ابجکت یا چیزی که میخواهید شامل این کد بشه رو زیر مجموعه ی Render کنید مثل خانه ها - زمینها - درو دیواره ... خلاصه هرچیز که ساختید و پلی داره. (توجه! بازیکن اصلی یا همو پلایر رو زیر مجموعه نکنید .)
خب یک جاوا اسکریپت بسازید و کد زیر رو در اون کپی کنید .
كد:
var Player:Transform;
var Fasele:int;
function FixedUpdate () {
var object=gameObject.GetComponentsInChildren(Renderer);
for(var meshs:Renderer in object){
if(Vector3.Distance(meshs.transform.position,Player.position)>Fasele){
meshs.enabled=false;
}else{
meshs.enabled=true;
}
}
}
درسته کدهاش کم بود
خب کد رو به Render بدید و به متغییر Player بازی کن اصلی رو نسبت بدید.
متغیر Fasele هم تعیین میکنه که اگر مش چه مقدار دروتر از بازیکن بود دیگه غیر فعال بشه.
خب همین .
(باز میگم اگه از سایه استفاده میکنید میتونه خیلی کمک کنه . و در حالی به فریم ریت کمک میکنه یه مقدار به کار CPU اضافه میکنه ! کم. اینو گفتم که دیگه تکمیل بشه).
تاريخ عضويت: 2 شنبه 23 آذر 1388 تعداد ارسالها: 431
جمعه 12 شهريور 1389 - 15:54
نقل قول:
این یک جورایی همون LOD در حالت صفر و یکش
در بازی های اول شخص بیشترین کاربرد رو داره مخصوصا بازی هایی که از زمنیهای با دید زیاد استفاده میکنن
درسته .
در روش ما یا مش مربوطه به اندازه ی کافی نزدیکه و وجود داره یا از فاصله ی تعیین شده به ما دورتر هست و وجود نداره . اما در روش اصلی LOD به این صورت عمل میشه که با دور شدن از مش مورد نظر اون به طور کلی نابود نمیشه بلکه بر حسب فاصله با شما از پلیگانهای اون کم میشه و با نزدیک شدن شما دوباره ترمیم میشه که پیاد سازی همچین سیستمی خیلی کار میبره . هرچند فکر میکنم در سیستم رندر جدید که در Unity 3.0 قرار داده شده این عمل پیاده سازی شده.
تاريخ عضويت: 2 شنبه 23 آذر 1388 تعداد ارسالها: 431
جمعه 12 شهريور 1389 - 21:38
Unity3D, جان یک امتحان بکن کد رو خیلی قشنگ جواب میده. به امتحانش میرزه
فقط به خاطر حلقه ی for یک مقدار ممکنه روی کار Cpu اثر بگذاره. که این هم در اول کار تذکر دادم
بله اگر سیستم LOD رو بخوای با سرچ تو اینترنت پیدا کنیم زیاد هست فقط گفتم یک چیز ساده بنویسیم که هم کاربرد خودش رو داشته باشه هم بفهمیم قطعه کدی که نوشتیم چیکار میکنه نه این که از اینترنت کد رو بگیریم و بدون این که بفهمیم استفاده کنیم.
در هر صورت این کد خیلی خیلی ساده هست و نباید ازش انتظار داشت ولی یقینن کار رو سنگینتر نمیکنه!
تاريخ عضويت: 2 شنبه 23 آذر 1388 تعداد ارسالها: 1034
شنبه 13 شهريور 1389 - 13:02
alpine, بله اگه اين كد رو شما به 2 يا 3 تا آبجكت فوق Highpoly نسبت بدی شاید قشنگ کار کنه ولی وقتی تعداد آبجکتهایی که این اسکریپت رو بهش نسبت میدی زیادتر بشه ... خودت متوجه میشی که بازیت سبک نمیشه هیچ سنگینتر هم میشه !!
پیاده سازی یه سیستم بهینه ساز چیزی نیست که با چند خط کد بشه انجام داد ...
برای کار بهینه سازی این قسمت از manual رو مطالعه بفرمایید :
Unity Manual > Advanced > Optimizing Graphics Performance