Traceview显示某些方法未被调用200ms或更长时间

时间:2011-02-01 20:41:28

标签: java android

Traceview显示每隔10ms左右调用updatePhysics(),运行大约需要8ms。我在updatePhysics中调用的方法只运行updatePhysics()每5或6次运行一次。这只是Traceview的错误,还是发生了什么?我的游戏口吃相当多,所以我试图找出导致它的原因。

Traceview通常会显示我的很多方法在没有被调用一次的情况下会持续几百毫秒,即使它们似乎没有理由不被调用。想法?

运行方法:

        while (mRun) 
        {
            Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
            Canvas c = null;
            try 
            {
                c = mSurfaceHolder.lockCanvas(null);//null
                {
                    time2 = System.nanoTime()/100000; // Get current time
                    float delta = (time2 - time1)/1000f;

                    if (mMode == STATE_RUNNING) updatePhysics(delta);
                    else updateMenus();
                    doDraw(c);
                    time1 = time2;
                }
            } finally
            {
                // do this in a finally so that if an exception is thrown
                // during the above, we don't leave the Surface in an
                // inconsistent state
                if (c != null) 
                {
                    mSurfaceHolder.unlockCanvasAndPost(c);
                }
            }
        }

更新物理:

    private void updatePhysics(float delta)
    {
        updateScore(delta);
        updateDifficulty();
    }

编辑:正如你在这里看到的那样,updateDifficulty通常不会被调用几百毫秒即使你经常调用updatePhysics ......这没有任何意义。 Screenshot of traceview

1 个答案:

答案 0 :(得分:0)

最有可能在你的线程的某个地方你正在调用thread.Sleep(0)或thread.Yield()或类似的东西。这将导致线程屈服于正在调度的其他线程。在线程重新安排之前,它通常需要10ms或更长时间。我认为traceview不能完全理解这一点,并将线程处于挂起状态的时间计为活动状态。

大多数游戏使用一个恒定的游戏循环,一个真实的(真实的)永远不会产生任何东西。

其他一些评论:

我会在没有try-catch块的情况下尝试代码,这会减慢考虑因素。 Als删除了threadpriority行,这是一个操作系统调用,可能很慢,并且在发生错误时不会添加任何速度。 (普通优先级应该没问题)

你也确定这是正确的:

time2 = System.nanoTime()/100000; // Get current time
float delta = (time2 - time1)/1000f;

我不明白为什么你需要分配delta和当前时间。将时间从纳米时间转换为秒(或您需要的任何时间),然后以秒为单位的增量。或者以纳秒为单位保持时间并将增量转换为秒。现在你首先转换为秒,然后转换为1/1000秒。