- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试开发一些非常低延迟的图形应用程序,并且对通过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上驱动程序预渲染帧的数量。
关于c++ - OSX以最小的延迟将像素推向屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31793228/
我带着为 OSX 编写 PAM 模块的永无休止的传奇再次回来了。我已经写好了模块。它在使用 ssh 或启动新的终端窗口或 su 时有效。我真正真正想要的只是 ssh 和登录窗口。 我的 PAM 模块在
我们有一个类似于Soundflower的虚拟音频设备驱动程序。该虚拟设备将在声音系统首选项中列出。每当我们的设备在系统偏好设置中被选择时,它就会阻止空闲 sleep 。如果我们将选择切换为默认输出设备
我带着为 OSX 编写 PAM 模块的永无止境的传奇又回来了。我已经编写了模块。它在使用 ssh 或启动新的终端窗口或 su 时有效。我真的、真的、真的想要的只是 ssh 和登录窗口。 我的 PAM
我想在 osx lion 上安装 pyaudio,但我无法做到。每次我尝试使用 pkg 时,它都不会安装任何东西。当我尝试使用 pip 安装它时,出现以下错误(以及许多其他行): lipo: can'
我使用 Java 进行开发已有很长时间了,但直到最近才从 Windows 切换到 OSX。在 Windows 中,我发现一切都足够简单易懂。我可以将 JDK 安装到一个选择的位置,其中还包括一个 JR
运行 Mac OSX 10.7.5 我想在 USB3 外部硬盘上启用 NTFS 并需要 UUID 来执行此操作( http://ntfsonmac.com ),但 diskutil 拒绝给我 UUID
我正在尝试为 Finder 创建服务,但我的应用程序不需要有 UI。好吧,我只需要一个 UI 来请求用户提供更多信息,我的应用程序有时可能需要这些信息。 但是应用程序应该在没有任何 UI 且 Dock
我正在尝试在我的 mac 上使用本地服务器,但它似乎忽略了/etc/hosts 文件中的 localhost 设置。找到了几个页面,其中解决方案是重新安装,并将 localhost 放在/etc/ho
这是一个 OSX 链接器问题。我不认为 OSX(BSD 或 Mach 层)在乎零页有多大,或者它是否真的存在。我认为这是一个工具的事情。但这是我的意见,这就是我问的原因。 -pagezero_size
我正在构建一个将在 iOS/OSX 应用中使用的模块。 客户坚持认为该模块可以在 iOS 和 OSX 上运行。 我需要检查我在 iOS 和 OSX 上使用 UIDevice 时使用的系统版本 FTWD
我尝试在 OSX 10.8.2 中使用 gnuplot,并看到 x11 是不明确或未知的终端类型。一些研究表明 x11 不受支持,我下载了 XQartz,但我仍然收到相同的错误消息。 我使用 expo
我从官方网站下载了 PostgreSQL 并运行了 .dmg 安装程序。之后我下载了 pgadmin3,我确实能够连接到数据库。 当我运行“psql”时,出现以下错误: psql: could not
自从升级到 OSX Catalina 以来,我一直遇到 UnsatisfiedLinkErrors 问题,尝试在 java 下运行 JNI 包装的库,其中包含多个 native 库引用,这些引用在早期
在 OSX 10.6 上使用 make 构建 C++ 项目时,我确定预处理器定义 __LP64__ 似乎始终自动由编译器(即,它没有在任何头文件中定义)(参见 Where is __LP64__ de
我正在尝试将我的 iOS 应用程序移植到 Mac OS X SDK,并且发现我收到以下错误消息:'Collection' redeclared as a different kind of symbo
我一直在 OSX 10.14 中成功使用我的代码生成 Metal 纹理: let textureLoaderOptions = [MTKTextureLoader.Option.origin : MT
我对编码有些陌生,想用 MySQL 后端启动我的第一个 Django 应用程序。我已经在我的 Windows 机器上使用这个设置将近一年了,但它是一个继承的代码库——不幸的是,我从未尝试过从头开始构建
我正在迁移到一台新计算机,同时从雪豹迁移到狮子。 phpunit 似乎没有进行迁移,所以我重新安装了它。然而,pear 的标准安装似乎不适用于我的 php 家庭brew 安装。这是错误: phpuni
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 已关闭 7 年前。 Improve
我在 OSX10.9 上为我的应用程序构建了一个 Java 7 bundle ,一切看起来都很好,但是当我在 OSX 10.7 上尝试它时,它在启动时崩溃,它已经在 10.7.3 和 10.7.5 上
我是一名优秀的程序员,十分优秀!