2

我有一个与 OpenGL 代码相关的内存管理问题很难追踪。我 99% 确定问题是内存泄漏,但我发现确切的问题难以追踪。

以下代码片段显示了glDrawArrays()对我自己的自定义对象的实例方法内部的块内部的调用。

我的 iPad 应用程序在满足以下条件时崩溃:

1. 我一定是用 Xcode 6.4 编译了这个应用程序。

在 Xcode 6.2 下编译应用程序可以解决问题。

2. 我必须在 32 位 iPad 上运行应用程序才会崩溃。

在 64 位 iPad 上,应用程序不会崩溃(Xcode 6.2、Xcode 6.4)。在任何运行 Xcode 6.4 或 6.2 的模拟器上,应用程序都不会崩溃。该应用程序仅在 32 位物理硬件上崩溃。

typedef struct {
    int startPointIndex;
    int pointsNumber;
} ATEdgeGeometryIndexes;

typedef enum ATEdgeGeometryType {
    ATEdgeGeometryTypeLine = 0,
    ATEdgeGeometryTypeZeroPoint,
    ATEdgeGeometryTypeNotches,
    ATEdgeGeometryTypeZoneC,
    ATEdgeGeometryTypeZoneD,
    ATEdgeGeometryTypeAngleCircle,
    ATEdgeGeometryTypePerpendicular,
    ATEdgeGeometryTypeRotatedArc,
    ATEdgeGeometryTypeNumber
} ATEdgeGeometryType;

typedef enum ATEdgeRulerType {
    ATEdgeRulerTypeNormal = 0,
    ATEdgeRulerTypeShadow,
    ATEdgeRulerTypeNumber
} ATEdgeRulerType;

union _ATMatrix4 {
    struct {
        ATFloat m00, m01, m02, m03;
        ATFloat m10, m11, m12, m13;
        ATFloat m20, m21, m22, m23;
        ATFloat m30, m31, m32, m33;
    };
    ATFloat m[16];
} ATMatrix4Attributes;
typedef union _ATMatrix4 ATMatrix4;

typedef struct {
    ATMatrix4 lineMatrix;
    ATMatrix4 notchesMatrix;
    BOOL zeroPointOnScreen;
    GLKVector4 color;
} ATEdgeRuler;

@interface ATLineEdgeTool () {
    ATEdgeRuler rulers[ATEdgeRulerTypeNumber];
    ATEdgeRuler arrayRulers[32];
    ATEdgeGeometryIndexes _geometryIndexes[ATEdgeGeometryTypeNumber];
}

-(void) render {
    // do some stuff

    void (^drawEdgeRuler)(ATEdgeRuler) = ^(ATEdgeRuler ruler) {

        // do some more stuff
        glDrawArrays(GL_LINE_STRIP, _geometryIndexes[ATEdgeGeometryTypeNotches].startPointIndex,
                     _geometryIndexes[ATEdgeGeometryTypeNotches].pointsNumber);
    }

    drawEdgeRuler(rulers[ATEdgeRulerTypeNormal]);
 }
4

0 回答 0