Android SurfaceView - 平移或缩放时某些路径会延迟渲染

时间:2013-03-06 09:01:17

标签: android performance 2d android-canvas surfaceview

我使用Android的SurfaceView和Canvas实现了某种矢量地图。 地图的每个元素都由在for循环中绘制的路径表示,该路径将每个路径绘制到画布上。

像这样 -

void doDraw(Canvas canvas)
        {
        canvas.drawColor(Color.WHITE);

        if (mMapModel == null)
            return;

        for (MapElement e : mMapModel.getMapElements()){
            Path[] drawing = e.getDraw();
            canvas.drawPath(drawing[0], mPathFramePaint);   //draw the frame
            mPathFillPaint.setColor(e.color);
            canvas.drawPath(drawing[1], mPathFillPaint);    //draw the fill
}

我遇到的问题是每次平移地图时都会出现一种非常奇怪的“漂移”行为。看起来有些元素会在延迟中呈现,导致它们出现在之前的位置而不是新的实际位置。

您可以在此视频中看到这些现象 -

Video on YouTube

我想知道是否有一些我做得不对的事。我觉得我觉得这样做很重,应该导致物品渲染得太晚。

这是后台线程正在运行的代码 -

public class MapViewThread extends Thread

{

    boolean mRun;

    Canvas mcanvas;

    SurfaceHolder surfaceHolder;

    Context context;

    MapView mMapView;



    public MapViewThread(SurfaceHolder sholder, Context ctx, MapView mapView)
    {
        surfaceHolder = sholder;

        context = ctx;

        mRun = false;

        mMapView = mapView;

    }

    void setRunning(boolean bRun)
    {
        mRun = bRun;
    }


    @Override
    public void run()
    {
        super.run();
        while(mRun)
        {
            mcanvas = surfaceHolder.lockCanvas();
            if(mcanvas != null) 
            {
                mMapView.doDraw(mcanvas);

                surfaceHolder.unlockCanvasAndPost(mcanvas);
            }
        }
    }
}

谢谢!

1 个答案:

答案 0 :(得分:0)

终于解决了。这是一个线程问题!

在每个平底锅上,我正在迭代一个大的路径列表并更新每个路径的坐标。

在我能够完成更新列表中每个项目的位置之前,渲染线程正在渲染我的路径。

通过两个线程之间的一些同步,我能够解决这个问题。