Чому я завжди повинен розглянути можливість створення та використання пулів об’єктів, а не інстанціювати новий об'єкт на льоту?


25

Я читав про цю закономірність кілька разів (з точки зору кращих практик):

Виділення пам'яті : Замість того, щоб миттєво створювати новий об’єкт під час руху, завжди розглядайте питання про створення та використання пулів об’єктів. Це допоможе зменшити фрагментацію пам'яті та змусить роботу сміттєзбірника менше.

Однак я не знаю, що це насправді означає. Як я можу це реалізувати?

Наприклад, я можу створити інстанцію за GameObjectдопомогою Instantiateметоду Єдності?

Instantiate(prefab, new Vector3(2.0F, 0, 0), Quaternion.identity);

Чи не рекомендується це використання? Що ще це може означати?


Перше посилання на Google;) юни3d.com
fr/learn/

Дякую Геллію, я не переглянув дане відео (занадто велике), але текст справді допомагає мені зрозуміти "Акти про інстанціювання та знищення неефективні і можуть уповільнити ваші проекти"
Мухаммед Файзан Хан,

1
Зауважте, що хоча ця рада є загальною, вона не є абсолютною вимогою для кожної гри. Особливо, якщо ви робите невелику / коротку настільну гру, подачу варення або прототип, вам не потрібно виходити зі шляху для впровадження об'єднання. У моїх тестах на замочування Unity витримує навіть масові нерести та знищення краще, ніж ми це заслуговуємо. ;) Але розглядайте об’єднання, якщо ви робите довгу гру, де ви не хочете, щоб сміття накопичувалося і не викликало заїкання, коли воно збирається пізніше, або якщо ви орієнтуєтесь на мобільні платформи, де будь-який вплив на продуктивність відчувається більш резко.
DMGregory

Дякую @DMGregory Ви маєте рацію. Ваш вклад завжди цінний. Ми не повинні турбуватися про об'єднання об'єктів у невеликих іграх, оскільки це потребує додаткової роботи в кодуванні.
Мухаммед Файзан Хан

1
Це дуже поширена закономірність, але обов’язково загартовуйте її правилом: "Спочатку профіліруйте, потім оптимізуйте". Оптимізувати речі, які не мають значення, легко.
Корт Аммон - Відновіть Моніку

Відповіді:


41

Якщо ви плануєте інстанціювати багато примірників одного збірника, вам обов'язково варто подумати про використання об’єднання об'єктів. Функція Instanttiate виклику Unity - це один із найпопулярніших методів оподаткування, який ви могли б здійснити.

Об'єднання об'єднань - це коли ви інсталюєте збірники перед їх використанням. Вони деактивуються негайно після інстанції та повторно активуються лише тоді, коли вони знадобляться. Хоча це збільшує використання пам'яті, це дозволяє уникнути накладних витрат процесора під час ігрового процесу.

Наприклад, зараз я працюю над грою в пекельну кулю, яка вимагає, щоб сотні куль були породжені під час виконання. Я спочатку намагався зробити гру без об'єднання об'єктів, але це в результаті стало катастрофою (менше 2 кадрів в секунду). Тепер я набираю 500 куль до початку гри, і гра напрочуд швидко (200 кадрів в секунду).

Бувають ситуації, коли об'єднання об'єктів неможливо використовувати. Наприклад, якщо у вас є гра, в якій введення гравця диктує, що породжується збірна збірка, то, можливо, у вас нічого не буде, як використовувати звичайний Instantiate call. Об'єднання об'єктів можливе лише тоді, коли ви заздалегідь знаєте, які об’єкти знадобляться.

Підручник YouTube Себастьяна Лаге - чудовий ресурс для вивчення об’єднання об'єктів: https://youtu.be/LhqP3EghQ-Q


"Акти про інстанціювання та знищення неефективні і можуть уповільнити ваші проекти". це причина? Отже, це означає, що нам доведеться зашифрувати трохи більше (наприклад, активувати деактивні дії або встановити положення кулі знову, щоб ми могли знову стріляти)
Мухаммед Файзан Хан,

12
Можливо, варто згадати розподіл та вивезення сміття як головний внесок у вартість повторних інстанцій та знищення. Утворіть достатню кількість сміття і врешті-решт вся гра повинна дочекатися, коли сміттєзбірник все це змітає. ;)
DMGregory

3
@corsiKa це буде оптимізацією епохи 80-х. Unity може просто деактивувати спірний збірник, змушуючи його системи ігнорувати його.
congusbongus

2
"Наприклад, якщо у вас є гра, в якій введення гравця диктує, що саме породжується збірна збірка, то, можливо, у вас не буде іншого вибору, як використовувати звичайний Instantiate call." - Не зовсім. Ви можете легко мати кілька об'єктів пулів для різних збірних файлів, призначених для потрібних розмірів при запуску (або завантаженні сцени). Або, якби хтось хотів це зробити, може також працювати об'єктний пул, який зберігає кілька типів збірних.
Етан Бірлен

1
@DMGregory У типовому середовищі GC де-розподіл складає більшу частину витрат; у типовому середовищі, що не належить до GC, розподіл становить більшу частину витрат. Об'єднання об'єднань чудово підходить для обох, здебільшого вони просто дві сторони однієї і тієї ж монети. У крайньому випадку, старі ігри писалися з усіма об'єктами, "виділеними" з початку руху, - дуже мало або взагалі де / виділення пам'яті під час роботи гри. Ви насправді не використовували нічого, що певним чином не було "об'єднано". Оскільки Unity використовує багато "метаданих" у режимі реального часу, об'єднання може допомогти трохи - хоча це також може бути складніше в реалізації.
Луань
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.