Чи обов’язкова для простих ігор окрема нитка для ігрового циклу?


10

Я новачок у розробці ігор. Для того, щоб навчитися, я відтворюю цю гру на платформі android. Ви можете спостерігати за ігровим відео за вищенаведеним посиланням. Це проста гра.

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



Не впевнений, що це дублікат, оскільки мова йде про Android. Є деякі інші міркування щодо нарізання різьби на платформі на базі Java, які відрізняються від цього питання.
Шон Міддлічч

Відповіді:


8

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

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

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

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


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

Отже, ви не запитуєте, чи потрібна петля? Ваша головна стурбованість - якщо вона має бути на окремій нитці, правильно?
AturSams

1
правильно. моє запитання стосується нитки, а не циклу. для такої простої гри (хоча мені пощастить зробити таку гру) чи потрібно мені породити нову нитку чи все можна зробити на головній темі?
Джин

1
Ні, це не потрібно. Поки у вас є цикл , тоді не потрібно створювати другий цикл .

@jin, ти дійсно повинен змінити назву та те, як ти потім пишеш своє запитання.
валентин

5

Ні , окрема нитка не потрібна. Якщо ви не робите нічого надто інтенсивного (що не виглядає так, як це було в грі, яку ви нам показали), все можна зробити в основному потоці.

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


Відповідаючи на оригінальне запитання "Чи потрібна петля".

Ні , але альтернативи складніші, складніші у виконанні та рідкісні.

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

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

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


Єдиний раз, коли я стикався з перериваннями нижчого рівня, це коли було виконано певне завдання HW і потрібно було повідомити процесор / ОС, щоб вони могли їх правильно обробити (зчитування даних з диска в пам'ять, а потім сповіщення, що вони готові, щоб ми могли повернутися контроль над програмою і дозволяючи їй обробляти її), тому я не знаю, що ви маєте на увазі, і просто неправильно її витлумачив.
AturSams

2

Відповідь на власне запитання (чи повинен цикл гри міститися в окремому потоці):

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

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

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

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

Деякі рамки заохочують / вимагають від вас використовувати та базуватись на подіях / перериваннях систем, як ActionScript3.0. У такому випадку код циклу зазвичай йде на OnEnterFrameподію чи щось подібне, що відбувається 20 - 60 або 120 разів за секунду.


Відповідь на оригінальне запитання (чи потрібен мені основний цикл):

Це все зводиться до лічильника програми . Якщо ви створюєте гру, яка запускатиме більше заздалегідь визначеної кількості часу і не генерує код у процесі, вам потрібно буде ласка просити ПК, щоб він повторив деякі інструкції, які він уже обробив, і що, можливо, зміниться в тим часом - стан (значення, що зберігаються в ігрових об'єктах та глобальних).

Оскільки ви знаєте, що вам потрібно буде повторити інструкції, існує кілька способів виконати це завдання та постійно обробляти одні й ті ж інструкції. Усі ці методи передбачають переміщення лічильника програми назад до відповідної інструкції. Найпоширеніші оператори управління потоком, які призводять до повторення коду, називаються циклами, інше - це gotoтвердження, яке рідко використовується в сучасному коді і має подібний ефект у цьому випадку (абсолютно не стосується вас).

Отже, щоб відповісти на ваше попереднє запитання, чи потрібна вам петля? Так ти зробиш.


1
Наскільки я знаю, фреймворки на основі подій, як AS3, все ще мають ігровий цикл, який працює під ним. Я говорю про переривання нижчого рівня, а не про рамки, які реалізують систему подій.
MichaelHouse

Хм .. Я не думаю, що люди часто використовують перерви нижчого рівня в іграх. AFAIK вони в основному використовуються процесором для моніторингу операцій вводу-виводу. Я думав про абстракцію вищого рівня як практику проектування, коли ви відповідаєте на введення користувачем або апаратну діяльність (без опитування), а не виконуючи кілька інструкцій у кожному кадрі, а потім повідомляєте HW надати результат.
AturSams

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

Я погоджуюся з @ Byte56, він зводиться до циклу, якщо тільки ми не говоримо про події на рівні ядра, які використовують переривання IO.
concept3d

1
Я знаю, що, але більшість всього, що ми робимо, є однаковим під поверхнею (як я вже сказав, змінюючи значення лічильника програми). Це не секрет, і я це вказав у відповіді. Програмування на основі подій, здавалося б, відрізняється тим, що ми переміщуємо лічильник програм на різні функції, коли відбуваються різні події. Очевидно, існує певне опитування в циклі, щоб перевірити, чи відбулися ці події нещодавно, але як принцип дизайну він, здається, відрізняється.
AturSams

0

Для того, щоб додати тут відповіді інших людей, те, про що ніхто прямо не згадував: Якщо ви ризикуєте запустити ігровий цикл у другій нитці, і він стане невідповідним, ви ризикуєте ОС припинити свою програму. Ось чому рекомендується використовувати окрему нитку. Звідси (наприклад) NDK native_app_glue.c/ .hпороджує окрему нитку для вашого циклу.

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