2010-12-07 2 views
6

Я нахожу, что DrawBitMap занимает 50-60 мс для рисования только трех растровых изображений, один из которых представляет собой прямоугольник, занимающий весь экран, один - круг, а другой - это Путь. Мои растровые изображения создаются с использованием Canvas.drawPath, drawRect и drawCircle на пустой растровой карте с Bitmap.Config как ARGB_8888. Я использую ARGB_8888, чтобы сделать фон видимым, чтобы получить эффект расслоения. Я был потрясен тем, что нашел время около 50 мс, поскольку я думал, что drawBitmap будет очень простой операцией. Может ли кто-нибудь объяснить, есть ли какая-то фундаментальная ошибка, которую я делаю. Ниже мой кодAndroid DrawBitMap очень медленный при использовании ARGB_8888

Создание пустых Bitmaps

Rectangle = Bitmap.createBitmap(320,480,Bitmap.Config.ARGB_8888); 
Circle = Bitmap.createBitmap(70,70,Bitmap.Config.ARGB_8888); 
Leaf1 = Bitmap.createBitmap(20,30,Bitmap.Config.ARGB_8888); 

Рисование фигур на соответствующем BitMap

Canvas c = new Canvas(Rectangle); 
Paint p = new Paint(); 
p.setAntiAlias(true); 
p.setColor(0xff6e8b3e); 
c.drawRect(0,0,320,480,p); 

Canvas c = new Canvas(Circle); 
Paint p = new Paint(); 
CirclePath = new Path(); 
p.setAntiAlias(true); 
p.setColor(0xffcd661d); 
System.out.println("x = "+x+" y = "+y); 
CirclePath.addCircle(50,50,10,Path.Direction.CW); 
c.drawPath(CirclePath,p); 

Canvas c = new Canvas(Leaf1); 
Paint paint = new Paint(); 
Path path = new Path(); 
paint.setAntiAlias(true); 
path.moveTo((float)184.37,(float)219.15); 
path.cubicTo((float)188.32,(float)219.15,(float)192.88,(float)220.44,(float)195.62,(float)223.54); 
path.cubicTo((float)197.84,(float)226.05,(float)203.2,(float)229.84,(float)198.18,(float)245.98); 

чертежу растровое изображение в OnDraw

canvas.drawBitmap(Rectangle,0,0,p); 
canvas.translate(x,y); // For animation effect 
canvas.drawBitmap(Circle,0,0,p); 
canvas.drawBitmap(Leaf1,0,0,p); 

Теперь, когда я записываю время, затраченное на эти три drawBitMap, я нахожу, что он занимает около 50 мс. . Есть некоторая большая ошибка времени в коде. Изменение Bitmap.Config на RGB_565 сокращает время до 8 мс, но затем фон не отображается, и я получаю черный ящик вокруг пути.

ответ

2

Вы всегда должны соответствовать формату вашего экрана. Недавно был очень похожий вопрос, и Ромен упомянул, что блики по существу превращаются в memcpys, если формат соответствует. И, конечно же, убедитесь, что вы не используете эзотерический blit-режим.

Кроме того, почему вы используете сглаживание, если вы не масштабируете и не вращаете что-нибудь?

Что касается 565 не работает - я просто просматриваю ваш код. Вы используете альфа-канал? Как выглядят ваши растровые изображения?

+0

Да, канал alpha используется, поскольку я хочу, чтобы фон правильно отображался вокруг изображения. И Да, цель состоит в том, чтобы делать поворот и масштабирование, поэтому я использую сглаживание. В основном я разрабатываю SVG-плеер, который делает анимацию векторной графики, поэтому битмап построен с использованием функций drawPath, а затем растровое изображение рисуется на экране для каждого кадра – 2010-12-07 10:41:51

6

Выглядит нормально. Холст очень медленный по прозрачности.

Вы можете либо попытаться переключиться на OpenGL ES, либо создать свой контент с минимальной прозрачностью, чтобы вы могли использовать RGB_565 как можно чаще.

+0

+1. Если вы делаете много нетривиальных вещей (вращать, масштабировать, альфа, сглаживать и т. Д.), Вместо этого используйте OpenGL. Если вы этого не сделаете, обязательно выключите его. – EboMike 2010-12-07 07:24:18

0

Один из разработчиков Android объясняет это here. Чтобы быстро нарисовать ARGB_8888, вам нужно рисовать 32-битное окно. См. Нижнюю часть статьи для контрольных показателей.

Смежные вопросы