powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Проблема с разделением графики и логики в игре на потоки
17 сообщений из 17, страница 1 из 1
Проблема с разделением графики и логики в игре на потоки
    #39740840
amadeus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет. Пишу простую игру, есть разделение на графику и логику. Вся графика выводится в отдельном потоке со своим таймером, а логика рассчитывается в основном игровом потоке. Но есть в этом и своя проблема. Например, движение наискосок рассчитывается как движение вправо тут же вниз (это необходимо, понимаю, что с математической точки зрения неправильно); если бы графика выводилась после обработки логики, то все было бы нормально: персонаж рисовался бы в своей законной позиции, куда попал, двигаясь диагонально.

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

Как можно решить эту проблему, оставив разделение обработки логики и вывода графики на разные потоки? Причем, графика ничего не знает о самой игре, получается что-то вроде небольшого графического движка, который вообще не знает об игровой логике и не имеет доступа к игровым параметрам.
...
Рейтинг: 0 / 0
Проблема с разделением графики и логики в игре на потоки
    #39740855
Фотография Dimonka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
amadeus,

Я конечно может что-то не понимаю, но почему бы не сделать в логике "движение на искосок"?
...
Рейтинг: 0 / 0
Проблема с разделением графики и логики в игре на потоки
    #39740862
amadeus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimonka , вопрос здесь больше не в том, как лучше реализовать движение, а в том, как правильно синхронизировать графическую и логическую части, чтобы они остались максимально независимы друг от друга. Сделаю я движение наискосок (это не проблема, если будет такая необходимость) - появятся другие проблемы.
...
Рейтинг: 0 / 0
Проблема с разделением графики и логики в игре на потоки
    #39740868
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
amadeusКак можно решить эту проблему, оставив разделение обработки логики и вывода графики на
разные потоки?

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

Ну или тупо обноси "многоходовочки" критической секцией/мутексом.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Проблема с разделением графики и логики в игре на потоки
    #39740906
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
amadeusСделаю я движение наискосок (это не проблема, если будет такая необходимость)

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

PS: Кстати, целочисленные координаты персонажа - ошибка. Если только ты не пишешь
олдскульную игру, где все прыгают по квадратным клеточкам.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Проблема с разделением графики и логики в игре на потоки
    #39741046
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНе сможешь. Нет атомарной операции (x,y) += (dx,dy).Легко! Использовать одномерный массив, где каждые N отсчетов - новая строка
...
Рейтинг: 0 / 0
Проблема с разделением графики и логики в игре на потоки
    #39741052
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
а нахрена вообще отдельные потоки ?
Цель какая этого ?
...
Рейтинг: 0 / 0
Проблема с разделением графики и логики в игре на потоки
    #39741082
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да уж.
"Простую" игру незачем бить на потоки.
...
Рейтинг: 0 / 0
Проблема с разделением графики и логики в игре на потоки
    #39741100
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот пара моих "простых" игр.
Многопоточность (кромя аудио-потоков) им не требовалсь даже 15 лет назад, когда они были написаны.

http://www.rgreat.ru/tmp/Games/NukeWar/NukeWar.exe
http://www.rgreat.ru/tmp/Games/SpaceWar/SpaceWar.exe
...
Рейтинг: 0 / 0
Проблема с разделением графики и логики в игре на потоки
    #39741106
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatМногопоточность (кромя аудио-потоков) им не требовалсь даже 15 лет назад, когда они были написаны.
А теперь процы для домашних компов 16-ядерные делают, теперь требуется!
Надо же, чтобы эти процы были чем-то загружены!
Тем более, битка просела. Чем же еще загружать теперь, как не "графическими потоками" игр.
...
Рейтинг: 0 / 0
Проблема с разделением графики и логики в игре на потоки
    #39741111
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockА теперь процы для домашних компов 16-ядерные делают, теперь требуется!
Надо же, чтобы эти процы были чем-то загружены!Винда найдет чем их загрузить и без нас.
...
Рейтинг: 0 / 0
Проблема с разделением графики и логики в игре на потоки
    #39741176
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatYuRockА теперь процы для домашних компов 16-ядерные делают, теперь требуется!
Надо же, чтобы эти процы были чем-то загружены!Винда найдет чем их загрузить и без нас.

Тем более. Чтобы майкрософту своё личное процессорное время время не оставлять.
...
Рейтинг: 0 / 0
Проблема с разделением графики и логики в игре на потоки
    #39741213
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatВот пара моих "простых" игр.
Многопоточность (кромя аудио-потоков) им не требовалсь даже 15 лет назад, когда они были написаны.

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

SpaceWar зачет! Играл целый час на работе :)
...
Рейтинг: 0 / 0
Проблема с разделением графики и логики в игре на потоки
    #39741229
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КвейдSpaceWar зачет! Играл целый час на работе :)
...
Рейтинг: 0 / 0
Проблема с разделением графики и логики в игре на потоки
    #39741257
L1G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
amadeusесли бы графика выводилась после обработки логики, то все было бы нормальноне понимаю, какой вообще смысл выводить не готовую (не просчитанную до конца) картинку???

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

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

скорее всего, нужен double buffering - два набора данных для построения кадров: пока графика выводит один, логика обновляет данные в другом.
...
Рейтинг: 0 / 0
Проблема с разделением графики и логики в игре на потоки
    #39741279
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще вариант - координаты объекта должны быть не значением а функцией от времени.
...
Рейтинг: 0 / 0
Проблема с разделением графики и логики в игре на потоки
    #39741318
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
золотые слова )
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Проблема с разделением графики и логики в игре на потоки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]