Використання простою в покрокових (RPG) іграх для оновлення


9

Якщо ви берете будь-яку гру по рольовій грі, буде великі періоди часу, коли нічого не відбувається, тому що гра перекидається на 'wait_for_player_input'. Природно, здається, розумно використовувати цей час для оновлення речей.

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

loop:  
if not check_something_pressed:  
    update_a_very_small_amount  
else  
  keep going

Але якщо ми кажемо, що "a_very_small_amount" оновлює лише один об'єкт у кожному циклі, оновлення буде дуже повільним.

Як би ви зробили це, бажано, в одну нитку?

EDIT: Я позначив цю мову-агностик так, як це здається розумним, хоча все, що більш конкретне для Python, було б чудово. ;-)

Друга редакція: Ця гра не планує мати анімовані компоненти; тобто в даний час я запускаю його як введення чекаючого гравця, потім оновлюю все і малюю. Тому замість X FPS це залежить від швидкості користувача.

Відповіді:


7

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

Скажімо, ви орієнтуєтесь на 60 FPS для своєї гри. Це дає вам 16,667 мс для виконання всіх робіт, необхідних для виконання кожного кадру. На початку гри отримайте поточний час, використовуючи таймер найвищої роздільної здатності, додавайте до нього 16,667 мс та зберігайте його кудись. Я думаю, що функція в python - це час (), хоча минулий час я працював у мові. Після завершення обробки введіть цикл, який перевіряє поточний час та час, який ви записали. Якщо поточний час менший, ніж час закінчення кадру, update_a_very_small_amount. Я б не хвилювався над тим, що обробка пройде в кінці кадру, оскільки ваше невелике оновлення повинно швидко оброблятися. Це буде лише невелика затримка до початку наступного кадру, і, здається, у вас є достатньо часу в режимі очікування, щоб впоратися з ним.

Після завершення обробки кадру додайте 16,667 мс до часу, який було збережено до кінця останнього кадру, щоб з’ясувати, де має бути кінець наступного кадру. Якщо ви використовуєте поточний час + 16,667 мс, і обробка закінчується, кінець наступного кадру буде витіснений стільки часу, скільки минув останній кадр.

Re: Друга редакція

Для уточнення я використовую тут термін frame-rate для позначення однієї ітерації через основний цикл. Якщо це базується на швидкості введення користувача, я думаю, що ваша мета - просто зробити гру чуйною. В іншому випадку ви можете просто перевірити вхід і оновити все щоразу через цикл, навіть якщо для цього знадобиться 10 секунд. Щоб почувати себе чуйним, ви, ймовірно, захочете перевірити на вхід близько 20 разів на секунду, що дає ефективну частоту кадрів у 20 FPS, навіть якщо ви фактично не малюєте ці кадри. Це дасть вам 50 мс для оновлення речей, перш ніж потрібно ще раз перевірити введення даних.


2

Спеціально для Python ви можете спробувати використовувати Coroutines для обчислень у кількох викликах оновлення.

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

PEP-0342 детально реалізує програму кореневих програм у Python.

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


1

Так, це можливо. У вашій грі буде якийсь основний цикл гри. Щось на зразок цього:

while(gameRunning)
{
  checkUserInput()
  updateGame()
  renderGame()
}

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

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

У більшості випадків вам не потрібно турбуватися про те, що виклик updateGame триватиме занадто довго.

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


1

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

Основна інфраструктура - це перелік функціональних покажчиків, які всі викликаються в кругообіг (якщо не потрібно більш складної пріоритетності), і всі ці функції виконають "трохи роботи", достатньо малу, щоб не спричинити гру стати млявим. Я робив це в DOS до того, як потоки були гарячими, а також на мобільних пристроях, які не підтримували потоки.

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

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

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