【问题标题】:ios metal: limit on number of variables used in a shaderios metal:限制着色器中使用的变量数量
【发布时间】:2017-05-10 20:47:17
【问题描述】:

在我的着色器添加了一些复杂性后,我今天开始收到以下错误:

Execution of the command buffer was aborted due to an error during execution. Discarded (victim of GPU error/recovery) (IOAF code 5)

我发现它与实际添加的代码无关,但事实上我添加了更多变量和函数调用。我尝试从着色器中删除其他复杂性并删除了错误。 我发现的另一件事是,当我将快速数学设置为 false 时,这个问题也被消除了。

我的第一个猜测是,在启用快速数学时,变量的数量存在某种限制。有这样的限制吗?任何其他想法为什么会发生这种错误?

【问题讨论】:

    标签: ios swift metal


    【解决方案1】:

    最可能的原因是金属缓冲区或着色器过载 使用金属技术有一定的局限性,这里有描述

    https://developer.apple.com/library/content/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/BestPracticesforShaders/BestPracticesforShaders.html

    我之前遇到过这个问题,我正要从 Metal 切换到 OpenGL 但是 Metal 的优势让我再试一次,然后我发现我的问题是我正在计算和排序一个重数据数组(主要是浮点数和双打) 在渲染器函数中

    我的错误就在这里查看注释行

    - (void)renderer:(id <SCNSceneRenderer>)renderer updateAtTime:(NSTimeInterval)time
    {
    
        [self calculateMyData];    // This Is Wrong
    
     }
    
    - (void)calculateMyData
    {
       // the Heavy Calculations 
    }
    

    为了避免大多数 IOAF 错误,请尽量不要在渲染器中进行繁重或复杂的计算,例如排序数据等,请尝试使用外部循环来调用此计算。这就是我所做的

    - (void)viewDidLoad
    {
        // I Use A Timer Loop Every 0.3 Sec to call the heave calculations and sort data
    
        NSTimer *timerCounter2 = [NSTimer scheduledTimerWithTimeInterval:0.3 target:self selector:@selector(calculateMyData) userInfo:nil repeats: YES]; 
    
    }
    - (void)renderer:(id <SCNSceneRenderer>)renderer updateAtTime:(NSTimeInterval)time
    {
        //[self calculateMyData];    // Now I Avoid The Mistake    
    }
    
    - (void)calculateMyData
    {
       // the Heavy Calculations 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-24
      • 2019-12-18
      • 2021-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多