طراحی صحنههای بزرگ
صحنههای بزرگ با تعداد زیاد اشیاء، نور و جزئیات نیازمند برنامهریزی و بهینهسازی دقیق هستند.
۱️⃣ تقسیمبندی صحنه (Scene Partitioning)
🔹 تعریف
-
صحنه بزرگ را به بخشهای کوچکتر تقسیم میکنیم
-
هر بخش میتواند جداگانه مدیریت و رندر شود
🔹 تکنیکها
-
Chunks / Grid System: بخشبندی زمین یا محیط به مربعها
-
Spatial Hashing: تعیین اشیاء نزدیک دوربین برای رندر
📌 این کار باعث کاهش Draw Call و بهبود FPS میشود.
۲️⃣ استفاده از LOD و Instancing
-
LOD (Level of Detail): نمایش مدل با جزئیات کمتر در فاصله دور
-
Instancing: اشیاء مشابه مانند درختان، چراغها، سنگها
🔹 مثال ترکیبی
۳️⃣ Frustum Culling و Occlusion Culling
🔹 Frustum Culling
-
اشیائی که خارج از دید دوربین هستند را رندر نمیکند
-
در Three.js به صورت پیشفرض فعال است
🔹 Occlusion Culling
-
اشیائی که پشت دیگر اشیاء هستند و دیده نمیشوند را رندر نمیکند
-
Three.js به صورت خودکار انجام نمیدهد، اما میتوان با الگوریتمهای سفارشی مدیریت کرد
۴️⃣ بهینهسازی Texture و Material
-
استفاده از Texture با رزولوشن مناسب
-
استفاده از Compressed Texture (KTX2 / Basis)
-
کاهش تعداد Materialهای مختلف
📌 کاهش تعداد Shaderها و Texture باعث بهبود سرعت رندر صحنههای بزرگ میشود
۵️⃣ استفاده از Light و Shadow بهینه
-
ترکیب AmbientLight + DirectionalLight
-
سایهها فقط برای اشیاء مهم و نزدیک فعال شوند
-
استفاده از ShadowMap با رزولوشن مناسب
۶️⃣ تقسیم رندرینگ با Sceneهای جداگانه یا Layerها
-
اشیاء غیرضروری میتوانند در Scene یا Layer جداگانه قرار گیرند و فقط در صورت نیاز رندر شوند
-
مناسب برای محیطهای بازی و جهانهای بزرگ
۷️⃣ نکات مهم
-
ترکیب LOD + Instancing + Frustum Culling برای صحنههای بزرگ ضروری است
-
کاهش Polygon، Texture بهینه و حذف اشیاء غیرضروری باعث افزایش FPS میشود
-
همیشه عملکرد (Performance) را با Stats.js یا DevTools بررسی کنید