1

我一直在将 Node.JS FFI 更新为 SDL 以使用 SDL2。( https://github.com/Freezerburn/node-sdl/tree/sdl2 ) 到目前为止,一切进展顺利,我可以成功渲染 1600 多种彩色纹理而没有太多问题。但是,我刚刚开始遇到一个我似乎无法弄清楚的问题,并且似乎与 FFI、GC、Javascript 的速度等没有任何关系。

问题是,当我在启用 VSYNC 的情况下调用 SDL_RenderPresent 时,偶尔每隔几秒钟,此调用将需要 20-30 毫秒或更长时间才能完成。看起来这种情况连续发生 2-3 次。这会在屏幕上移动的任何内容中造成非常短暂但明显的视觉障碍。其余时间,此调用将花费正常的时间来显示在正确时间绘制到屏幕上的任何内容,以便与屏幕同步,并且一切看起来都非常流畅。

如果您克隆上面提到的存储库,您可以看到这一点。使用 node-gyp 构建它,然后运行 ​​test.js。(我可以将测试代码嵌入到 StackOverflow 中,但我认为在 GitHub 上提供完整示例会更容易)需要 SDL2、SDL2_ttf、SDL2_image 位于 /Library/Frameworks 中。(这仍在开发中,所以没有什么特别的东西可以自动查找 SDL2,或者在存储库中拥有所需的代码,或者从某个地方拉取等等)

编辑:这应该可能在 gamedev StackExchange 网站下。不知道它是否可以移动/链接。

4

1 回答 1

3

在网上做了一些更多的研究,我发现了“问题”是什么。这是我以前从未真正遇到过的事情,(不知何故)所以我认为这是我没有正确使用 SDL 的一些明显问题。

事实证明,图形“抖动”是每个游戏都可能/确实面临的问题,并且有一些常见的方法可以解决它。基本上,问题在于 CPU 无法完全并行运行操作系统中的每个进程/线程。有时必须暂停一个进程才能运行其他东西。在帧更新期间发生这种情况时,可能会导致该帧实际推送到屏幕所需的时间是正常帧的两倍。这就是抖动的来源。在阅读了一个关于类似抖动的 Unity问题后,最明显的是这是问题所在,其中一位评论者指出,在 OS X 上运行诸如活动监视器之类的东西会导致每隔几秒钟定期发生抖动。活动监视器轮询所有正在运行的进程以获取信息之间的时间大约相同。杀死活动监视器会导致抖动变得不那么规律。

因此,没有真正的方法可以保证您的代码将在点上每 16 毫秒运行一次,并且在您的代码再次运行之前总是会再过 16 毫秒。您必须将处理事件、移动、AI 等的代码的时间与渲染新帧的时间分开,以获得完美流畅的体验。这通常意味着每秒运行所有逻辑的次数少于绘制帧的次数,然后预测每个对象在实际更新之间的位置,并在该位置绘制对象。除了对一般游戏循环的精彩概述之外,请参阅deWiTTERS 游戏循环文章以获取更多具体细节。

请注意,这种提供流畅游戏体验的预测方法并非没有问题。主要问题是,如果您在预测的位置显示一个对象而没有实际对其进行完整的碰撞检测,那么该对象可以很容易地夹在其他对象中几帧。在 pong 克隆中,我正在编写测试 SDL 绑定,并使用预测的对象绘图,如果我在靠墙时保持正确,则桨将反复夹入墙壁,然后弹回,因为预计位置比现在更远允许。这是一个单独的问题,必须以不同的方式处理。我只是让读者知道这个问题。

于 2014-01-22T21:33:51.217 回答