1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Пожалуйста, внимательно прочитайте правила раздела.
  3. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление

Реализация основного игрового цикла (game loop)

Тема в разделе "Мастерская", создана пользователем Kristobal Hozevich Hunta, 7 янв 2010.

  1. Kristobal Hozevich Hunta Реликтовый гоминид

    Kristobal Hozevich Hunta

    Регистрация:
    24 апр 2006
    Сообщения:
    1.207
    Под сабжем понимать это.

    Для начала под real mode (RM).

    Допустим, мне нужно опрашивать клавиатуру, писАть в несколько "окон" видеопамяти, просчитывать модель игрового поля в реальном времени и что-нибудь еще. При этом, например, объект типа "пушка" может породить много новых объектов типа "снаряд", т.е. одна задача генерирует другие и их тоже нужно ставить в очередь на обработку.

    Вопрос - а как оно реализовано? Какой принцип?

    Имеется сильно усечённый алгоритм реализации многозадачности в RM - программный аналог переключения задач в PM.

    В памяти строим структуру, каждой задаче (опрос клавы, запись в окно) выделяется своя запись. Формат каждой записи обязательно предусматривает флаг готовности, число приоритета и указатель на стек задачи. Переключение задач реализовано через стек, где каждой задаче выделена своя область для сохранения/восстановления контекста (регистров в общем случае).

    На таймер цепляется маленький диспетчер-резидент. Прерывание от таймера передает управление с текущей задачи на него. Нормальный обработчик в этом случае возвращает выполнение откуда взял - в текущую задачу. А вот диспетчер, быстренько пробежав по структуре и проанализировав состояние флагов и приоритетов, может приостановить текущую задачу и передать выполнение следующей.

    Вобщем, реверс-инженеринг алгоритма почти завершен :)
    Неясно, причем тут приоритеты. Пока понимаю так:

    1. Задача отработала, обнулила свой флаг готовности, установила его для следующей задачи.

    2. Диспетчер прочитал - переключил задачи.

    3. Перейти к пункту 1.

    Дальше вот что-то пока неясно. Сравнивать значения приоритетов и выстраивать отдельную очередь на исполнение? А если в процессе параметры меняются?

    Ну и потом - что-то сложновато выходит для просто игры. Какие тут могут быть варианты? И, кстати, пункты 1-3 есть обычный цикл, к чему ж городить огород с таймерами, резидентностью и прочими семафорами? Есть у этой идеи какие-нибудь преимущества?
     
    Последнее редактирование: 7 янв 2010
  2.  
  3. Nil Любимый цвет — голубой

    Nil

    Регистрация:
    30 апр 2007
    Сообщения:
    1.974
    Kristobal Hozevich Hunta, А ничего, что Real mode устарел? иди лучше под SDL делать, там не проще на самом деле.
     
  4. Kristobal Hozevich Hunta Реликтовый гоминид

    Kristobal Hozevich Hunta

    Регистрация:
    24 апр 2006
    Сообщения:
    1.207
    Пускай себе. На высокоуровне можно эффективно работать. А на асме... там железо... оно гудит :)
     
  5. Steel Rat Stainless

    Steel Rat

    Регистрация:
    28 дек 2006
    Сообщения:
    3.260
    Я делал только один таймер для РТС типа Дюны 2/Warcraft. Всё остальное выполнялось как только до него доходила очередь. До релиза, конечно, не дошло, но медведи и мечники среди лесов шастали. =)
     
  6. Quasist

    Quasist

    Регистрация:
    11 май 2008
    Сообщения:
    841
    Может вначале стоит предположить и соотнести время выполнения задач, чтобы определить актуальность подхода?

    Мне кажется проще всё же постаринке:

    1.игровой цикл отрисовывает кадр
    2.ждём до начала следующего кадра(1000/CONSTANT_FPS милисекунд)
    3.го 1

    А в самом цикле по очереди всё как в вики и вызывается.

    Идея приоритетов для задач весьма интересна.
    К примеру, приоритет чтения устройств ввода пропорционален количеству монстров на экране :)
     
    Последнее редактирование: 9 янв 2010
  7. Alex Kagansky

    Alex Kagansky

    Регистрация:
    17 дек 2007
    Сообщения:
    3.054
    Мне это сильно напоминает сопрограммы или зеленые потоки - в некоторых языках программирования это есть в уже готовом виде. Правда, опыта в программировании именно игр у меня нет.
     
  8. Kristobal Hozevich Hunta Реликтовый гоминид

    Kristobal Hozevich Hunta

    Регистрация:
    24 апр 2006
    Сообщения:
    1.207
    Не предавай забвению - покажи хоть картинок :)

    Да знаешь, ваяется под чистым ДОСом в эмуле, на fasm с отладкой под debug, td и hiew. Дилетантство конечно полнейшее. Я фактически даже не знаю, как в таких условиях фпс мерять.

    Alex Kagansky, ну, умные книжки упоминают Си и функции createq, writeq, readq, а также какие-то синхронизирующие примитивы. Этот раздел я не понял, а вот ассемблерный кусочек с удовольствием разобрал.

    Ладно, уточню вопрос. Берем Planescape (вчера ночью нашел в чулане), скажем, рыночную площадь. Встаем Безымянным в круг торговцев, не касаемся мыши, наблюдаем:

    - герой анимирован (дыхание, движение рук, тени, различные позы - скрещивание рук, поворот головы);
    - портрет героя анимирован (моргает);
    - NPC анимированы все (насчитывал до 10-15 одновременно движущихся объектов), время от времени перемещаются (бегают, встают в стойку и пр.), на головой фразы. одновременно могут открываться порталы;
    - анимация заклинаний дополнительно к всем прочим анимациям;
    - в нижнем правом углу движутся шестеренки.

    В любое время вся эта этажерка должна реагировать на действия игрока. Правда, заметил, в режиме диалога показывается статичная картинка (видимо, захват экрана, это как раз понять могу).

    Вот просто стало интересно - каков может быть алгоритм? Какие-то динамические списки отображаемых объектов?
     
    Последнее редактирование: 9 янв 2010
  9. MisterGrim Very old

    MisterGrim

    Legacy

    Регистрация:
    29 ноя 2007
    Сообщения:
    25.423
    Тут особых алгоритмов не надо: каждому объекту выделяется отдельная переменная, в которой хранится номер текущего кадра его анимации. После отрисовки всей картинки данные переменные увеличиваются на 1 (со сбросом в 0, если необходимо). Конечно, я очень сильно упростил, но общий смысл понятен.
     
    Dimouse нравится это.
  10. Dimouse King of Mice

    Dimouse

    Администратор Переводчик

    Регистрация:
    18 апр 2003
    Сообщения:
    35.163
    Я писал платформер с большим количеством одновременно анимированных объектов. Подтверждаю, что если делать один цикл просто отрисовывая каждое изменение анимации, как сказал MisterGrim, то ничего не тормозит, реагирует на клавиши сразу же. Правда это не под досом, а под аллегрой. Хотя под досом тоже писал, но там анимация была только у героя.
     
  11. tarasb

    tarasb

    Регистрация:
    14 июл 2007
    Сообщения:
    452
    Просто у каждого игрового объекта есть состояние и метод, то есть то действие, которое он должен совершить за такт игры, исходя из своего состояния и состояния других объектов.
    А дальше просто каждый такт каждый объект совершает это действие.
    Это если грубо.
    Если точнее - каждый такт игры состоит из нескольких стадий ("просчёт поведения" ,"просчёт попаданий", "просчёт хелсов", "отрисовка"), подтактов, и для каждого подтакта у каждого объекта есть своя специальная процедура.
    И каждый такт по очереди делаются подтакты, для каждого из которых каждый объект по очереди (очередь тоже может меняться в зависимости от ситуации) выполняет необходимое действие.
     
  12. Steel Rat Stainless

    Steel Rat

    Регистрация:
    28 дек 2006
    Сообщения:
    3.260
    Картинок можно видеть. Графика была стырена из польской игры Slaves или как-то так. А всё остальное, включая исходники, было накрыто ФАТом.
     
  13. Scorp Никто и звать меня никак

    Scorp

    Регистрация:
    21 апр 2005
    Сообщения:
    2.955
    Это только на хилых компьютерах актуально, в принципе. Сейчас можно делать в лоб и на бейсике, скорости хватает.
     
  14. MisterGrim Very old

    MisterGrim

    Legacy

    Регистрация:
    29 ноя 2007
    Сообщения:
    25.423
    Очень, очень опрометчивое заявление. В результате такого мнения мы имеем множество игрушек среднего качества, которые умудряются тормозить даже на топовых конфигурациях.
    Я не призываю всех перейти на ассемблер, но об оптимизации нужно помнить всегда.


    ---------- Добавлено в 03:33 ---------- Предыдущее сообщение было написано в 03:32 ----------


    Кстати, игрушки ещё ладно, но похоже, что весь софт пишется по такому принципу.
     
  15. John Freeman

    John Freeman

    Регистрация:
    13 май 2004
    Сообщения:
    14.241
    Без всякого изврата нынче варианты только winapi или один из стандартных либов никсов... Тут возникает только забавный тред о синхронизации потоков и о ядерных спинлоках, и это уже не зависит от количества ядер итд...
     
  16. Newbilius Программуль

    Newbilius

    Регистрация:
    24 авг 2007
    Сообщения:
    4.602
    Мммм... сколько разбирал игрушек под Windows (да и сам писал) всё очень банально - таймер на вызов всей игровой логики+отдельный поток на перерисовку... И никаких тормозов, никакого асма... Хм. Т.е. два потока, по сообщениям от системы.
     
  17. MisterGrim Very old

    MisterGrim

    Legacy

    Регистрация:
    29 ноя 2007
    Сообщения:
    25.423
    В DOS4GW-играх как-то обходились без всяких потоков, да и в нынешних Win32-играх зачастую обходятся — достаточно посмотреть таблицу импорта: далеко не везде даже CreateThread есть. Это всё ненужное усложнение, да и отладку значительно затрудняет. У Рихтера в «Windows для профессионалов» про это хорошо написано (цитата).
     
    Dimouse нравится это.
  18. Scorp Никто и звать меня никак

    Scorp

    Регистрация:
    21 апр 2005
    Сообщения:
    2.955
    Ммм... Честно говоря не очень понимаю, как один поток и один цикл на всё (ну разумеется кроме отрисовки экрана и курсора, а то тормозящая мышь это пц) сможет тормознуть топовую конфигурацию. Тут уже от ума программиста зависит, а не от количества потоков.
     
  19. MisterGrim Very old

    MisterGrim

    Legacy

    Регистрация:
    29 ноя 2007
    Сообщения:
    25.423
    Я про в лоб, на бейсике и «скорости хватит».
     
  20. Scorp Никто и звать меня никак

    Scorp

    Регистрация:
    21 апр 2005
    Сообщения:
    2.955
    Ну в лоб и на бейсике и скорости хватит предполагают мозг :)
     
  21. John Freeman

    John Freeman

    Регистрация:
    13 май 2004
    Сообщения:
    14.241
    Грим, учи матчасть... То что сейчас называется потоками как на одном процессоре реализуется?
     
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление