Android, самый быстрый способ рисовать растровое изображение на холст
Просто интересно, какой самый быстрый способ - нарисовать растровое изображение на холсте?
В настоящее время у меня есть растровое изображение (и холст для рисования), который я использую для дублирования вызовов рисования буфера, а затем, когда я рисую на холст, есть эффект прокрутки, применяя трансляцию холста 1px. Это само по себе уменьшит частоту кадров от 60+ FPS до ~ 40, что вполне достаточно. Im не использует surfaceView (или GLSurfaceView) на данный момент, а просто задается вопросом, не потеряет ли Im что-нибудь, что улучшит скорость. onDraw() ниже
@Override
public void onDraw(Canvas canvas)
{
//update fps text
mFpsTracker.frameTouch();
if(mBufferedBitmap == null)
{
mBufferedBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_4444);
mBufferedCanvas = new Canvas(mBufferedBitmap);
}
paint.setColor(Color.BLUE);
mBufferedCanvas.drawLine(0, getHeight(), getWidth(), getHeight(), paint);
mBufferedCanvas.translate(0, -1);
canvas.drawBitmap(mBufferedBitmap, 0, 0, null);
//draw fps
mTextPaint.setColor(Color.WHITE);
canvas.drawText(mFpsTracker.getFPSString(), 40, 40, mTextPaint);
invalidate();
}
Ответы
Ответ 1
см. это сообщение блога Ромен Гай.
Видео версия доступна здесь.
Больше не используйте ARGB_4444. Он устарел. Каждому пикселю присваивается только 4 бита на канал (отсюда и название). ARBG_8888 предлагает 16 777 216 цветов вместо ARBG_4444 4,096, но использует 4 байта на пиксель вместо 2.
В Gingerbread Android сделал ARGB_8888 стандартным форматом Surface и увеличил выделение памяти на каждый процесс из-за этого.
Более эффективно установить Окно и (при условии, что вы используете обтекаемую SurfaceView) Формат SurfaceHolder для RGBA_8888. Это позволяет избежать изменений формата, которые заметно медленнее.
Другие советы включают:
- Ограничение альфа-компоновки, поскольку для этого требуется сравнительно дорогое смешение от Skia.
- Request Bitmap Options, которые предпочитают ARGB_8888 Config и отключить сглаживание.
- Удалите окно background, если это возможно.
- Включить аппаратное ускорение, но остерегайтесь неподдерживаемых операций.
На устройстве 2.1 я могу нарисовать по крайней мере 300 растровых изображений на экране со скоростью 50 кадров в секунду.
Ответ 2
В onSizeChange вы можете изменять размер или создавать растровые изображения в соответствии с размером холста, тогда кадровый чертеж будет намного быстрее около 60 кадров в секунду, однако использование пользовательского представления в бесконечном цикле замедляет работу некоторых и становится неустойчивым на некоторых устройствах Android, поэтому я делаю не рекомендую. Вместо этого лучше использовать SurfaceView.
Посмотрите этот пример: Как я могу использовать рамку анимации внутри холста?
Ответ 3
У меня такая же проблема, как у вас, пожалуйста, скажите мне, когда вы нашли что-то новое.
Это то, что я основал до сих пор:
Ответ 4
U нужно создать растровое изображение где-нибудь (пример onCreate или другое место (конструктор будет хорош)), потому что когда вы выполняете прокрутку, вы снова и снова создавали новое растровое изображение. Так что просто нужно создавать в конструкторе, а не использовать это растровое изображение.
Это хорошее решение для меня, когда у меня есть подобные проблемы.
попробуйте создать этот mBufferedBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_4444);
в другом месте, где недействительны.
надеюсь, что это поможет вам.
Ответ 5
Я думаю, что вы можете получить хорошую производительность из холста.. но это требует большой работы.
если вы начинаете с хорошей графической библиотеки производительности, тогда даже если вы получите много чего не так, вы, вероятно, все равно получите хорошую производительность:) lol
существует конкуренция за самую быструю библиотеку чертежей... libgdx в настоящее время выигрывает...
http://code.google.com/p/libgdx/wiki/SimpleApp#Project_Setup