אופטימיזציה של קוליידרים פיזיקליים בסצנות משחק מורכבות
סצנה עם 800 אובייקטי משחק, שלכל אחד מהם MeshCollider המבוסס על גיאומטריה אמיתית — PhysX מבזבז 8–12 אלפיות שנייה לכל FixedUpdate על בדיקות Broadphase ו-Narrowphase. זה חצי מתקציב הפריים רק לפיזיקה. ב-VR, שבו תקציב הפריים הוא 11 אלפיות שנייה (90 FPS), זה גורם לנפילה מיידית. הצוות שלנו נתקל בפרויקטים כאלה פעמים רבות: אופטימיזציה של קוליידרים היא משימה שבה ארכיטקטורה נכונה מההתחלה חוסכת שבועות של עבודה. החיסכון הטיפוסי בפרויקט נע בין 40 ל-60 שעות עבודה ידנית. אנו מבטיחים 90 FPS יציבים לאחר השיפורים. צרו קשר — נבחן את הפרויקט שלכם ונציע תוכנית אופטימיזציה.
כיצד PhysX מבזבז זמן והיכן ההפסדים
הפיזיקה ב-Unity עוברת שני שלבים: Broadphase (סינון מהיר: אילו אובייקטים בכלל קרובים זה לזה?) ו-Narrowphase (בדיקת התנגשות מדויקת עבור זוגות מסוננים).
Broadphase משתמש בעץ AABB (Axis-Aligned Bounding Box). אם אובייקטים נעים כל הזמן, העץ נבנה מחדש כל הזמן. 200 Rigidbody עם isKinematic = false שנעים כל פריים גורמים לבנייה מחדש רציפה של עץ ה-AABB. פתרון: אובייקטים שלא נעים כרגע צריכים להיות מוגדרים כ-isKinematic = true באמצעות סקריפט — הם יוצאים מהעץ הדינמי.
ב-Narrowphase, MeshCollider הורג את הביצועים. בדיקת התנגשות בין שתי רשתות שרירותיות היא O(n×m) לכל משולש. קוליידר של שחקן מול קוליידר של בניין עם 50,000 משולשים פירושו אלפי פעולות לכל Narrowphase. PhysX לא תומך כלל ב-MeshCollider לא-קמור מול MeshCollider לא-קמור עבור אובייקטים דינמיים — רק מול סטטיים.
מדוע MeshCollider כל כך יקר?
כל משולש ב-MeshCollider דורש בדיקת Narrowphase. עבור אובייקטים סטטיים (קירות, רצפות) זה נסבל, אבל עבור אובייקטים דינמיים זה אסון. אפילו עם convex = true, הפיזיקה מעריכה את כל הפאות של הקליפה הקמורה. בפועל: החלפת 10 MeshCollider כבדים על דמויות ב-Compound Collider הפחיתה את זמן ה-CPU של הפיזיקה ב-40% בסימולטור VR אחד.
כיצד Compound Collider מפחית עומס
Compound Collider — קבוצה של פרימיטיבים כילדים של Rigidbody אחד. הדרך היחידה לקבל פיזיקה דינמית לא-קמורה ללא שימוש ב-MeshCollider לא-קמור: כמה חלקים קמורים = צורה מורכבת. עבור נשקי VR, אובייקטים מפורטים, רובוטים — גישה סטנדרטית. החלפת MeshCollider אחד ב-Compound של 3–5 פרימיטיבים מפחיתה את עלות הפיזיקה פי 50 תוך שמירה על דיוק של >90%.
החלפות ופישוטים מעשיים
כלל ראשון: החליפו MeshCollider במקום שבו השחקן לא ישים לב. כיסא עם MeshCollider המבוסס על גיאומטריה אמיתית הוא 200 משולשים. אותו כיסא עם 2 BoxCollider (רגליים + מושב) הוא 2 פרימיטיבים. דיוק ההתנגשות הוא 95% מהמקור, העלות — נמוכה פי 50.
עבור צורות אורגניות (סלעים, חביות, מכוניות), קבוצה של 3–6 ConvexMeshCollider (רשתות קמורות מפושטות) עובדת הרבה יותר מהר מאשר לא-קמורה ואינה ניתנת להבחנה ויזואלית. ב-Unity: MeshCollider.convex = true + רשת מפושטת דרך LOD או יצירת פרוקסי התנגשות ידנית ב-Blender.
מטריצת התנגשות (Layer Collision Matrix). ב-Physics Settings → Layer Collision Matrix, השבתו בדיקות בין שכבות שאמורות לעולם לא ליצור אינטראקציה: Environment מול Environment, UI מול Physics Objects, VFX מול כל שכבה. כל זוג מושבת פירושו פחות זוגות Broadphase. עם תצורת מטריצה נכונה, מספר הזוגות הפעילים יכול לרדת ב-30–50%.
סף שינה (Sleep Threshold). Rigidbody נרדם כשהמהירות יורדת מתחת ל-Physics.sleepThreshold. Rigidbody ישן לא משתתף בפיזיקה — עלות כמעט אפסית. ערך ברירת המחדל (0.005) נמוך מדי עבור סצנות מורכבות: אובייקטים נשארים פעילים במהלך רעידות מיקרו. עבור סצנות VR ללא סימולציית נוזלים/בדים, הגדירו אותו ל-0.1–0.2.
כיצד אנו מבצעים אופטימיזציה: מקרה מבחן
מניסיון: בסימולטור VR לציוד תעשייתי, סצנת סדנה הכילה 1200 אובייקטים, רובם עם MeshCollider ממודלי CAD מיובאים (15,000–80,000 משולשים כל אחד). זמן CPU של פיזיקה — 14 אלפיות שנייה. לאחר החלפת כל ה-MeshCollider הסטטיים בפרוקסי קמורים (אוטומטית באמצעות סקריפט עורך + פירוק VHACD) והשבתת זוגות מטריצת שכבות מיותרים — זמן ה-CPU של הפיזיקה ירד ל-2.8 אלפיות שנייה. הרווח — 80% מזמן הפיזיקה. החיסכון הממוצע לפרויקט נע בין 40 ל-60 שעות פיתוח. הפחתת עלויות מחשוב ענן עקב פחות פיזיקה מגיעה ל-30–50%.
| סוג קוליידר | עלות משוערת (זמן CPU) | מתי להשתמש |
|---|---|---|
| MeshCollider (לא-קמור) | ~10–20 אלפיות שנייה עבור 500 משולשים | סטטי, אם הדיוק קריטי |
| Compound Collider (5 פרימיטיבים) | ~0.2 אלפיות שנייה | דינמי, צורות מורכבות |
| Convex MeshCollider (מפושט) | ~1–2 אלפיות שנייה | אובייקטים אורגניים, לא דורשים דיוק מלא |
כלי אבחון
Physics Profiler ב-Unity Profiler — מציג זמן עבור Broadphase, Narrowphase, SimulateAndCollide, UpdateTriggers בנפרד. כאן אפשר לראות היכן ההפסדים.
Physics Debugger (Window → Analysis → Physics Debugger) — מציג קוליידרים ישירות ב-Scene View עם קידוד צבע לפי סוג (Static, Dynamic, Kinematic, Trigger). מאפשר למצוא במהירות אובייקטים עם קוליידרים כבדים באופן בלתי צפוי.
PhysicsViewer — כלי עורך מותאם אישית — סקריפט שמפיק רשימה של כל ה-MeshCollider בסצנה, ממוינים לפי מספר משולשים. אנו כותבים אותו ב-30 דקות, וחוסכים שעות של חיפוש.
טעויות נפוצות באופטימיזציית קוליידרים
- החלפת כל ה-MeshCollider ללא התחשבות בדיוק — עלולה לשבור את המשחק. בדקו התנגשויות על אובייקטים קריטיים. - הגדרת Layer Matrix "בעין" ללא ניתוח זוגות. תמיד בצעו פרופיל לפני/אחרי. - התעלמות מ-Sleep Threshold: אובייקטים שאמורים לישון נשארים פעילים עקב סף נמוך.מה כלול בעבודה
- פרופיל של זמן CPU של פיזיקה, זיהוי צווארי בקבוק
- מלאי מלא של קוליידרים בסצנה עם סיווג
- החלפת MeshCollider כבדים בפרימיטיבים/Compound תוך שמירה על דיוק
- הגדרת Layer Collision Matrix ו-Sleep Threshold
- כתיבת סקריפטים לעורך להחלפה אצווה ואוטומציית ולידציה
- פרופיל חוזר ודוח עם הפרש ביצועים
- מתן תיעוד והדרכת צוות לשמירה על האופטימיזציה
שלבי עבודה
- פרופיל — צילום Physics Profiler, זיהוי צווארי בקבוק.
- ביקורת סצנה — מלאי של כל הקוליידרים, סיווג לפי סוג ועלות.
- אופטימיזציה — החלפת MeshCollider בפרימיטיבים/Compound, כוונון Layer Matrix, Sleep Threshold.
- כלי אוטומציה — סקריפטים לעורך להחלפה אצווה וולידציה.
- פרופיל חוזר — השוואה לקו הבסיס, תיעוד שינויים.
| היקף סצנה | ציר זמן משוער |
|---|---|
| סצנה אחת עד 500 אובייקטים | 3–7 ימים |
| מספר סצנות, 1000–3000 אובייקטים | 2–4 שבועות |
| פרויקט גדול עם כלים אוטומטיים | 1–2 חודשים |
העלות מחושבת לאחר פרופיל והערכת היקף השינויים. צרו קשר — נבחן את הפרויקט שלכם ונציע תוכנית אופטימיזציה. הזמינו פרופיל היום: הצוות שלנו מבטיח 90 FPS יציבים לאחר השיפורים.





