- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
一段时间以来,我的 Android 游戏中运动的 Sprite 间歇性“卡顿”。这是一款非常简单的 2D OpenGL ES 2.0 游戏。 (这是一个持续存在的问题,我已经多次重新访问过)。
在我的游戏循环中,我有 2 个“计时器”——一个记录前一秒的帧数,另一个计算从当前 onDrawFrame 迭代结束到开始的时间(以毫秒为单位)下一个。
这是我发现的:
当不渲染任何东西时,我得到 60fps(大多数情况下),并且每次调用 onDrawFrame 时,它都会报告自己花费的时间超过 16.667 毫秒。现在,如果我渲染某些东西(无论是 1 个四边形还是 100 个四边形,结果都是一样的),我得到 60fps(大部分)但是现在,只有大约 20% 的 onDrawFrame 调用报告自己花费了更长的时间距离上次调用的时间少于 16.667 毫秒。
我真的不明白为什么会发生这种情况,首先,为什么当 onDrawFrame 没有做任何事情时,它被调用得如此“缓慢” - 更重要的是,为什么任何 GL 调用(一个简单的四边形)仍然使onDrawFrame 调用之间的时间超过 16.667 毫秒(尽管频率要低得多)。
我应该说,当 onDrawFrame 报告从上一次迭代开始花费的时间超过 16.667 毫秒时,它几乎总是伴随着 FPS 下降(降至 58 或 59),但并非所有时间,有时,FPS 保持不变.相反,有时当 FPS 下降时,会在最后一次迭代完成后的 16.667 毫秒内调用 onDrawFrame。
所以......
我正在尝试修复我的游戏循环并消除这些“卡顿”——其他一些需要注意的事项:
我显然误解了一些东西,所以向正确的方向插入将不胜感激。
OnDrawFrame
@Override
public void onDrawFrame(GL10 gl) {
startTime = System.nanoTime();
fps++;
totalTime = System.nanoTime() - timeSinceLastCalled;
if (totalTime > 16667000) {
Log.v("Logging","Time between onDrawFrame calls: " + (totalTime /(double)1000000));
}
//Grab time
newTime = System.currentTimeMillis() * 0.001;
frameTime = newTime - currentTime; //Time the last frame took
if (frameTime > 0.25)
frameTime = 0.25;
currentTime = newTime;
accumulator += frameTime;
while (accumulator >= dt){
saveGameState();
updateLogic();
accumulator -= dt;
}
interpolation = (float) (accumulator / dt);
Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0);
render(interpolation);
if (startTime > lastSecond + 1000000000) {
lastSecond = startTime;
Log.v("Logging","fps: "+fps);
fps=0;
}
endTime = startTime;
timeSinceLastCalled = System.nanoTime();
}
上面的这个游戏循环是这个优秀 article 中的特色游戏循环.
最佳答案
一些想法:
System.currentTimeMillis()
来计时。它基于挂钟,可以通过网络更新。使用基于单调时钟的 System.nanoTime()
。参见 Grafika's “记录 GL 应用程序”Activity 是一个简单的 GLES 应用程序示例,该应用程序会丢帧,但会调整动画以使其很少被注意到。
关于Android:了解 OnDrawFrame、FPS 和 VSync (OpenGL ES 2.0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38512936/
根据 ffmpeg 文档 -vsync parameter Video sync method. For compatibility reasons old values can be specifi
我正在尝试使我的窗口应用程序与显示器刷新垂直同步。此代码可在“fullscreen = true”(报告 75FPS,显示器刷新率)下正常工作,但在窗口模式下仅报告 32FPS。有人知道我在这里做错了
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 6 年前。 Improve t
我正在决定是否将 VSync 用于我一直使用 OpenGL 开发的新游戏。目标是为用户提供最佳的游戏体验,并在性能和质量之间取得良好的平衡。该游戏设计为可在较旧的(Intel/上网本)计算机和较新的(
我正在用 C 语言制作一款适用于 linux 帧缓冲区的游戏。到目前为止,我有一个红色的 100x100 正方形,它与鼠标一起移动,就像指针一样。我已经实现了双缓冲并且它工作正常(方 block 不闪
当 vsync 不是一个选项时,与监视器刷新同步的首选方法是什么?我们启用了 vsync,但是,一些用户在驱动程序设置中将其禁用,并且这些用户会覆盖应用程序首选项。我们需要可靠的可预测帧长度来正确模拟
我正在寻找一种可移植方法来制作非阻塞 SwapBuffers(),即使 VSync 已激活。 换句话说,是否有可能收到事件通知或知道下一个 VSync 之前的延迟? 最佳答案 IIRC 此扩展可帮助:
我使用 UDP API 将相机源更新到 ImageSource,我有一个计时器更新 ViewModel 的 ImageSource,然后 WPF 数据绑定(bind)屏幕上的图像。 计时器的间隔时间与
在注意到我的游戏在构建到我的iOS设备上时非常不稳定时,我检查了事件探查器,发现vsync负责。经过一些研究,我发现为了解决游戏的抖动问题,我不得不将目标帧频设置为60,因为默认情况下将其设置为30。
我一直在研究游戏循环和物理。前几天,我添加了一些调试语句来查看我的游戏循环的每一帧花费了多少时间。正如预期的那样,结果在 16 毫秒范围内。但是,我尝试禁用 vsync,这些结果并没有改变。显然 vs
在我实现的 2D OpenGL 引擎中,我有一个固定的时间步长,如著名的 fix your timestep 中所述。文章,以及混合。 我有一个垂直移动的测试对象(y 轴)。运动中存在卡顿(预编程运动
我正在调查我的 Android 应用中的丢帧问题。它们是不规则的,平均每秒发生一次。我已将有问题的渲染器配对回一个非常简单的着色器,我相信帧渲染时间很短。 当我运行 systrace 时,我可以看到看
对于科学任务,屏幕上应显示具有稳定频率(最大 60 Hz)的闪烁区域。我尝试使用 Qt 5.6 实现稳定的刺激可视化。 根据这个blog entry和许多其他在线建议,我实现了三种不同的方法:继承自
我在同一个主线程中使用三个不同的 QGLWidgets,最好以 60fps 渲染,但我无法达到超过 20fps。这似乎是由 Vsync 引起的,因为每个小部件可能会尝试独立地与刷新率同步,因此它们会以
所以,我在窗口应用程序中使用 D3D。 我使用以下参数初始化 D3D: windowed: true; backbufferformat: D3DFMT_X8R8G8B8; presentinterv
对于我所有的 SDL/OpenGL 程序,帧速率都停留在 60fps,所以看起来 vsync 已启用,但不是由我,也不是在我的代码或我的设置中。所以我想现在是否有办法禁用它,也许在一些深层的 macO
使用时 AnimationController ,那vsync的目的是什么?范围? class Example extends StatefulWidget { @override _Exam
AnimationController 停止工作,因为不知何故 vsync 不再是命名参数。 这行代码停止工作。controller = AnimationController(duration: D
我目前正在为 Android 开发一款游戏,我想截取它的屏幕截图。我是在 eclipse 中使用 DDMS 工具这样做的。但是,大多数屏幕截图都是两帧的混合: ___________ |new fra
我正在使用 XWindow Drawable、Pixmap 和 XRender 在屏幕上绘制一些东西。我可以看到有时会出现闪烁。有没有办法等待VBLANK?我已经在谷歌上搜索了很多,感觉就像在森林里寻
我是一名优秀的程序员,十分优秀!