iOS GL ES 2应用程序在设备上崩溃,但在模拟器上未崩溃

iOS GL ES 2应用程序在设备上崩溃,但在模拟器上未崩溃,ios,opengl-es-2.0,Ios,Opengl Es 2.0,我有一个应用程序,有许多渲染目标/帧缓冲区,在一次对GLDrawerElements的调用中,它会在设备(iPadiOS5.0)上崩溃,但不会在模拟器中崩溃。这是一个非常着色器密集的应用程序,有十几个不同的着色器和数千个顶点缓冲区 进一步调试该问题使我相信崩溃是由于某个特定着色器引起的,但该着色器是有效的,正在写入的帧缓冲区对象也是有效的。好的,因此在花费大量时间进行调试后,我发现我的景深着色器导致了崩溃,特别是此函数: float GetNearFalloff( float Depth, fl

我有一个应用程序,有许多渲染目标/帧缓冲区,在一次对GLDrawerElements的调用中,它会在设备(iPadiOS5.0)上崩溃,但不会在模拟器中崩溃。这是一个非常着色器密集的应用程序,有十几个不同的着色器和数千个顶点缓冲区


进一步调试该问题使我相信崩溃是由于某个特定着色器引起的,但该着色器是有效的,正在写入的帧缓冲区对象也是有效的。

好的,因此在花费大量时间进行调试后,我发现我的景深着色器导致了崩溃,特别是此函数:

float GetNearFalloff( float Depth, float MinDist, float MaxDist)
{
    float Range = MaxDist - MinDist;
    if (Depth < MinDist)
        return 1.0;
    /*else*/if (Depth > MaxDist)
        return 0.0;

    float Blur = 1.0 - ( (Depth - MinDist) / Range );
    return Blur;
}
float GetNearFalloff(float深度、float MinDist、float MaxDist)
{
浮动范围=MaxDist-Minist;
如果(深度<心智)
返回1.0;
/*else*/if(深度>最大距离)
返回0.0;
浮动模糊=1.0-((深度-心智)/范围);
返回模糊;
}

基本上是其他人造成了我的崩溃。除去这些,一切都正常了。我把它放回原处(我想可能是其他原因),结果发现在重新编译了两个着色器后,相同的崩溃出现在相同的修复中,删除了else。

好的,所以在花了大量时间调试之后,我发现我的景深着色器导致了崩溃,特别是这个函数:

float GetNearFalloff( float Depth, float MinDist, float MaxDist)
{
    float Range = MaxDist - MinDist;
    if (Depth < MinDist)
        return 1.0;
    /*else*/if (Depth > MaxDist)
        return 0.0;

    float Blur = 1.0 - ( (Depth - MinDist) / Range );
    return Blur;
}
float GetNearFalloff(float深度、float MinDist、float MaxDist)
{
浮动范围=MaxDist-Minist;
如果(深度<心智)
返回1.0;
/*else*/if(深度>最大距离)
返回0.0;
浮动模糊=1.0-((深度-心智)/范围);
返回模糊;
}

基本上是其他人造成了我的崩溃。除去这些,一切都正常了。实际上,我把它放回原处(我想可能是其他原因),只看到在两次着色器重新编译后,相同的崩溃以相同的修复出现,删除了else。

在着色器的函数中使用if,return,else if,return,return“会导致崩溃,使用”if,return,if return,return取而代之的是,模拟器运行在Mac电脑上,而Mac电脑在内存和性能特征方面都是截然不同的设备。我发现使用模拟器进行任何类型的OpenGL ES开发或测试几乎都是无用的,所以我几乎完全在设备上工作。在着色器的函数中使用if,return,else if,return,return会导致崩溃,使用“if,return,if return,return”取而代之的是,模拟器运行在Mac电脑上,而Mac电脑在内存和性能特征方面都是截然不同的设备。我发现使用模拟器进行任何类型的OpenGL ES开发或测试几乎都是无用的,所以我几乎完全在设备上工作。我有一个类似的问题,在一个显然是另一个的内部崩溃并返回。对我来说,从else语句中删除return可以解决崩溃问题,但更糟糕的解决方案是,代码会多运行几个周期。你对此还有什么见解吗?这可能只是iPad1内存有限的问题。我现在有一台iPad2,这个问题完全消失了:)。我认为iOS(还有Android)可能不允许GPU使用整个RAM,只允许使用其中的一部分。我在这方面还没有发现任何官方消息,但越来越多的经验正朝着这个方向发展。笔记本电脑上共享内存的英特尔GPU也在做同样的事情,所以可能手机上也会发生同样的事情。我有一个类似的问题,在一个显然是另一个内部返回的系统中崩溃。对我来说,从else语句中删除return可以解决崩溃问题,但更糟糕的解决方案是,代码会多运行几个周期。你对此还有什么见解吗?这可能只是iPad1内存有限的问题。我现在有一台iPad2,这个问题完全消失了:)。我认为iOS(还有Android)可能不允许GPU使用整个RAM,只允许使用其中的一部分。我在这方面还没有发现任何官方消息,但越来越多的经验正朝着这个方向发展。在笔记本电脑上使用共享内存的英特尔GPU也在做同样的事情,所以在移动设备上也可能发生这种情况。