Metal 着色器代码在什么情况下会“崩溃”?

lcm*_*lin 5 ios metal

我正在开发一个基于 Metal 的应用程序,在某些情况下,正确编译和链接的着色器代码将导致应用程序简单地崩溃而不会引发任何错误。

“崩溃”包括视觉输出的停止(在某些情况下,之前是几个交替帧的短暂断断续续),但其他应用程序的其余部分正常进行。Xcode 性能监控实用程序报告 60fps,但 GPU 延迟为 0ms,CPU 端执行继续,对 Metal API 的调用仍然成功完成。

不会向控制台报告任何错误。

这极难调试,因为我没有迹象表明错误来自着色器代码的何处。如果我知道这实际上应该在什么条件下发生,那会很有帮助,这样我就可以有一个很好的清单来检查。否则,每当出现这种情况时,我只是在黑暗中拍摄。

Ian*_*ann 3

当您读取或写出 MTLBuffer 的末尾、写出 MTLTexture 的末尾或者只是运行太长时间时,GPU 可能会崩溃。有一个看门狗定时器,如果 GPU 在几秒钟内没有完成其工作,它将重置 GPU。GPU 上的工作不是预先安排的。长时间运行的工作可能会阻止基本 GUI 任务的执行,从而使设备看起来被锁定。如果您有长时间运行的工作负载,则有必要将其拆分为许多较小的内核。为了保持界面响应,您应该保持工作负载 < 100 毫秒。为了避免视频卡顿,建议使用一致的帧速率。