Подтвердить что ты не робот

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();       
}
4b9b3361

Ответ 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