Странные артефакты при рендеринге большого количества растровых изображений - PullRequest
0 голосов
/ 01 июля 2011

Я пишу простой движок 2D-игр и отрисовываю различные объекты в заблокированном SurfaceVew, вызывая Canvas.drawBitmap (все то же исходное растровое изображение, но обычно не с масштабированием от 1 до 1 от источника к месту назначения).

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

Приложение структурировано следующим образом (упрощено для примера);

initialiseGameObjects();

while(quit==false)
{
 processGameLogic(); // update object positions
 Canvas c = surface_holder.lockCanvas();
 if (c != null) {
  drawGameObjects(c); // draw all objects
  surface_holder.unlockCanvasAndPost(c);
 }
}

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

Кто-нибудь знает, что может происходить?

С уважением, Стив

1 Ответ

0 голосов
/ 01 июля 2011

Вам необходимо синхронизировать вызовы для рисования на холсте.Проверьте этот пример игрового потока: OnDraw () не запущен, в SurfaceView ничего не отображается - Android

РЕДАКТИРОВАТЬ: Однако я думаю, что это может быть связано с этой проблемой: Android SurfaceView / Canvas мерцает после попытки его очистки

...