Используйте случай:Плохой производительности при непрерывном втягивания CustomView
Мне нужно рисовать сотни линий и несколько кусков текста на мой взгляд. Мне нужно дать эффект прокрутки, для которого я захватываю событие ACTION_MOVE
и перерисовываю все строки с обновленными точками. Чтобы получить результат желания, я попытался с разными подходами, но никто не работает по назначению.
подход 1
Я сделал пользовательский класс, который расширяет View
. Весь чертеж и расчет выполняются непосредственно в моем методе onDraw()
. Поскольку в методе onDraw()
так много работы, производительность приложения очень плохая. Я даже проверил производительность, используя Профильный рендеринг GPU, и я вижу, что линии очень высокие.
подход 2
Я создал Bitmap и после нанесения всех строк на моей битовую карту в другом потоке, я использовал postInvalidate()
нарисовать растровое изображение в onDraw()
методе:
mBufferedBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
mBufferedBitmap.eraseColor(Color.TRANSPARENT);
Canvas mBufferedCanvas = new Canvas(mBufferedBitmap);
drawLines(mBufferedCanvas)
postInvalidate();
Так как я стереть весь предыдущий рисунок на растровом изображении и нарисовать новые строки с обновленными точками, на экране появляется мерцание.
подход 3
Я попытался простирающийся свой собственный класс SurfaceView
и выполнять все операции на объекте холст в другом потоке. Но так как SurfaceView
использует процессор для операций рисования, производительность будет низкой в мобильных телефонах с низкой конфигурацией.
Может ли кто-нибудь вести меня, как достичь этой задачи с лучшей производительностью?
Попробуйте посмотреть в [ 'RenderScript'] (https://developer.android.com/guide/topics/renderscript/ compute.html). Я сам не использовал фреймворк, но это похоже на хороший прецедент. – Bryan
RenderScript не понадобится для моего использования. – VijayRaj
Не выделяйте новое растровое изображение в 'onDraw()', поэтому у вас есть fps. –