SceneKit 统计显示中的 "Metal Flush" 是什么?

What are "Metal Flush" in the SceneKit stats display?

我正在尝试解决 FPS 下降问题。我看到 Metal Flushes 占用了大部分渲染时间。这是好事吗?

不确定,因为 Apple 似乎没有记录 "Metal Flush" 到底是什么,但我会根据以前的经验回答使用 OpenGL:

在 GPU 驱动的应用程序的执行周期中,CPU 会将数据推送到 GPU,等待 GPU 完成对该数据的操作(可能同时进行其他工作),并且GPU 完成后,立即推送更多数据并请求更多操作。通常,"flushing" 表示 CPU 正在等待 GPU 完成操作 ("flushing out old data"),以便它可以将更多数据推送到 GPU。

所以,如果我的解释是正确的,那将意味着 "Metal flush" 测量 CPU 等待视频内存释放的时间,以便它可以推送更多数据并请求操作到显卡。在那种情况下,这可能是好事也可能是坏事:

CPU 和 GPU 之间总会有一些通信开销,因此如果您的大部分渲染时间都被 "Metal Flush" 占用,这可能意味着您的应用程序只是 运行 速度足够快,帧之间的大部分延迟只是通信开销。那样的话,倒是一件好事。

另一方面,您可能会将大量数据推送到 GPU,而复制数据和处理数据所需的时间可能会导致延迟。那样的话,就不好了。

最后,重要的是确保您的 FPS 始终保持高水平。如果您的 FPS 由于 "Metal Flush" 而下降,您可能想尝试 space 停止数据传输 - 例如,使用较低分辨率的纹理 and/or 将纹理存储在块中可能会有所帮助.