Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Проблема с разделением графики и логики в игре на потоки  [new]
amadeus
Member

Откуда:
Сообщений: 15
Всем привет. Пишу простую игру, есть разделение на графику и логику. Вся графика выводится в отдельном потоке со своим таймером, а логика рассчитывается в основном игровом потоке. Но есть в этом и своя проблема. Например, движение наискосок рассчитывается как движение вправо тут же вниз (это необходимо, понимаю, что с математической точки зрения неправильно); если бы графика выводилась после обработки логики, то все было бы нормально: персонаж рисовался бы в своей законной позиции, куда попал, двигаясь диагонально.

Но так как графика выводится в отдельном потоке, иногда (и довольно часто) вывод персонажа попадает на тот момент, когда он пошел вправо, но еще не пошел вниз. В результате, получается некрасивое движение "ступеньками".

Как можно решить эту проблему, оставив разделение обработки логики и вывода графики на разные потоки? Причем, графика ничего не знает о самой игре, получается что-то вроде небольшого графического движка, который вообще не знает об игровой логике и не имеет доступа к игровым параметрам.
30 ноя 18, 13:38    [21749925]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделением графики и логики в игре на потоки  [new]
Dimonka
Member

Откуда:
Сообщений: 1125
amadeus,

Я конечно может что-то не понимаю, но почему бы не сделать в логике "движение на искосок"?
30 ноя 18, 13:51    [21749947]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделением графики и логики в игре на потоки  [new]
amadeus
Member

Откуда:
Сообщений: 15
Dimonka, вопрос здесь больше не в том, как лучше реализовать движение, а в том, как правильно синхронизировать графическую и логическую части, чтобы они остались максимально независимы друг от друга. Сделаю я движение наискосок (это не проблема, если будет такая необходимость) - появятся другие проблемы.
30 ноя 18, 13:56    [21749955]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделением графики и логики в игре на потоки  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 46374

amadeus
Как можно решить эту проблему, оставив разделение обработки логики и вывода графики на
разные потоки?

Снапшот игрового мира сделай. Логика подготавливает новый снапшот и отправляет его
графике. Графика сравнивает новый снапшот со своим старым и обновляет на экране
изменившиеся места. Тогда графика не сможет видеть мир в "промежуточных" состояниях.

Ну или тупо обноси "многоходовочки" критической секцией/мутексом.

Posted via ActualForum NNTP Server 1.5

30 ноя 18, 14:01    [21749963]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделением графики и логики в игре на потоки  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 46374

amadeus
Сделаю я движение наискосок (это не проблема, если будет такая необходимость)

Не сможешь. Нет атомарной операции (x,y) += (dx,dy). В любом случае ты будешь писать x +=
dx; y += dy; и несинхронизированный доступ из другого потока сможет вклиниться между ними.

PS: Кстати, целочисленные координаты персонажа - ошибка. Если только ты не пишешь
олдскульную игру, где все прыгают по квадратным клеточкам.

Posted via ActualForum NNTP Server 1.5

30 ноя 18, 14:20    [21750017]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделением графики и логики в игре на потоки  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10642
Dimitry Sibiryakov
Не сможешь. Нет атомарной операции (x,y) += (dx,dy).
Легко! Использовать одномерный массив, где каждые N отсчетов - новая строка
30 ноя 18, 16:00    [21750256]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделением графики и логики в игре на потоки  [new]
defecator
Member

Откуда:
Сообщений: 38961
а нахрена вообще отдельные потоки ?
Цель какая этого ?
30 ноя 18, 16:03    [21750268]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделением графики и логики в игре на потоки  [new]
rgreat
Member

Откуда:
Сообщений: 4584
Да уж.
"Простую" игру незачем бить на потоки.
30 ноя 18, 16:20    [21750309]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделением графики и логики в игре на потоки  [new]
rgreat
Member

Откуда:
Сообщений: 4584
Вот пара моих "простых" игр.
Многопоточность (кромя аудио-потоков) им не требовалсь даже 15 лет назад, когда они были написаны.

http://www.rgreat.ru/tmp/Games/NukeWar/NukeWar.exe
http://www.rgreat.ru/tmp/Games/SpaceWar/SpaceWar.exe
30 ноя 18, 16:29    [21750338]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделением графики и логики в игре на потоки  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3631
rgreat
Многопоточность (кромя аудио-потоков) им не требовалсь даже 15 лет назад, когда они были написаны.

А теперь процы для домашних компов 16-ядерные делают, теперь требуется!
Надо же, чтобы эти процы были чем-то загружены!
Тем более, битка просела. Чем же еще загружать теперь, как не "графическими потоками" игр.
30 ноя 18, 16:34    [21750353]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделением графики и логики в игре на потоки  [new]
rgreat
Member

Откуда:
Сообщений: 4584
YuRock
А теперь процы для домашних компов 16-ядерные делают, теперь требуется!
Надо же, чтобы эти процы были чем-то загружены!
Винда найдет чем их загрузить и без нас.
30 ноя 18, 16:37    [21750365]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделением графики и логики в игре на потоки  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3631
rgreat
YuRock
А теперь процы для домашних компов 16-ядерные делают, теперь требуется!
Надо же, чтобы эти процы были чем-то загружены!
Винда найдет чем их загрузить и без нас. Картинка с другого сайта.

Тем более. Чтобы майкрософту своё личное процессорное время время не оставлять.
30 ноя 18, 17:39    [21750506]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделением графики и логики в игре на потоки  [new]
Квейд
Member

Откуда: Kyiv, Ukraine
Сообщений: 5120
rgreat
Вот пара моих "простых" игр.
Многопоточность (кромя аудио-потоков) им не требовалсь даже 15 лет назад, когда они были написаны.

http://www.rgreat.ru/tmp/Games/NukeWar/NukeWar.exe
http://www.rgreat.ru/tmp/Games/SpaceWar/SpaceWar.exe


SpaceWar зачет! Играл целый час на работе :)
30 ноя 18, 18:26    [21750604]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделением графики и логики в игре на потоки  [new]
rgreat
Member

Откуда:
Сообщений: 4584
Квейд
SpaceWar зачет! Играл целый час на работе :)

Картинка с другого сайта.
30 ноя 18, 18:45    [21750639]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделением графики и логики в игре на потоки  [new]
L1G
Member

Откуда:
Сообщений: 80
amadeus
если бы графика выводилась после обработки логики, то все было бы нормально
не понимаю, какой вообще смысл выводить не готовую (не просчитанную до конца) картинку???

если в логике вообще есть понятие "кадра", то очевидно, что кадр должен рисоваться только по окончании его просчета логикой (тупо флаг готовности и т.п.) - если логика медленнее графики, нужно снижать частоту кадров, либо будут пропуски кадров с неприятным видимым эффектом подтормаживания.

очевидно, пока графика выводит один кадр, логика должна просчитывать уже следующий.

скорее всего, нужен double buffering - два набора данных для построения кадров: пока графика выводит один, логика обновляет данные в другом.
30 ноя 18, 19:21    [21750691]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделением графики и логики в игре на потоки  [new]
rgreat
Member

Откуда:
Сообщений: 4584
Еще вариант - координаты объекта должны быть не значением а функцией от времени.
30 ноя 18, 20:01    [21750730]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделением графики и логики в игре на потоки  [new]
krapotkin
Member

Откуда: Екатеринбург
Сообщений: 637
золотые слова )
30 ноя 18, 21:48    [21750796]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить