繁体   English   中英

Android FPS,如何使其更流畅?

[英]Android FPS, how to make it smoother?

我在为游戏构建基本游戏循环时遇到麻烦。 我现在处于早期阶段,我要做的就是以恒定的速度(例如3)将球移过屏幕底部。 球的位置在主面板更新方法中更新,并按预期方式在渲染部分中绘制。 该机制没有什么例外。 球移动了,但绝对不光滑,视觉上很安静。.我测量了这些方法的实现时间,这对夫妇的总实现时间约为3-4毫秒。 在这种情况下,什么是合适的FPS? 给定的常数是否合适我的机制中缺少或存在哪些错误? 非常感谢。 主线程中的代码块。

private final static int MAX_FPS = 200;
private final static int FRAME_PERIOD = 1000 / MAX_FPS;
private final static int    MAX_FRAME_SKIPS = 5;

public void run() {

    initTimingElements();
    long beginTime;
    long timeDiff;
    int sleepTime;
    int framesSkipped;
    long beginTime2;

    long diff1;
    long diff2;

    sleepTime = 0;

    Canvas canvas;
    Log.d(TAG, "Starting game loop");
    while (running) {
        canvas = null;
        try {
            canvas = this.surfaceHolder.lockCanvas();
            synchronized (surfaceHolder) {
                beginTime = System.currentTimeMillis();
                framesSkipped = 0; 

                this.gamePanel.update();
                diff1=System.currentTimeMillis()-beginTime;
                beginTime2=System.currentTimeMillis();
                this.gamePanel.render(canvas);
                diff2=System.currentTimeMillis()-beginTime2;



                timeDiff = System.currentTimeMillis() - beginTime;
                sleepTime = (int) (FRAME_PERIOD - timeDiff);

                if (sleepTime > 0) {
                    try {
                        Thread.sleep(sleepTime);
                    } catch (InterruptedException e) {
                    }
                }                   
                while (sleepTime < 0 && framesSkipped < MAX_FRAME_SKIPS) {
                    this.gamePanel.update();
                    sleepTime += FRAME_PERIOD;
                    framesSkipped++;
                }
                if (framesSkipped > 0) {
                    Log.d(TAG, "Skipped:" + framesSkipped);
                }
                framesSkippedPerStatCycle += framesSkipped;
                storeStats();
            }
        } finally {
            if (canvas != null) {
                surfaceHolder.unlockCanvasAndPost(canvas);
            }
        }
    }
}

尝试使用每60毫秒左右触发一次的TimerTask。
这就是我要做的,直到我不再懒得做适当的实现,但是效果很好。 只需记住run()将在不同的线程中执行,因此请使用runOnUIThread()运行所需的任何代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM