【发布时间】:2011-10-13 18:26:45
【问题描述】:
我正在 Android 上使用 OpenGL(-es) 制作一个简单的突围游戏。最初,我在同一个循环中更新了游戏状态和绘图调用:onDrawFrame。现在我决定将两者分开,只将渲染调用留在 onDrawFrame 中,而游戏状态则在另一个 Thread 中进行管理:
public void run() {
Log.d("GameLogicThread", "GameLogicThread started");
final long UPDATE_INTERVAL = 1000000000 / 30;
long endingTime;
int timeElapsed;
long startingTime = System.nanoTime();
while (!running) {// wait for it...
}
while (running) {
endingTime = System.nanoTime();
timeElapsed = (int) (endingTime - startingTime);
Log.d("timeElapsed",Integer.toString(timeElapsed));
if (timeElapsed < UPDATE_INTERVAL-timeElapsed){
try {
Thread.sleep(timeElapsed);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
startingTime = System.nanoTime();
Game.updateGame(timeElapsed);
}
编辑
我现在已经像这样更改了代码^^,但它仍然无法正常工作..
是循环本身出了什么问题,还是我应该看看外面(可能不是,因为在移动代码之前它工作得很好)。我该怎么办?
【问题讨论】:
-
“因为在移动代码之前它工作得很好”
-
首先我有代码来更新游戏的状态(如对象位置),就像上面的那个,在我的绘图循环中调用 onDrawFrame(查找它,它被 openGL 自动调用),现在我把它放在一个单独的线程中,从那里你可以看到上面的 run() 方法......
-
@pst 我认为“工作得很好”他的意思是 timeElapsed 总是 > 0 这不是更好。现在他让它跑得更快了。
标签: java android opengl-es timing