【问题标题】:Triple buffering without buffers?没有缓冲区的三重缓冲?
【发布时间】:2018-01-22 13:16:02
【问题描述】:

Metal Best Practices Guide 声明

setVertexBytes:length:atIndex: 方法是将非常少量(小于 4 KB)的动态缓冲区数据绑定到顶点函数的最佳选择

我相信这意味着与其将制服存储在过于复杂的手动内存管理动态缓冲区中,不如使用setVertexBytessetFragmentBytes 来简单地更新模型/视图/投影矩阵而不使用任何缓冲区。

我的问题是,在这种情况下,由于根本没有动态缓冲区(只有静态顶点数据),我们称之为三重缓冲?

仅仅是因为我们现在有一个带有value: 3 的信号量吗?

【问题讨论】:

标签: 3d metal


【解决方案1】:

如果您使用setVertexBytes 及其同类而不是显式使用缓冲区来传递动态数据,我同意您不是真正意义上的“三重缓冲”。事实上,您可以省略信号量,因为此时,您没有保护并发访问的资源。

您可能(但可能不会)仍然阻止等待可绘制对象变为可用,但这是表示架构的限制,并且与您可能会或可能不会做的任何缓冲区管理分开关注。

【讨论】:

  • 你能解释一下没有信号量的阻塞吗?由于渲染循环被限制在 60 FPS 并且 CPU 的帧时间约为 1.5 ms(在一个简单的例子中),我想要一些命令来获取信号量的阻塞功能,不是吗?
  • 也许,但如果您使用MTKView 和/或显示链接计时器,则该角色已为您执行。您是从主线程以外的地方驱动渲染和/或运行自己的计时器吗?
  • 我只是使用最简单的 MTKView 示例(移除了缓冲区和信号量的金属游戏应用程序)。
  • 在这种情况下,MTKView 在内部运行它自己的CADisplayLink(或在 macOS 的情况下为CVDisplayLink),它只生成与要显示的帧一样多的回调(最常见的是60赫兹)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多