Android — масштабирование на лету быстрее, чем предварительное масштабирование, wtf?

#android #bitmap #scaling

#Android #растровое изображение #масштабирование

Вопрос:

Я пытаюсь запрограммировать свою первую игру для Android, которая содержит движущиеся круглые объекты с растровым изображением над ними.

Я декодирую png:

 moon=BitmapFactory.decodeResource(resources, R.drawable.moon);
  

Затем для каждого объекта Ball я делаю это в начале (они могут быть разного размера):

 scaledMoon=Bitmap.createScaledBitmap(game.moon, (int)(r*2), (int)(r*2), true);
  

И при рисовании на холсте я делаю это:

 c.drawBitmap(scaledMoon,x,y, null);
  

Делая это со 100 объектами, я получаю почти постоянное время рендеринга в 22 мс.

Но когда я делаю это вот так (без масштабирования раньше!)

 c.drawBitmap(game.moon, new Rect(0,0,game.moon.getWidth(),game.moon.getHeight()), new Rect((int)(x-r),(int)(y-r),(int)(x r),(int)(y r)), null);
  

Я получаю время рендеринга 17 мс…

При рисовании только круга

 c.drawCircle(x, y, r, color);
  

Я получаю 24 мс

Что за …?

Ответ №1:

ваша 3-я строка, которая отображается быстрее всего, связана с тем, что вы повторно используете одно и то же растровое изображение вместо заполнения видеопамяти всеми растровыми изображениями, которые вы пытались предварительно загрузить ранее; Это не создание нового, это просто установка границ для того, что вы хотите нарисовать. Что касается 24 мс для рисования круга, я бы предпочел, чтобы вычисление и рисование точек занимало больше времени, чем простой прямоугольник.

Комментарии:

1. Я только что попробовал, я использовал растровое изображение глобального масштаба и визуализировал его с помощью c.drawBitmap(scaledMoon,x,y, null); , у него был тот же результат (22 мс)