SDL2 – RenderPresent随机抽取20-30 + ms(在Node.JS FFI调用中)

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

问题是,当我打电话给SDL_RenderPresent VSYNC启用,偶尔,每隔几秒,这个电话将需要20-30或更多的毫秒来完成。 看起来这是连续发生的2-3次。 无论在屏幕上移动什么,这都会引起一个非常简短但明显的视觉障碍。 剩下的时间,这个调用将花费正常的时间来显示什么在正确的时间被画到屏幕上,以便与屏幕同步,并且一切看起来都很平滑。

如果你克隆上面提到的仓库,你可以看到这一点。 用node-gyp构build它,然后运行test.js. (我可以将testing代码embedded到StackOverflow中,但是我认为只需在GitHub上提供完整的示例会更容易)需要SDL2,SDL2_ttf和SDL2_image位于/ Library / Frameworks中。 (这还在开发中,所以没有什么特别的东西可以自动查找SDL2,或者在存储库中具有所需的代码,或从某个地方取出等)

编辑:这应该可能会根据gamedev StackExchange网站。 不知道是否可以移动/链接或不。

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

事实certificate,graphics是“紧张的”是每个游戏都可能面对的问题,并且有常见的方法来解决它。 基本上,问题是CPU不能完全并行地运行OS中的每个进程/线程。 有时一个进程必须暂停才能运行其他的东西。 在帧更新期间发生这种情况时,可能会导致该帧花费的时间比正常情况长两倍,实际上会被推到屏幕上。 这是抖动来自的地方。 最明显的一点是,在阅读关于类似抖动的Unity问题之后,这是一个问题 ,一位评论者指出,运行OS X上的活动监视器(Activity Monitor)会每隔几秒钟定期发生一次抖动。 大约从活动监视器轮询所有正在运行的进程获取信息之间的时间相同。 杀死活动监视器导致抖动不规则。

所以没有真正的方法来保证你的代码每16毫秒就会运行一次,并且在代码再次运行之前总是有16毫秒的时间。 你必须将处理事件,运动,AI等代码的时间与新帧的渲染时间分开,以获得完美的stream畅体验。 这通常意味着您将每秒运行所有逻辑的次数less于绘制帧的次数,然后预测每个对象在实际更新之间的位置,并在该位置绘制对象。 一般来说,请参阅“ DeWiTTERS游戏循环”文章 ,了解更多具体细节。

请注意,这种提供stream畅游戏体验的预测方法并非没有问题。 主要的一点是,如果你在一个预测的位置上显示一个对象,而没有真正的进行完整的碰撞检测,那么这个对象可以很容易地剪切到其他对象几帧。 在pong克隆中,我正在编写testingSDL绑定和预测对象的绘制,如果我在墙上按住右侧,桨会反复夹到墙上,然后popup,因为位置预计会远远超过它允许。 这是一个单独的问题,必须以不同的方式处理。 我只是让读者知道这个问题。