Попередній час завантаження гри порівняно з часом завантаження гри


9

Я розробляю гру, в яку включений випадковий лабіринт.
Є якісь AI істоти, ховаючи лабіринт. І я хочу, щоб вони йшли якоюсь стежкою відповідно до форми лабіринтів.

Тепер для мене є дві можливості здійснити це. Перший спосіб (який я використав) - це обчислення кількох розшукуваних ховаються шляхів, коли лабіринт буде створений.
Другий - це обчислення шляху, який потрібно раз обчислити, коли істота почне його переховувати.

Моя головна турбота - це час завантаження. Якщо я обчислюю багато шляхів при створенні лабіринту, час попереднього завантаження трохи довгий, тому я подумав про їх обчислення, коли це було потрібно.
На даний момент гра не є «важкою», тому обчислення шляхів у середині гри не помітно, але я боюся, що колись вона ускладниться.

Будь-які пропозиції, коментарі, думки допоможуть вам.

Редагувати:

Що стосується тепер, нехай pбуде кількість попередньо обчислених шляхів, істота має ймовірність 1/pвзяти новий шлях (що означає розрахунок шляху) замість існуючого.
Істота не запускає свій патруль, доки звичайно не розрахований шлях, тому не потрібно турбуватися про те, що він загине в процесі.


8
На даний момент це було б попередньо оптимізувати. Я б залишив це так, як є, доки не виникне проблема.
Джон Макдональд

3
І трохи задзвонювати за допомогою @JohnMcDonald, якщо ви можете обчислити ці шляхи в середині гри та її не помітно, на скільки може сприяти коефіцієнт, що сприяє їх завантаженню?
Джеймс

Відповіді:


6

BerickCook правильно висловив цю ідею. Залиште обчислення там, де вони є, якщо зараз працюють належним чином.

Якщо ви можете зробити розрахунок раніше, і ви впевнені, що вони вам не знадобляться в середині гри, тоді робіть це раніше. Ще робити це після завантаження. Якщо підрахунок під час гри непомітний, ви можете це зробити там. Якщо в якийсь момент складність розвивається і розрахунки стають занадто важкими, починайте оптимізувати.

Але одне: якщо ваші обчислення реалізовані для запуску середньої гри, ви завжди можете змусити їх виконуватись під час завантаження.

Є численні рішення:

  • обчислювати / завантажувати контури під час створення / завантаження рівня
  • використовуйте другу нитку для обчислення шляхів
  • оптимізуйте свої алгоритми
  • використовуйте систему переривання, якщо у вас немає доступу до нарізування різьби.

Я бачив і використовував останній варіант у грі на масовому ринку. Просто переконайтеся, що ви належним чином зберігаєте всі дані, необхідні для розрахунку, щоб відновити, і регулярно перевіряйте, чи залишився час / операції під час розрахунку.

Залежно від вашого випадку, система переривання може дати попередні та часткові рішення, які можуть бути використані події до закінчення розрахунку.


Редагувати : відповісти @Keeper

"Алгоритм переривання" був корисним лише через обмеження, які ми мали. В основному ми палітувались до відсутності багатопотокової чистки.

Одного разу у нас була гра, де AI довелося обчислювати велику кількість рухів на основі декількох словників. Під час цього розрахунку вся анімація припиниться, оскільки словники розширювались із більшою кількістю даних, а набір даних, що містять дані, був змінений та менш ефективний, коли гра була адаптована для мультиплеєра (де AI довелося взаємодіяти навіть для руху гравця). Для циклу ігор у нас був лише один потік (обов'язковим є те, що мультиплатформенний код повинен працювати на всіх підтримуваних платформах). У цей момент було вирішено порушити алгоритм обчислення, щоб ми могли його перервати. Тому ми не могли просто використовувати рекурсивну систему, яка була на місці, оскільки змінні не вдалося зберегти. Функції були замінені об'єктами, які просто містили всі необхідні змінні та покажчики на батьківські та дочірні об’єкти. Я не '

  • зберегти статус його поточних обчислень
  • переривати або в кінці циклу, або під час циклу (коли дочірній об’єкт перериває)
  • вихід, коли час минув
  • відновити там, де він зупинився, або перезапустивши цикл у правій індекс, або викликавши дочірній об’єкт, який зараз знаходиться у верхній частині дочірнього стека.
  • очистити все, якщо обчислення перервано
  • дають найкращий частковий результат.

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

Ми втратили продуктивність, але сприйнята ефективність була набагато кращою для користувача, оскільки анімація плавно працювала на всіх платформах, тоді всі платформи могли використовувати більші словники, не страждаючи від похмурої анімації чи заморожування. Також це дозволило нам запускати кілька екземплярів паралельно, коли нам це було потрібно пізніше.

Звичайно, зараз на iPhone і iPad грі це не потрібно, використання ідеї другого варіанту було б ідеально. Але я підозрюю, що код все ще є.


Дякую, це звучить дуже цікаво. Чи можете ви, будь ласка, детальніше розказати про поняття "переривна система" (чому і як). (гуглившись, це було не так корисно ..). Додамо деякі деталі до питання.
Хранитель

@Keeper Я сподіваюся, що я відповів на ваше запитання про переривчасту частину. Це біль у тому, що потрібно робити, і це не стосується більшості сучасних систем.
Койот

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

8

Наразі, оскільки обчислювати шляхи в середині гри непомітно, це ідеальний підхід. Якщо / коли він дістанеться до точки, коли геймплей переривається обчисленнями, переключіть його на обчислення шляхів до завантаження рівня.

Більш тривалі початкові періоди завантаження є простими, але випадкові коливання FPS під час гри зазвичай не є.


2

Однією з можливих можливостей є переміщення обчислень на другий потік, оскільки майже кожен ПК має більше одного ядра процесора в ці дні.

Основним процесом буде:

  • Коли істота запитує шлях, додайте запит у безпечну чергу запиту і передайте сигнал потоці.
  • Істота стоїть в режимі очікування, поки чекає, коли потік вискочить запис із цієї черги, обробить її та поставить її у завершений список.
  • Кожен кадр перевіряє завершений список з головної нитки та призначає істотам завершені шляхи.

Ви також повинні стежити за кількома додатковими кейсами (наприклад, що робити, якщо істота помирає до того, як запит буде оброблений).


2
Якщо ви не хочете вводити нитки, ви можете також поступово обчислювати свій шлях (наприклад, обчислюйте кілька кроків у кожному кадрі).
bummzack
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.