Android 2D在异步任务中绘制到画布上,我做得对吗?



我写了一个程序来渲染一个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的绘制时间

现在的问题是我正在绘制屏幕内存所以很多闪烁但是可以通过双缓冲来解决这个问题

最新更新