طراحی صحنه‌های بزرگ

صحنه‌های بزرگ با تعداد زیاد اشیاء، نور و جزئیات نیازمند برنامه‌ریزی و بهینه‌سازی دقیق هستند.

۱️⃣ تقسیم‌بندی صحنه (Scene Partitioning)

🔹 تعریف

  • صحنه بزرگ را به بخش‌های کوچک‌تر تقسیم می‌کنیم

  • هر بخش می‌تواند جداگانه مدیریت و رندر شود

🔹 تکنیک‌ها

  • Chunks / Grid System: بخش‌بندی زمین یا محیط به مربع‌ها

  • Spatial Hashing: تعیین اشیاء نزدیک دوربین برای رندر

📌 این کار باعث کاهش Draw Call و بهبود FPS می‌شود.

۲️⃣ استفاده از LOD و Instancing

  • LOD (Level of Detail): نمایش مدل با جزئیات کمتر در فاصله دور

  • Instancing: اشیاء مشابه مانند درختان، چراغ‌ها، سنگ‌ها

🔹 مثال ترکیبی

// LOD و Instancing برای درختان در یک جنگل const treeGeometry = new THREE.ConeGeometry(1, 3, 8); const treeMaterial = new THREE.MeshStandardMaterial({ color: 0x228B22 }); const treeCount = 500; const treeMesh = new THREE.InstancedMesh(treeGeometry, treeMaterial, treeCount); for (let i = 0; i < treeCount; i++) { const matrix = new THREE.Matrix4().makeTranslation(Math.random()*100,0,Math.random()*100); treeMesh.setMatrixAt(i, matrix); } scene.add(treeMesh);

۳️⃣ 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 بررسی کنید