如何使用canvas正确地在android中边界滚动屏幕?

时间:2017-07-24 20:58:42

标签: android animation canvas scroll

好的,我正在开发一个侧面滚动游戏,我的问题是如何正确绘制和更新屏幕。我在SurfaceView上绘图,我使用Path来制作轮廓,目前算法只绘制了这个:

我通过使用Path.offSet()然后使用canvas.drawPath()进行侧面滚动,稍后我使用Path.addRect()更新路径上的最后一个X位置(这基本上就是我如何绘制所有内容:使用Path.addRect())

所以这是更新屏幕的线程:

@Override
public void run() {
    int x = LibraryLoader.getTerrainSizeX();
    int y = LibraryLoader.getTerrainSizeY();

    int count = 0;

    Paint paint = new Paint();
    paint.setStyle(Paint.Style.FILL);

    Path path = new Path();
    makePath(path, x, y, 0, LibraryLoader.getTerrainThickness());
    Path path2 = new Path();
    makePath(path2, x, y, LibraryLoader.getTerrainThickness(), y);
 while (run) {
        Canvas c = null;
        try {
            c = surfaceHolder.lockCanvas(null);
            synchronized (surfaceHolder) {
                fps = fps();
                drawMyData(c, path, path2, paint, fps);
                LibraryLoader.updateOffSet();
                updatePaths(path, path2, x, y);
                if ((count++) == (x / 2) - 1) {
                    LibraryLoader.updateOffSetArray();
                    count = 0;
                }
            }

        } finally {
            if (c != null) {surfaceHolder.unlockCanvasAndPost(c);}
        }
    }

及其各自的方法:

public void updatePaths(Path path, Path path2, int x, int y) {
    path.offset(-1f, 0);
    path.addRect(x-3, topValue, x-2, bottomValue, Path.Direction.CW);
    path2.offset(-1f, 0);
    path2.addRect(x-3, topValue, x-2, y, Path.Direction.CW);
}

所以,在我的手机中它以60fps完美运行,问题是我在低端设备中进行了测试,它以40fps开始,然后每次更新都会下降,直到它低于10fps ......(并且不断下降)。我想我需要清理路径的状态,否则我甚至不应该使用Path类开始。所以我的问题是如何以最佳性能更新屏幕? Obs:画布不是硬件加速的。

1 个答案:

答案 0 :(得分:0)

好吧,伙计们,我发现我做的每件事都错了。答案很简单:如果您的Android应用程序每帧更新整个屏幕,请使用Opengl。 Canvas适用于我所见过的应用程序设计,希望我没有弄错。例如,如果你想为LOGO或按钮制作一个自定义动画,那么我猜你使用画布。如果有人在这篇文章中绊倒了,请观看Morrison Chang提到的视频,他们非常有助于让您走上正轨。欢呼声。