Ускорение вызовов Android drawRect

Вопрос:

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

Рендеринг выполняется с помощью эффекта, подобного частицам – я вычисляю цвет прямоугольников, которые я передаю с кругом, и делаю их соответственно. Эти прямоугольники хранят значения для меня, поэтому мне нужно отображать их по отдельности. Я сделал все возможное, чтобы ускорить это: предварительно вычислите объекты Paint для различных цветов (немногие достаточно эффективны и по-прежнему эффективны), предварительно рассчитали координаты прямоугольника и т.д. Однако я все еще теряю скорость на render loop – простой цикл, который выполняет итерацию через любой прямоугольник, который окрашен, и применяет его к экрану.

Я не выполняю никаких операций, но сравниваю, если прямоугольник окрашен, а значение прямоугольника напрямую вытягивает, какой объект Paint использовать из массива. Как я могу получить скорость здесь? Я не могу увеличить разрешение за пределами 16-пиксельных квадратов, заполняя экран, не становясь невыносимо медленным.

Здесь фрагмент кода, который является узким местом:

      c.drawRect(0, 0, c.getWidth(), c.getHeight(), p);
for(int x = 0; x < sizex; x++)
for(int y = 0; y < sizey; y++){
if(tiles[x][y] != 0){
if(tiles[x][y] > 100)
tiles[x][y] = 100;
c.drawRect(rects[x][y], ps[tiles[x][y]]);//This seems to be the bottleneck
}
}

Итак, в сущности, есть альтернативный метод drawRect(), который будет быстрее?

Лучший ответ:

Три вещи, которые следует учитывать:

  1. Доступ к многомерному массиву немного медленнее, чем одномерный. Но я думаю, что это незначительное (Java: многомерный массив против одномерного)

  2. Вместо drawRect вы можете использовать drawLines для рисования всех строк всех прямоугольников сразу. Это быстрее, чем несколько вызовов drawLine. Вот почему я предполагаю, что это также быстрее, чем несколько drawRect s. Но у меня нет никаких доказательств.

  3. Опираясь на холст медленно. Если производительность важна, вы должны использовать поверхностный вид (хотя я не знаю, работает ли это для LiveWallpapers). Если производительность имеет значение или для частиц и такого рода расширенный графический материал, я настоятельно рекомендую использовать OpenGL или некоторую библиотеку, такую как libGDX.

Оцените статью
TechArks.Ru
Добавить комментарий