ios - Metal着色器代码 "crash?"在什么条件下出现

标签 ios metal

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

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

没有向控制台报告错误。

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

最佳答案

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

关于ios - Metal着色器代码 "crash?"在什么条件下出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31954385/

相关文章:

ios - 用户跟踪模式缺少动画,Swift

ios - 通过 Apple-Metal MPSImageLaplacian 生成 Laplacian 图像

ios - 优化顶点着色器

ios - XCode 升级后无法为 iOS 编译

ios - 找到哪个按钮导致了 segue 操作?

ios - 核心数据实体 findFirst 每次都返回不同的实体,尽管事实上只有其中一个

ios - 找不到 CCRendererSharedTypes 文件

ios - 从 Objective-C block 中修改存储在实例变量中的信号量

swift - 多线程与 Metal

ios - 以相反的顺序填充 UICollectionView