#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 мс)