למה למחזר אובייקטים
חלק מהיחידה ארכיטקטורת משחקים ב-Unity במסלול ה-Unity של Coddy. שיעור 37 מתוך 50.
אקדח שיורה 10 כדורים בשנייה במשך דקה קורא ל־Instantiate 600 פעמים ול־Destroy 600 פעמים. כל קריאה ל־Instantiate מעתיקה את ה־prefab עם כל הרכיבים שלו ומפעילה את Awake, OnEnable ו־Start שלהם. כל קריאה ל־Destroy מפעילה את OnDisable ואת OnDestroy ומשאירה את הזיכרון של האובייקט כאשפה. אוסף האשפה של C# משחרר את הזיכרון הזה מאוחר יותר, והעבודה שלו מתבצעת בחלק מהפריימים ולא באחרים, מה שמתבטא בגמגום, בעיקר בטלפונים איטיים יותר.
מאגר שומר אובייקטים במקום להשמיד אותם. כדור שנורה מכובה באמצעות SetActive(false) וחוזר למאגר; הירייה הבאה לוקחת ממנו כדור ומדליקה אותו, ו־Instantiate נקרא רק כשהמאגר ריק. אחרי השניות הראשונות של הירי, הירי אינו יוצר שום דבר חדש ואינו משאיר אשפה. בשימוש חוזר, Awake ו־Start אינם מופעלים שוב: הם הופעלו פעם אחת, כשהאובייקט נוצר. כל מה שצריך להתחיל מחדש בכל שימוש, כגון טיימר, בריאות או מהירות, מאופס ב־OnEnable או באמצעות הקוד שלוקח את האובייקט.
שימוש במאגר משתלם עבור אובייקטים שנוצרים ומושלכים לעיתים קרובות: כדורים, ניצוצות, מספרי נזק ואויבים במשחק גלים. הוא לא משתלם עבור בוס שמופיע פעם אחת או תפריט שנפתח מדי פעם. מאגר שומר בזיכרון את האובייקטים הלא פעילים שלו כל הזמן, ולכן הוא מחזיק מספר הגיוני מהם ומשחרר את העודפים.
נסו בעצמכם
השיעור הזה לא כולל אתגר קוד.
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.