android – SurfaceHolder.lockCanvas()对我的游戏应用来说需要太长时间

我正在开发一款安卓游戏,我正在使用SurfaceView.我有一个方法,每16ms调用一次(我希望有60fps)

public void myDraw(SurfaceHolder holder) {
    Canvas c = null;
    long start = System.currentMillis();    
    try {
        synchronized(holder) {
            c = holder.lockCanvas();
            if (c != null) {
                c.drawColor(Color.GREEN);
            }    
        }
    } finally {
        if (c != null) {
            holder.unlockCanvas(c);
        }
    }
    Log.i(TAG, "total time:" + (System.currentMillis() - start));
}

当我运行我的应用程序时,LogCat的输出是:

total time:30
total time:23
total time:6
total time:39
total time:17

为什么锁定/解锁画布需要花费太多时间?有没有更好的方法解决我的问题? (也就是说,有一个60 fps的应用程序)

谢谢!

解决方法:

我有一个类似的FPS问题,三星拦截的FPS很低.我只得到12FPS只有一个空白屏幕.我发现这个问题与Android在画布上自动缩放和绘制函数有关.
在AndroidManifest.xml中添加该行

< supports-screens android:anyDensity =“true”>

然后Android不会自动缩放画布和绘制功能.默认值为“false”,将启用自动缩放.
使用android:anyDensity =“true”我能够获得40 FPS!
所有这一切的缺点是你现在必须自己完成所有数学运算以匹配不同的屏幕尺寸.但那不应该那么难.
希望这有助于任何有类似问题的人.花了我5个小时来计算这个小虫子.

上一篇:.Net Core 路由处理


下一篇:翻译 - ASP.NET Core 基本知识 - 静态文件(Static Files)