Choppy Image в многопоточной андроид игре - PullRequest
0 голосов
/ 17 апреля 2011

Я решил преобразовать свою 2D-игру на основе спрайтов для Android, чтобы использовать opengl-es, чтобы помочь с некоторыми проблемами с частотой кадров, связанных с визуализацией. В настоящее время настройка выглядит следующим образом:

Рендеринг выполняется в собственном потоке с режимом рендеринга, установленным на непрерывный. Обновление игровой логики происходит в отдельной цепочке. Оба потока взаимодействуют с синхронизированным классом блокировки, что гарантирует, что они никогда не касаются игровой информации одновременно.

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

Я полагаю, что это, вероятно, связано с отсутствием согласованности в количестве обновлений, которые происходят между каждым рендером, в среднем в два раза больше обновлений, потому что на данный момент в обновлении происходит не так уж много. Но этому не хватает согласованности, поэтому иногда 1 проходит, иногда 2, 3 и т. Д., Поэтому различие в позициях вытягиваемых элементов также не согласовано, что создает неравномерность.

У кого-нибудь есть идеи, как мне это исправить? Поток обновления регулируется до 60 раз в секунду со сном ... может быть, что-то подобное должно происходить при рендере? Я просто не уверен в этом.

1 Ответ

1 голос
/ 17 апреля 2011

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

...