BerickCook правильно висловив цю ідею. Залиште обчислення там, де вони є, якщо зараз працюють належним чином.
Якщо ви можете зробити розрахунок раніше, і ви впевнені, що вони вам не знадобляться в середині гри, тоді робіть це раніше. Ще робити це після завантаження. Якщо підрахунок під час гри непомітний, ви можете це зробити там. Якщо в якийсь момент складність розвивається і розрахунки стають занадто важкими, починайте оптимізувати.
Але одне: якщо ваші обчислення реалізовані для запуску середньої гри, ви завжди можете змусити їх виконуватись під час завантаження.
Є численні рішення:
- обчислювати / завантажувати контури під час створення / завантаження рівня
- використовуйте другу нитку для обчислення шляхів
- оптимізуйте свої алгоритми
- використовуйте систему переривання, якщо у вас немає доступу до нарізування різьби.
Я бачив і використовував останній варіант у грі на масовому ринку. Просто переконайтеся, що ви належним чином зберігаєте всі дані, необхідні для розрахунку, щоб відновити, і регулярно перевіряйте, чи залишився час / операції під час розрахунку.
Залежно від вашого випадку, система переривання може дати попередні та часткові рішення, які можуть бути використані події до закінчення розрахунку.
Редагувати : відповісти @Keeper
"Алгоритм переривання" був корисним лише через обмеження, які ми мали. В основному ми палітувались до відсутності багатопотокової чистки.
Одного разу у нас була гра, де AI довелося обчислювати велику кількість рухів на основі декількох словників. Під час цього розрахунку вся анімація припиниться, оскільки словники розширювались із більшою кількістю даних, а набір даних, що містять дані, був змінений та менш ефективний, коли гра була адаптована для мультиплеєра (де AI довелося взаємодіяти навіть для руху гравця). Для циклу ігор у нас був лише один потік (обов'язковим є те, що мультиплатформенний код повинен працювати на всіх підтримуваних платформах). У цей момент було вирішено порушити алгоритм обчислення, щоб ми могли його перервати. Тому ми не могли просто використовувати рекурсивну систему, яка була на місці, оскільки змінні не вдалося зберегти. Функції були замінені об'єктами, які просто містили всі необхідні змінні та покажчики на батьківські та дочірні об’єкти. Я не '
- зберегти статус його поточних обчислень
- переривати або в кінці циклу, або під час циклу (коли дочірній об’єкт перериває)
- вихід, коли час минув
- відновити там, де він зупинився, або перезапустивши цикл у правій індекс, або викликавши дочірній об’єкт, який зараз знаходиться у верхній частині дочірнього стека.
- очистити все, якщо обчислення перервано
- дають найкращий частковий результат.
Тільки найдорожчі операції були розбиті на окремі об’єкти, і знадобився певний час, щоб знайти потрібні місця, де ми могли б зупинити обчислення, але в підсумку це працює дуже добре.
Ми втратили продуктивність, але сприйнята ефективність була набагато кращою для користувача, оскільки анімація плавно працювала на всіх платформах, тоді всі платформи могли використовувати більші словники, не страждаючи від похмурої анімації чи заморожування. Також це дозволило нам запускати кілька екземплярів паралельно, коли нам це було потрібно пізніше.
Звичайно, зараз на iPhone і iPad грі це не потрібно, використання ідеї другого варіанту було б ідеально. Але я підозрюю, що код все ще є.