Я рисую довольно большой путь в моем представлении, и у меня возникают проблемы с производительностью. Путь в настоящее время составляет 32 000 точек, но мое приложение должно масштабироваться как минимум до 128 000 точек. Я не могу ничего сделать с размером пути, так как массивы данных просто такие, и мне нужно иметь возможность отображать весь путь сразу и разрешать масштабирование.
Я использую Nexus 10 под управлением Android 4.2, который по умолчанию имеет аппаратное ускорение для приложений, которые явно не отключили его.
Путь создается с помощью следующего кода (я пропустил некоторые настройки и другие нерелевантные части):
dataPath.moveTo(0, offset - (float) data[leftLimit]/ scalingFactor);
for (int i = leftLimit; i < rightLimit; ++i) {
x = (i - leftLimit) * dx;
y = offset - (float) data[i]/ scalingFactor;
dataPath.lineTo(x, y);
}
И затем нарисован в методе onDraw()
:
canvas.drawColor(Color.WHITE);
canvas.drawPath(dataPath, linePaint);
Я измерил время, затрачиваемое на мой взгляд, используя adb shell dumpsys gfxinfo
с аппаратным ускорением и без него, и, к моему удивлению, аппаратное ускорение происходит гораздо медленнее:
С аппаратным ускорением:
Без аппаратного ускорения:
Аппаратная ускоренная версия занимает около 200-300 мс за кадр, большинство из которых затрачено на этапе "Процесс". Не ускоряемая версия занимает около 50 мс, с 2/3 на этапе рисования и 1/3 на этапе процесса.
Очевидно, что даже моя более быстрая версия без аппаратного ускорения все еще слишком медленна, чтобы достичь 60 кадров в секунду, или даже едва использовать, когда я перехожу к более крупным наборам данных.
Идея визуализации пути к растровому изображению, а затем только преобразование этого растрового изображения в соответствии с экраном также проблематично в моем случае. Мне нужно поддерживать масштабирование очень далеко на пути, и чтобы включить масштабирование без ухудшения качества пути, мне пришлось бы отображать негабаритные растровые изображения пути (и, скорее всего, будут работать в ограничениях памяти и ограничениях размера текстуры). И при масштабировании далеко мне придется либо создавать более новые изображения только частей пути, либо переключиться на просто визуализацию пути напрямую, что, вероятно, приведет к задержкам, превышающим частоту кадров, если производительность по-прежнему будет близка к тому, что у меня есть Теперь.
Теперь мне интересно,
- Является ли рисование линий/путей только тем, что у GPU плохо, и что не следует пытаться ускорить аппаратное ускорение, или я, вероятно, делаю что-то неправильно, что приводит к плохой производительности?
- Есть ли что-нибудь, что я могу сделать, чтобы нарисовать такие огромные пути с приемлемой производительностью?