我写了一个程序来渲染一个2D的投球和旋转球(它是一个真正的3D指南针的2D版本,类型有一个浮动的球体,跟随北方并在框架倾斜时倾斜)
它工作得很好,但是没有旋转矩阵需要30mS来绘制到画布/位图,使用旋转矩阵需要60mS。
绘制代码发生在asyncTask doInBackground中,因为它从套接字获取数据。在完成位图的创建之后,它执行一个发布进度。所以代码看起来像这样(删去了很多)
Bitmap mRotatedBmp = null;
@Override
protected String doInBackground(String... params) {
// read pitch and roll data from socket and loop forever
int wh=448, c=wh/2, r=wh*100/220;
Bitmap bmp = Bitmap.createBitmap(wh, wh, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bmp);
// do some drawing like this
canvas.drawCircle(c, c, r, paint);
paint.setColor(skycolor);
canvas.drawArc(oval, 180, 180, true, paint)
etc, total 1 circle, 2 arcs, 1 rectangle and several paths and a bit of text
//takes 30mS to here
// ROTATION PART
// mRotatedBmp is the thing that gets displayed in publishProgress
mRotatedBmp = Bitmap.createBitmap(wh, wh, Bitmap.Config.ARGB_8888);
Canvas rotatedCanvas = new Canvas(mRotatedBmp );
Matrix matrix = new Matrix();
matrix.setRotate(-rollD,r,r);
rotatedCanvas.drawBitmap(bmp, matrix, new Paint());
//takes 60mS to here
@Override
protected void onProgressUpdate(Void... values) {
imageView.setImageBitmap(mRotatedBmp ); // draw new img to screen
imageView.invalidate();
所以我想知道我是否画错了东西。基本上它是一个450x450的图像,由1个圆形,2个圆弧,1个矩形和几个路径和一些文本
组成。我发现问题与绘图无关,90%与创建位图有关。
如果我移动位图bmp =位图。createBitmap(wh, wh, Bitmap.Config.ARGB_8888);跳出循环,只做一次,然后我得到大约6mS的绘制时间
现在的问题是我正在绘制屏幕内存所以很多闪烁但是可以通过双缓冲来解决这个问题