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 кадров в секунду.

У меня та же проблема, что и у вас, пожалуйста, скажите мне, когда вы нашли что-то новое.

Это то, что я основал до сих пор:

  1. Для версии Android> 3 лучше не использовать двойной буфер, потому что вы получаете аппаратное ускорение (необходимо установить true в манифесте)
  2. установите paint.setDither(true), он будет работать лучше на любом устройстве с другим цветом, чем ARGB_4444, большинство из которых являются устройствами. Проверьте это для получения дополнительной информации.

В onSizeChange вы можете изменять размер или создавать растровые изображения в соответствии с размером холста, тогда рисование кадра будет намного быстрее, примерно до 60 кадров в секунду, однако использование собственного представления в бесконечном цикле замедляется на некоторых и становится нервным на некоторых устройствах Android, поэтому я не рекомендую его, Вместо этого лучше использовать SurfaceView.

Проверьте этот пример: как я могу использовать анимационную структуру внутри холста?

Вам нужно где-то создать свое растровое изображение (например, onCreate или другое место (конструктор будет хорош)), потому что, когда вы делаете эффект прокрутки, вы снова и снова создаете новое растровое изображение. Так что просто нужно создать в конструкторе, а затем использовать этот растровое изображение.

это хорошее решение для меня, когда у меня есть похожие проблемы. попробуй создал это mBufferedBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_4444); в другом месте, где не признать недействительным. надеюсь, это поможет вам.

Я думаю, что вы можете получить хорошую производительность из холста.. но это требует много работы..

если вы начнете с хорошей графической библиотеки производительности, то даже если вы ошибаетесь во многих вещах, вы, вероятно, все равно получите хорошую производительность:) lol

конкурс на самую быструю библиотеку рисунков... libgdx в настоящее время побеждает...

http://code.google.com/p/libgdx/wiki/SimpleApp

Другие вопросы по тегам