Правильный способ частичного обновления представления Android с аппаратным ускорением с помощью растровых изображений

У меня есть приложение для Android, которое рисует представление (полноэкранный режим). Я хочу аннулировать часть этого, а затем просто нарисовать эту часть при следующем вызове onDraw(). Я хочу сделать это в цикле, рисуя каждую часть экрана за раз. Я обнаружил, что он хорошо работает на Nexus 7 (Android 4.4.2), не так уж плохо на Galaxy Nexus (4.3), но никогда не рисует весь экран одновременно на HTC Sensation XL (4.0.3). Были ли исправлены некоторые ошибки с конвейерным рендерингом, или я что-то не так делаю? -- Как правильно это сделать?

Подробнее: у меня есть набор объектов Rect. В обработчике есть метод обновления, который регулярно вызывает Invalidate(Rect). Каждый раз на основе индекса. в onDraw() я использую

canvas.drawBitmap(background, src, dest, null);

Где src и dest — это те же Rect, которые использовались для недействительного вызова. В конце метода onDraw индекс обновляется. Похоже, что в Android 4.0.3 весь холст был пуст, а в 4.3 и 4.4.2 — нет.

Чего я действительно пытаюсь достичь? Тратьте как можно меньше времени на каждый вызов onDraw (‹ 1 мс), чтобы ЦП мог заниматься другими делами, и в то же время поддерживать пользовательский интерфейс с несколькими растровыми изображениями, которые рисуются, вращаются и т. д. Это наиболее важно для более старые телефоны с меньшими возможностями, которые, вероятно, будут работать под управлением 4.0.3


person hack_on    schedule 04.06.2014    source источник


Ответы (1)


В конце концов я выбрал другой подход, так как не смог найти прямого способа решить проблему. Я реализовал SurfaceView OpenGL на основе это руководство. Я помещаю все в одну текстуру (файл png) и перерабатываю вершины, индексы и массивы uvs и связанные с ними прямые буферы. В результате onDrawFrame в классе Renderer каждый раз завершается примерно за 0,4 мс даже на медленных телефонах. Это то, что мне нужно.

person hack_on    schedule 16.06.2014