iOS Metal:着色器中使用的变量数量限制

3
今天我在着色器中添加了一些复杂度之后,开始出现以下错误:
Execution of the command buffer was aborted due to an error during execution. Discarded (victim of GPU error/recovery) (IOAF code 5)

我发现问题并不是与实际添加的代码有关,而是因为我添加了更多的变量和函数调用。我尝试从着色器中删除其他复杂性,错误就被解决了。
另一件我发现的事情是,当我将快速数学设置为false时,问题也被解决了。
我的第一个猜测是,在快速数学开启时,存在某种变量数量限制。是否存在这样的限制?还有其他什么原因可能导致此类错误?
1个回答

0
最有可能的原因是Metal缓冲区或着色器过载了,使用Metal技术存在限制,这里有详细说明。

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 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接