我想知道的是在更新我的对象在游戏中的位置时是否应该使用System.currentTimeMillis()或System.nanoTime()?它们的运动变化与自上次呼叫后经过的时间成正比,我希望尽可能精确.
我读过不同的操作系统之间存在一些严重的时间分辨率问题(即Mac/Linux的分辨率几乎为1毫秒,而Windows的分辨率为50毫秒).我主要在Windows上运行我的应用程序,50ms分辨率似乎非常不准确.
有没有比我列出的两个更好的选择?
有什么建议/意见吗?
我在OpenGL中平滑滚动有问题(在SGS2和ACE上测试)
我创建了简单的应用程序 - 只有固定速度的水平滚动图像,或者只有一个图像(播放器)通过加速器移动,但它的运动不顺畅:-(
我试过了许多代码但不满意......
首先我尝试使用GLSurfaceView.RENDERMODE_CONTINUOUSLY并将所有代码放到onDrawFrame:
public void onDrawFrame(GL10 gl)
{
updateGame(gl, 0.017f);
drawGame(gl);
}
Run Code Online (Sandbox Code Playgroud)
这是最简单,最绝对的顺畅! - 但它取决于硬件速度(=无用)
public void onDrawFrame(GL10 gl)
{
frameTime = SystemClock.elapsedRealtime();
elapsedTime = (frameTime - lastTime) / 1000;
updateGame(gl, elapsedTime);
drawGame(gl);
lastTime = frameTime;
}
Run Code Online (Sandbox Code Playgroud)
这是最好的,但它不像以前那样流畅,有时轻弹
我试过GLSurfaceView.RENDERMODE_WHEN_DIRTY,在onDrawFrame我只有绘图对象和这个代码在单独的线程中:
while (true)
{
updateGame(renderer, 0.017f);
mGLSurfaceView.requestRender();
next_game_tick += SKIP_TICKS;
sleep_time = next_game_tick - System.currentTimeMillis();
if (sleep_time >= 0)
{
try
{
Thread.sleep(sleep_time);
}
catch (Exception e) {}
}
else
{
Log.d("running behind: ", String.valueOf(sleep_time)); …Run Code Online (Sandbox Code Playgroud) 在for-loop中,我通过检索和处理车辆信息来控制基于模拟步骤的交通模拟器SUMO.为了确保我的程序"实时"模拟(1个模拟步骤= 1秒),我想在处理阶段之后睡眠我的程序,直到下一个步骤开始.为了获得更好的结果,我正在根据最初采用的参考时间戳计算时间戳.
循环看起来像这样:
System.out.println("start of traffic simulation ...");
for (int i = 0; i < stepCount; i++)
{
System.out.println("step: " + i);
// set before timeStamp
beforeTimeStamp = System.currentTimeMillis();
if (firstStep)
{
// get reference timeStamp
referenceTimeStamp = beforeTimeStamp;
firstStep = false;
}
else
{
// get next vehicleVector
vehicleVector = masterControl.traCIclient.simulateStep();
}
// process vehicleVector
// set after timeStamp
afterTimeStamp = System.currentTimeMillis();
processingTime = afterTimeStamp - beforeTimeStamp;
// calculate sleepTime
sleepTime = referenceTimeStamp + ((i + 1) * 1000) …Run Code Online (Sandbox Code Playgroud) 是否有一个Java API /建议使用而不是System.currentTimeMillis()来获取Windows上毫秒秒精度的当前时间 - 要求是两个后续调用,其中睡眠时间为1ms,应给出两个不同的时间 - 目前我需要明确睡眠15毫秒以获得不同的时间