2013-02-09 2 views
4

Привет всем Мне было интересно, если бы можно было привлечь к закадровому Canvas/Bitmap и воспользоваться аппаратным ускорением, или я должен сделать внутри onDraw() способа ViewAndroid Canvas и аппаратное ускорение?

Например я рисую с закадровым Bitmap выполнив следующие действия:

Bitmap.Config config = Bitmap.Config.ARGB_8888; 
Bitmap buffer = Bitmap.createBitmap(200, 200, config); 
Canvas canvas = new Canvas(buffer); 
Paint paint = new Paint(); 
paint.setColor(Color.RED); 
canvas.drawLine(0, 0, 100, 100, paint); 

Однако canvas.isHardwareAccelerated() возвращает ложь и рисунок вялым по сравнению с:

protected void onDraw(Canvas canvas) { 

    Paint paint = new Paint(); 
    paint.setColor(Color.RED); 

    canvas.drawLine(0, 0, 100, 100, paint); 
} 

где canvas.isHardwareAccelerated() возвращает true. Есть ли способ рисовать в Bitmap, используя преимущества аппаратного ускорения? Или мне нужно рисовать непосредственно на экране в методе onDraw?

Спасибо за вашу помощь :) Я знаю, что в Java я могу сделать для BufferedImage закадровым, и это будет аппаратное ускорение, но, возможно, его не то же самое по телефону ...

ответ

1

Потому что в первом случае, вы создаете холст, он не подкрепляется аппаратным слоем. Кроме того, на данный момент вы не можете включить HWA только на любом холсте, он должен принадлежать HWA View.

Вид с другой стороны, имеет доступ к аппаратным возможностям системы. Вы можете использовать это, позвонив setLayerType(LAYER_TYPE_HARDWARE), как описано в документах:

Указывает, что вид имеет аппаратный уровень. Аппаратный уровень - , поддерживаемый специфичной для аппаратного обеспечения текстурой (как правило, объектами буфера кадров или FBO на оборудовании OpenGL) и вызывает визуализацию представления с помощью конвейера рендеринга аппаратного обеспечения Android, но только если аппаратное обеспечение ускорение включено для иерархии представлений , Когда аппаратное обеспечение ускорение выключено, аппаратные слои ведут себя точно так же, как программное обеспечение слоев.

Кроме того, проблема с производительностью относится скорее к части рендеринга, а не к чертежу. Все операции рисования записываются как объект Picture. Его операция рендеринга, где HWA играет важную роль.

+1

В соответствии с этим ответом: http://stackoverflow.com/a/9950775/935242 «Холст, возвращенный SurfaceView.lockCanvas(), не может быть аппаратным ускоренным в данный момент». – ggurov

+1

То же самое для TextureView: http://stackoverflow.com/a/14987164/935242 «TextureView работает только тогда, когда приложение аппаратно ускорено, но Canvas, который он возвращает из lockCanvas(), в настоящее время не аппаратно ускоряется ... В настоящее время, единственный способ получить аппаратное ускорение Canvas - использовать метод onDraw (Canvas) для представления ». – ggurov

+0

@ggurov Обновлено. Благодарю. –