Mar*_*ram 1 macos cocoa metal metalkit
在 Windows World 中,一个专用的渲染线程会循环类似于以下内容:
void RenderThread()
{
while (!quit)
{
UpdateStates();
RenderToDirect3D();
// Can either present with no synchronisation,
// or synchronise after 1-4 vertical blanks.
// See docs for IDXGISwapChain::Present
PresentToSwapChain();
}
}
Run Code Online (Sandbox Code Playgroud)
Cocoa 中的等价物是什么CAMetalLayer?所有示例都处理在主线程中完成的更新,使用MTKView(使用内部计时器)或CADisplayLink在 iOS 示例中使用。
我想控制整个渲染循环,而不是仅仅在某个非指定的时间间隔接收回调(如果启用了 V-Sync,理想情况下会阻止它)。
在某种程度上,您将受到可绘制对象的可用性的限制。ACAMetalLayer有一个固定的可绘制对象池,调用nextDrawable将阻塞当前线程,直到可绘制对象变为可用。不过,这并不意味着您必须nextDrawable在渲染循环的顶部调用。
如果您想按照自己的时间表进行绘制而不会被阻塞等待可绘制对象,请渲染到屏幕外的渲染缓冲区(即,MTLTexture尺寸与您的可绘制对象大小相匹配的),然后从最近绘制的纹理 blit 到可绘制对象的纹理并以您喜欢的任何节奏呈现。这对于获取帧时间很有用,但是您绘制的每一帧然后不显示都是浪费的工作。它还增加了颤抖的风险。
在获取与垂直同步节奏匹配的回调时,您的选择是有限的。您最好的方法几乎肯定是CVDisplayLink在默认和跟踪运行循环模式下进行调度,尽管这有一些警告。
如果您想自由运行而不会走得太远,您可以将计数信号量与显示链接结合使用。
如果您的应用程序能够保持实时帧速率,您通常会在玻璃上发生的事情之前渲染一两帧,因此您不想真正阻止垂直同步;您只想通知窗口服务器您希望演示文稿与 v-sync 相匹配。在 macOS 上,您可以通过将图层设置displaySyncEnabled为 true(默认值)来执行此操作。关闭此功能可能会导致某些显示器出现撕裂。
| 归档时间: |
|
| 查看次数: |
1108 次 |
| 最近记录: |