Android, самый быстрый способ нарисовать растровое изображение на холсте
Просто интересно, какой самый быстрый способ нарисовать растровое изображение на холсте?
В настоящее время у меня есть растровое изображение (и холст для рисования), которое я использую, чтобы удвоить буферизацию вызовов рисования, а затем, когда я рисую на холст, получаю эффект прокрутки, применяя перевод холста 1px. Уже одно это снизит частоту кадров с 60+ FPS до ~40, что является настоящим ударом. Я не использую SurfaceView (или GLSurfaceView) в данный момент, но просто интересуюсь, не упускаю ли я что-нибудь, что улучшило бы скорость. код 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();
}
5 ответов
Пожалуйста, смотрите это сообщение в блоге Ромена Гая.
Видео версия доступна здесь.
Не используйте ARGB_4444 больше. Это устарело. Каждому пикселю выделяется только 4 бита на канал (отсюда и название). ARBG_8888 предлагает 16 777 216 цветов вместо 4096 ARBG_4444, но использует 4 байта на пиксель вместо 2.
В Gingerbread Android сделал ARGB_8888 стандартным форматом для Surface и благодаря этому увеличил выделение памяти на процесс.
Более эффективно установить формат окна и (при условии, что вы используете оптимизированный SurfaceView) формат SurfaceHolder равным RGBA_8888. Это позволяет избежать изменений формата, которые заметно медленнее.
Другие советы включают в себя:
- Ограничьте альфа-композитинг, так как это требует сравнительно дорогого смешивания от Skia.
- Запросить параметры растрового изображения, которые предпочитают конфигурацию ARGB_8888, и отключить дизеринг.
- Удалите фон окна, если это возможно.
- Включите аппаратное ускорение, но остерегайтесь неподдерживаемых операций.
На устройстве 2.1 я могу нарисовать как минимум 300 растровых изображений на экране со скоростью 50 кадров в секунду.
У меня та же проблема, что и у вас, пожалуйста, скажите мне, когда вы нашли что-то новое.
Это то, что я основал до сих пор:
- Для версии Android> 3 лучше не использовать двойной буфер, потому что вы получаете аппаратное ускорение (необходимо установить true в манифесте)
- установите paint.setDither(true), он будет работать лучше на любом устройстве с другим цветом, чем ARGB_4444, большинство из которых являются устройствами. Проверьте это для получения дополнительной информации.
В onSizeChange вы можете изменять размер или создавать растровые изображения в соответствии с размером холста, тогда рисование кадра будет намного быстрее, примерно до 60 кадров в секунду, однако использование собственного представления в бесконечном цикле замедляется на некоторых и становится нервным на некоторых устройствах Android, поэтому я не рекомендую его, Вместо этого лучше использовать SurfaceView.
Проверьте этот пример: как я могу использовать анимационную структуру внутри холста?
Вам нужно где-то создать свое растровое изображение (например, onCreate или другое место (конструктор будет хорош)), потому что, когда вы делаете эффект прокрутки, вы снова и снова создаете новое растровое изображение. Так что просто нужно создать в конструкторе, а затем использовать этот растровое изображение.
это хорошее решение для меня, когда у меня есть похожие проблемы. попробуй создал это mBufferedBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_4444);
в другом месте, где не признать недействительным. надеюсь, это поможет вам.
Я думаю, что вы можете получить хорошую производительность из холста.. но это требует много работы..
если вы начнете с хорошей графической библиотеки производительности, то даже если вы ошибаетесь во многих вещах, вы, вероятно, все равно получите хорошую производительность:) lol
конкурс на самую быструю библиотеку рисунков... libgdx в настоящее время побеждает...