【发布时间】:2015-08-12 00:59:30
【问题描述】:
我正在开发一个基于 Metal 的应用程序,在某些情况下,正确编译和链接着色器代码会导致应用程序简单地崩溃而不会引发任何错误。
“崩溃”包括视觉输出的停止(在某些情况下,之前是几个交替帧的短暂停顿),但其他应用程序的其余部分正常运行。 Xcode 性能监控实用程序报告 60fps 但 GPU 延迟为 0ms,并且 CPU 端执行继续,对 Metal API 的调用仍然成功完成。
没有错误报告给控制台。
这很难调试,因为我不知道错误来自着色器代码的哪个位置。如果我知道这实际上应该在什么条件下发生,那会有所帮助,这样我就可以有一个很好的清单来检查。否则,每当出现这种情况时,我都会在黑暗中拍摄。
【问题讨论】:
-
我正在使用计算内核,我也经常崩溃。无论如何,xcode 没有帮助。我注释掉代码,直到它工作,然后添加回来。花费大量时间。金属游乐场会很棒。快速测试少量代码。
-
使用它一段时间后,它似乎主要是iOS故障恢复系统的副作用(我在OS X上没有遇到很多这些问题)。我已将大多数崩溃缩小为着色器执行速度太慢(当 FPS 低于 1 时 iOS 似乎会自动使应用程序崩溃,以防止应用程序使整个设备崩溃)或当我访问无效的内存区域时(iOS 应用程序是,毕竟,沙盒)。现在,如果这些系统能够真正与 Metal 前端沟通驱动程序已崩溃,这样对 API 的调用就会报告实际错误,那就太好了。
-
我为 c++ 设置了一个测试项目来调试代码。这样语法高亮和调试会好很多。我认为有很多循环的大着色器需要很长时间。然后它崩溃了,就像你的一样
-
我有一个带有三个嵌套 for 循环的着色器,它们编译得很好,但在运行时拒绝链接,更不用说在设备上运行了。着色器函数的大小/嵌套分支的数量似乎有一些限制,但我找不到关于这些限制的任何细节(显然,Xcode 在这里根本没有帮助)。这只是反复试验。
-
iOS 上当前的 Metal 实现显然是为游戏图形和交互式应用程序设计的,而不是为硬核计算而设计的。另一方面,在 OS X 上,它会无限期地消耗所有 GPU 资源并锁定系统(至少 Windows 在重置 GPU 之前为单个图形命令设置了 3 秒的限制)。跨度>