我有一个与 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]);
}