2015-05-09 134 views
1

最近我决定再次选择一个游戏开发项目,我几年前开始提交给iOS应用程序商店。我发现我的应用程序在iPhone5s上显示黑屏,即使它运行正常。我有一台iPhone 3GS,并且已经在iPhone 4上进行了测试,并且工作正常。OpenGL ES 1.1 iPhone5 + IOS 8黑屏

这里有一个线程,有人有类似的问题,说iPhone的后续版本与OpenGLES 1.1向后兼容,而且这只是他的代码中的错误。但实际的线程没有指定他是如何解决它的。资料来源:Similar Stack Overflow Thread

我知道iPhone的所有版本都应该与OpenGLES 1.1向后兼容,但它似乎已经随着新手机而改变。 (也许它与金属有关?我在我的研究中注意到他们在iPhone 5s及更高版本上实施了金属处理。)

我一直在寻找关于此主题的一段时间,但找不到任何东西,或许将我的项目移植到OpenGLES 2会更好吗?有没有人知道这个怪异的iPhone版本错误?

回答

1

当您告诉OpenGL您提供的数据为GL_FLOAT时,它预计GLfloat数据。 GLfloatfloat的类型定义。

CGFloat是32位设备上的float和64位设备上的double的typedef。

所以这个问题是一个错误的假设,GLfloatCGFloat是同一类型的不同名称。他们不是。

顺便说一句,这是苹果现在供应GLKVector2 et seq的部分原因。如果你想方便,你应该使用它,它的make功能和GLKit的其余部分。

+0

我选择这个答案作为正确的答案,因为它更容易使用提供的数据结构,而不是像我那样自己做。 –

1

事实证明,OpenGL(而不是特定版本)在64位设备上要严格得多:iPhone5s +。 CGFloats可以在这些设备上工作(这包括CGPoints,因为它们包含CGFloats。)使用GLFloats是因为OpenGL库为此提供了GLFloats。

所以在我的情况下,我做了一些结构来取代CGFloats例如:

//structure to replace CG Point for 64-bit device compatability 
typedef struct { 
    GLfloat x; 
    GLfloat y; 
} GLPoint; 
//returns a GLPoint to replace CGPoint structure to support 64-bit devices 
static inline GLPoint GLPointMake(GLfloat x, GLfloat y) { 
    return (GLPoint) {x, y}; 
} 

我用这个代替CGPoints在我的代码来解决这个问题。在使用顶点在64位设备上呈现时,此代码将正确移植。

+1

作为一个评论活动太长,所以我在一个单独的答案扩大了这一点;希望它能增加对话。看看'GLKVector2',而不是写自己的。 – Tommy