تصویر برای توضیح تئوریک کالینگ

یکی از مواردی که توی فرایند بازی سازی خوبه باهاش آشنا باشید و ازش بهره ببرید آشنایی با بهینه سازی منابع و کارایی بازیه بخصوص وقتی قراره پلتفرم شما گوشی باشه و طبعا به نسبت کامپیوتر منابع کمتری داشته باشه.یکی از روش های بهینه سازی مصرف منابع بازی culling هست.

اصلا Culling چی هست؟!

بطور خلاصه و خودمونی کاربرد کولینگ اینه که چیزهایی که توی دید دوربین بازی نیستن پردازش نشن و منابع رو مصرف نکنن.

مثلا وقتی تو بازی شما بازیکن شما توی آشپزخونست گوشی بیچارش نباید محتوای توی حیاط رو رندر کنه! چون اصلا نیازی بهش نداریم مگر اینکه بازیکن بره توی حیاط!

اینجاست که Culling ها به داد کامپیوتر و گوشی میرسن!

کولینگ توی یونیتی پشتیبانی میشه اما این مفهون منحصر به انجین یونیتی نیست و میشه گفت باید اون رو یک موضوع گرافیک کامپیوتری(cg) در نظر گرفت.

یونیتی بطور پیشفرض از یک روش Culling استفاده میکنه با نام Frustom Cullin ، اما به ما امکان استفاده از نوع دیگه ای از کولینگ رو هم میده به نام Oclussion Culling که قراره با نحوه کارا هر دو روش آشنا بشید.

 

نکته: مفهوم Culling با Clipping شباهت ها و تفاوت هایی داره که توی این پست تمرکز روی کولینگ هست.

آیا کولینگ منحصر به رندر سه بعدیه؟

خیر!

برخلاف چیزی که ممکنه بنظر بیاد(و خیلی از مقالات و سایتها با حالت سه بعدی کولینگ رو معرفی کنن) اما کولینگ منحصر به رندر سه بعدی نیست و این بهینه سازی میتونه توی رندر های دو بعدی هم اتفاق بیفته.

Frustom Culling

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

توی این متد ،هرچیز که خارج از محدوده دید دوربین یا همون فریمش باشه رندر نمیشه.

اما توجه داشته باشید توی این حالت اجزایی که در محدوده دید دوربین هستند حتی اگر پشت اجسام دیگه باشن رندر میشن اما هرچی دیگه که خارح از قاب دوربین باشه رندر نمیشه.

به ویدئو پایین توجه کنید،پیش نمایش متد frustum culling:

درخت های قرمز درخت هایی هستن که رندر نمیشن چون تماما(و نه بخشی از اونها) خارج از محدوده دید هستن.

 

Oclussion Culling

این متد شبیه furstum هست اما با یک تفاوت مهم و اون اینکه اجزایی که در محدوده دید دوربین هستن اما پشت اجسام دیگه هستن هم از فرایند رندر حذف میشن حتی اگر در قاب دوربین باشن. اگر بخوام با ویدئویی که برای توضیح frustom دیدید مثال بزنم اینطور میشه که درخت هایی که پشت درخت های دیگه هستن رندر نمیشن حتی اگر در محدوده دید دوربین و دوبه روی دوربین باشن.

برای شفاف تر شدن کالینگ و دو متد گفته شده و تفاوتشون به تصاویر پایین توجه کنید:

نمای اول - رندر همه محتوا بدون کالینگ

نمای اول – رندر همه محتوا بدون کالینگ


 

نمای دوم-frustom culling- رندر محتوای در دید دوربین و حذف مواردی که در دید نیستن

نمای دوم-frustom culling- رندر محتوای در دید دوربین و حذف مواردی که در دید نیستن


نمای سوم-Occlision culling-رندر محتوایی که در دید دوربین هست و در حال نمایشه و عدم رندر محتوایی که پشت اونهاست حتی اگر در محدوده دید دوربین باشه

نمای سوم-Occlision culling-رندر محتوایی که در دید دوربین هست و در حال نمایشه و عدم رندر محتوایی که پشت اونهاست حتی اگر در محدوده دید دوربین باشه(به دایره پشت مکعب صورتی توجه کنید)

 

نحوه فعالسازی Oclussion Culling در یونیتی

 

نکته مهم:

اشیایی که میخوایید این قابلیت روشون اعمال شه باید تیک Static اونها از پنجره Inspector فعال باشه و به نوعی این قابلیت یونیتی مخصوص اشیا Static هست که حرکت نمیکنن

پیش از شروع بیایید با دو مفهوم آشنا بشیم:

1-Ocluder

2-Ocludee

مورد اول برای اینه که اون شی خودش مانع رویت اشیا دیگه در محدوده دید دوربین شناخته شه(مثل دیوار،ساختمون ،در و ..) و دومی برای اینه که شی خودش قابل cull و پنهان سازی شناخته شه مثل ماشینی که پشت در پارکه.

طبق پیشنهاد داکیومنت یونیتی دو گروه از گیم آبجکت ها هستن که کاندید خوبی برای ایفای نقش Ocluder هستن،همونطور که گفته شد Ocluder همون شیئی میشه که میتونه مانع دید دوربین شناخته شه تا اشیا پشتش رندر نشن:

1-هر شیئی که Renderer داره، و البته شفاف نیست، مثل دیوار،مثلا شیشه پنجره مناسب نیست مگر اینکه تماما کدر باشه

2-اون شی حرکتی نداشته باشه

https://docs.unity3d.com/Manual/occlusion-culling-getting-started.html:

Any GameObject that is likely to be occluded at runtime is a good candidate to be a Static Occludee, including small or transparent GameObjects. To be a Static Occludee, a GameObject must:

Have any type of Renderer

component Not move at runtime


خب برای شروع اول همه گیم آبجکتهایی که داخل صحنه حرکت نمیکنن و میخواید شامل culling شن رو انتخاب کنید و تیک Static اونها رو فعال کنید

بعد تیک گزینه Oclussion Culling رو از خصوصیات دوربین فعال کنید

برای این کار توی صحنه یونیتی از قسمت Hirerachy روی دوربین مورد نظر کلیک کنید

حالا از قسمت inspector، جایی که به مشخصات و تنظیمات دوربین انتخاب شده دسرسی دارید،میتونید تیک Occlusion Culling رو فعال یا غیرفعال کنید

بعد از منوی بالای یونیتی این مسیر رو طی کنید تا به پنجره Oclussion culling برسید:

Window > Rendering > Occlusion Culling

خصوصیات پنجره چیزی شبیه به این عکسه:

زمانی که تب Object این پنجره بازه از داخل سین خودتون گیم آبجکت هایی که Terrain یا Mesh Renderer دارن رو انتخاب کنید، مثلا دیوار که mesh renderer داره یا چیزای دیگه.

بعد از انتخاب شی مورد نظر داخل پنجره Oclussion دوتا تیک Ocluder Static و Ocludee Static رو فعال کنید(مثل تصویر قبلی)،

بعد روی دکمه Bake کلیک کنید تا دیتای اوکلیژن کولینگ رو آماده کنه.

تمام! حالا میتونید از این قابلیت بهره ببرید،البته

تصاویر پایین از نتیجه تست من داخل یک سین بود که تاثیر خوبی روی کارآمدی صحنه داشت:

اسکرین شات قبل از اعمال تغییرات

اسکرین شات قبل از اعمال تغییرات

اسکرین شات بعد از اعمال تغییرات

اسکرین شات بعد از اعمال تغییرات

 

پایان!

امیدوارم این پست براتون مفید و کاربردی بوده باشه.

در آخر چند تا لینک مرتبط میذارم که ممکنه براتون مفید باشه:

https://docs.unity3d.com/Manual/occlusion-culling-getting-started.html

https://docs.unity3d.com/Manual/OcclusionCulling.html

https://docs.unity3d.com/Manual/occlusion-culling-window.html

https://docs.unity3d.com/Manual/StaticObjects.html

 

اگر بیش از این مشتاقید درمورد Culling ها بدونید میتونید با گوگل  کردن عبارت ” culling in video games ” مطالب مختلفی رو در این حوزه بدست بیارید،اینجا لیست چند URL که ممکنه در رابطه با کالینگ یا اوکلیژن کالینگ مفید باشن رو لیست میکنم:

https://vintay.medium.com/why-occlusion-culling-improves-game-performance-822f334097b5

https://medium.com/@niitwork0921/what-is-culling-in-game-design-a97c0b6344dd

https://thegamedev.guru/unity-performance/occlusion-culling-tutorial/

https://techpubs.jurassic.nl/manuals/0640/developer/Optimizer_PG/sgi_html/ch05.html

موفق باشید