ios metal:限制着色器中使用的变量数量

时间:2017-05-10 20:47:17

标签: ios swift metal

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

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

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

我的第一个猜测是,当快速数学开启时,变量数量有某种限制。有这样的限制吗?还有其他想法可能会出现这种错误吗?

1 个答案:

答案 0 :(得分:0)

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

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 
}