gpt4 book ai didi

c++ - OSX以最小的延迟将像素推向屏幕

转载 作者:搜寻专家 更新时间:2023-10-31 00:32:17 31 4
gpt4 key购买 nike

我正在尝试开发一些非常低延迟的图形应用程序,并且对通过OpenGL绘制屏幕需要多长时间感到非常沮丧。我在网上找到的每一个讨论都针对优化OpenGL管道,但是并没有达到我需要的结果。

看一下这个:

https://www.dropbox.com/s/dbz4bq67cxluhs7/MouseLatency.MOV?dl=0

您可能之前已经注意到了这一点:使用c++ OpenGL应用程序,在屏幕上拖动鼠标并在OpenGL中绘制鼠标位置时,OpenGL落后了3或4帧。显然,OSX可以以非常低的延迟将[光标]绘制到屏幕上,但是OpenGL要慢得多。因此,假设我不需要执行任何精美的OpenGL渲染。我只想以某种方式 push 像素到屏幕。有没有办法让我完全绕过OpenGL并更快地绘制到屏幕上?还是将这种功能锁定在我无法达到的内核中?

最佳答案

datenwolf的回答非常好。因为我对Microsoft Windows桌面合成器非常熟悉,所以我只想在此讨论中添加关于合成器级别三重缓冲的一件事。
我知道您在这里询问有关OS X的问题,但是我将要讨论的实现细节是实现这些东西的最明智的方法,并且我希望看到其他系统也能以这种方式工作。
您可能在应用程序级别启用的三重缓冲将第三个缓冲区添加到交换链,该链被同步以刷新。这种执行三重缓冲的方式确实增加了延迟,因为必须显示第三个缓冲区,并且在发生这种情况之前,任何东西都不能触摸它(这是D3D的强制行为-行为和功能本身在OpenGL中未定义);但是桌面窗口管理器(Windows)的工作方式略有不同。
我已经看到大多数驱动程序为桌面合成实现的行为是掉帧。在刷新之间完成多个帧的任何情况下,这些帧中只有1个会被丢弃。实际上,您使用窗口而不是全屏+三重缓冲可以获得较低的延迟,因为当第三个缓冲区(由合成器拥有)等待显示完帧时,它不会阻止缓冲区交换。
如果帧速率不能合理地保持一致,则会产生一系列完全不同的视觉问题。从技术上讲,属于丢失帧的像素具有无限的延迟,因此,如果需要将绘制的每个帧都显示在屏幕上,那么通过这种方式减少延迟带来的好处可能就毫无值(value)。
我相信您可以通过禁用VSYNC并在窗口中绘制来在OS X上获得此行为(如果需要)。在这种情况下,VSYNC基本上仅用作帧定步(一致性的交易延迟)形式,无论您采用何种速率,合成器本身都可以消除撕裂。

关于鼠标光标延迟:
任何现代窗口系统中的光标将始终以最小的延迟进行跟踪。图形硬件上确实有一个称为“硬件光标”的功能,驱动程序存储光标位置,然后每次刷新后,使硬件将光标覆盖在帧缓冲区中等待被扫描出的任何内容之上。因此,即使您的应用程序在60 Hz的显示器上以30 FPS的速度绘制图形,使用硬件光标时,光标也会每16毫秒更新一次。
这会完全绕过所有图形API,但受到很大限制(例如,它使用操作系统定义的游标)。

TL; DR:延迟有多种形式。
如果您的问题是输入延迟,则可以通过减少预渲染的帧数并避免三重缓冲来缓解这种情况。我无法告诉您如何减少OS X上驱动程序预渲染帧的数量。

  • 最小化屏幕上出现东西之前的时间

  • 如果您的问题是渲染循环执行之间的时间间隔,则可以采用其他方法。增加预渲染的帧,在窗口中绘制并禁用VSYNC。在这种情况下,您可能会遇到很多绘制但从未显示过的框架。
  • 最小化阻止时间(增加FPS);某些帧将永远不会显示

  • 预渲染帧是一个强大的小功能,您无法在OpenGL API级别上对其进行控制。它设置了允许驱动程序对所有内容进行流水处理的深度,并根据所需任务,通过摆弄各种延迟类型。许多游戏玩家发誓通过将此值设置为1来最大程度地减少输入延迟,但会降低总体帧速率的“平滑度”。
    更新:
    预先渲染的帧是造成多帧延迟的原因之一。很难以跨平台的方式解决此问题(这是驱动程序设置),但是如果您可以访问Fence Sync Objects,则可以产生与将其强制为 1 相同的行为。
    我可以根据需要更详细地说明这一点,通常的想法是,在缓冲区交换之后插入篱笆同步,然后等待信号通知下一个帧开始。性能可能会大打折扣,但由于CPU将不再在GPU之前渲染,因此延迟将最小化。

    关于c++ - OSX以最小的延迟将像素推向屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31793228/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com