Эффективное рисование 2D в Android - PullRequest
5 голосов
/ 04 августа 2010

Я искал довольно много часов и не смог найти краткого и точного ответа на мой вопрос. У меня есть приложение, в котором мне нужно нарисовать спортивное поле (включая все линии тангажа) на экране. До сих пор я расширил SurfaceView и в значительной степени скопировал и остальную часть демонстрации LunarLander. Все данные, которые требуются приложению для отображения шага в правильных размерах, поступают из сокета, который тоже работает нормально. Однако в минуту в функции onDraw () я рисую все линии в каждом кадре, что вызывает довольно медленную частоту кадров в эмуляторе (например, ~ 10 кадров в секунду). Вот моя функция onDraw ():

@Override
public void onDraw(Canvas canvas) {
canvas.drawARGB(255,0,144,0);
canvas.drawLine(canvas, getFirstLine(), mPaint);
canvas.drawRect(canvas, getFirstRect(), mPaint);
canvas.drawRect(canvas, getSecondRect(), mPaint);
...
canvas.drawRect(canvas, getSecondRect(), mPaint);
drawAnimatedObjects();
}

Затем я рисую круги и различные позиции на этом фоне. Мой вопрос: как мне сделать это более эффективным? Есть ли способ, которым я могу рисовать линии при инициализации приложения и не нужно перерисовывать их каждый кадр?

Спасибо за любую помощь.

Ответы [ 2 ]

12 голосов
/ 04 августа 2010

Вы определенно должны кэшировать любой рисунок холста, который не изменится на растровое изображение во время инициализации, а затем нарисовать это растровое изображение в onDraw ().Это поможет сделать много раз.Что-то вроде:

Bitmap mField = null;

void init()
{
  mField = new Bitmap(...dimensions...);
  Canvas c = new Canvas(mField);
  c.drawRect(...);
  ...
}

void onDraw(Canvas c)
{
  c.drawBitmap(mField);
}
0 голосов
/ 04 августа 2010

Ваше спортивное поле статично или прокручивается по экрану? Если он статичен, вы должны создать его один раз и сохранить как изображение, которое будет перерисовываться каждый раз. Другое дело: эмулятор очень медленный по сравнению с современными устройствами. Вы должны проверить свою производительность по крайней мере на G1 или позже, чтобы проверить реальную производительность.

...