这是一个猜测,但是:
问题不在于垂直同步
我不知道您正在使用什么操作系统,但是有多种方法可以获取有关显示器的信息以及屏幕刷新的速度(出于此答案的目的,我们假设您的显示器是最新的并重绘以 60 Hz 的速率,或每秒 60 次,或每 16.66666... 毫秒一次)。
渲染器通常与应用程序的“逻辑”端配对:输入、ui 计算、模拟运行等。看起来应用程序的逻辑端运行得足够快,但渲染端 - 即Draw Call
as它通常总结为 - 限制了您的应用程序的速度。
垂直同步可能会加剧这种情况,因为如果您的 Draw Call 每 16.66666 毫秒发生一次 - 但它需要的时间比 16.666666 毫秒长得多 - 那么您会感觉到帧速率下降(即帧会“卡顿”,因为它们花费的时间太长生成单帧)。VSync - 以及启用或禁用它 - 不会成为您代码的瓶颈:它只是说“嘿,由于硬件每 16.666666 毫秒只会从我们这里获取 1 帧,为什么要进行比每 16.66666 毫秒更多的绘制调用? ? 只要我们每次经过一次绘制调用,我们的应用程序就会看起来尽可能流畅,而且我们不必浪费时间进行更多调用!”
问题在于它假设您的代码运行速度足够快,可以在 16.6666 毫秒内完成。如果没有,卡顿、滞后、视觉伪影、冻结帧和其他事情会在屏幕上显现出来。
当您关闭 VSync 时,您是在告诉您的渲染调用尽可能频繁、尽可能快地被调用。这可能会在 Logic 调用旁边给它一些额外的摆动空间来渲染帧,这样当硬件说“我现在要拍照并把它放在屏幕上!”时 一切都被美化了,及时,进入姿势并说cheese!
(尽管你说的话,它几乎没有做到)。
该怎么办:
首先分析您的代码。找出哪些功能花费的时间最多。从口吃来看,您的代码中的某些内容花费的时间比预期的要长,并且给您带来了不良的性能。确保首先进行概要分析以找到您正在消耗时间的关键部分,并弄清楚如何保持正确 并使其尽可能快。您可能想弄清楚在渲染调用中调用了什么,并具体分析完成一个周期所需的时间。然后为逻辑调用计时,并查看执行这些调用需要多长时间。然后,砍掉。
祝你好运!