gpt4 book ai didi

java - Traceview 显示某些方法在 200 毫秒或更长时间内没有被调用

转载 作者:行者123 更新时间:2023-12-01 05:50:20 27 4
gpt4 key购买 nike

Traceview 显示 updatePhysics() 每 10 毫秒左右调用一次,运行时间大约为 8 毫秒。然而,我在 updatePhysics 中调用的方法仅每运行 5 或 6 次 updatePhysics() 运行一次。这只是 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();
}

编辑:正如您在这里所看到的,即使定期调用 updatePhysics,updateDifficulty 通常也不会在几百毫秒内被调用......这没有任何意义。 Screenshot of traceview

最佳答案

很可能在线程中的某个地方调用 thread.Sleep(0) 或 thread.Yield() 或类似的东西。这将导致一个线程让位于正在调度的其他线程。而且通常需要 10 毫秒或更长时间才能重新安排线程。我认为 TraceView 没有完全理解这一点,并将线程处于挂起状态的时间计为 Activity 状态。

大多数游戏都使用恒定的游戏循环,即永远不会产生任何结果的真正 while(true)。

其他一些评论:

我会尝试不使用 try-catch block 的代码,这会大大减慢速度。另外删除线程优先级行,这是一个操作系统调用,可能会很慢,并且在出现错误时不会增加任何速度。 (正常优先级应该没问题)

您还确定这是正确的吗:

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

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

关于java - Traceview 显示某些方法在 200 毫秒或更长时间内没有被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4867732/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com