روش‌های بهینه‌سازی مانند LOD, Instancing, Frustum Culling

Three.js ابزارها و تکنیک‌های متعددی برای کاهش مصرف منابع و افزایش FPS ارائه می‌دهد.

۱️⃣ LOD (Level of Detail)

🔹 تعریف

  • نمایش مدل‌ها با جزئیات کمتر وقتی از دوربین فاصله دارند

  • کاهش تعداد Vertex و Draw Call برای صحنه‌های بزرگ

🔹 مثال

const lod = new THREE.LOD(); const highDetail = new THREE.Mesh(new THREE.BoxGeometry(2,2,2), new THREE.MeshStandardMaterial({ color: 0xff0000 })); const mediumDetail = new THREE.Mesh(new THREE.BoxGeometry(1.5,1.5,1.5), new THREE.MeshStandardMaterial({ color: 0xff0000 })); const lowDetail = new THREE.Mesh(new THREE.BoxGeometry(1,1,1), new THREE.MeshStandardMaterial({ color: 0xff0000 })); lod.addLevel(highDetail, 0); // فاصله نزدیک lod.addLevel(mediumDetail, 20); // فاصله متوسط lod.addLevel(lowDetail, 50); // فاصله دور scene.add(lod);

📌 LOD به صورت خودکار Mesh مناسب فاصله را انتخاب می‌کند.

۲️⃣ Instancing

🔹 تعریف

  • برای اشیاء مشابه (درخت، چراغ، سنگ و غیره) به جای چند Mesh جدا، از InstancedMesh استفاده می‌کنیم

  • کاهش Draw Call و مصرف GPU

🔹 مثال

const count = 1000; const geometry = new THREE.BoxGeometry(1,1,1); const material = new THREE.MeshStandardMaterial({ color: 0x00ff00 }); const mesh = new THREE.InstancedMesh(geometry, material, count); for (let i=0; i<count; i++){ const matrix = new THREE.Matrix4().makeTranslation(Math.random()*50,0,Math.random()*50); mesh.setMatrixAt(i, matrix); } scene.add(mesh);

📌 InstancedMesh برای صحنه‌های با تعداد زیاد اشیاء مشابه فوق‌العاده بهینه است.

۳️⃣ Frustum Culling

🔹 تعریف

  • اشیائی که خارج از دید دوربین هستند را رندر نمی‌کند

  • به صورت پیش‌فرض فعال است (Object3D.frustumCulled = true)

🔹 نکته

  • برای Meshهای بزرگ یا صحنه‌های گسترده، Frustum Culling باعث صرفه‌جویی زیاد در GPU می‌شود

  • می‌توان برای برخی اشیاء خاص آن را غیرفعال کرد:

mesh.frustumCulled = false; // همیشه رندر می‌شود

۴️⃣ ترکیب تکنیک‌ها برای صحنه بزرگ

  • LOD برای فاصله‌های دور

  • Instancing برای اشیاء مشابه و پراکنده

  • Frustum Culling برای حذف اشیاء خارج از دید

📌 ترکیب این سه تکنیک باعث افزایش FPS، کاهش Draw Call و مصرف حافظه کمتر می‌شود.

۵️⃣ نکات مهم

  • همیشه ابتدا LOD برای مدل‌های سنگین بسازید

  • InstancedMesh برای اشیاء تکراری ضروری است

  • Frustum Culling به صورت پیش‌فرض فعال است اما در صحنه‌های خاص نیاز به مدیریت دارد

  • برای مدل‌های glTF با جزئیات بالا، حتما Instancing + LOD + Texture بهینه استفاده شود