最近,我决定再次开始一个游戏开发项目,该项目几年前开始提交iOS App Store。我发现我的应用程序在iPhone5s上显示了一个黑屏,即使运行还不错,我的应用程序也会显示。我有一个iPhone 3GS,并且在iPhone 4s上也进行了测试,并且可以正常工作。
这里有一个线程,有人遇到了类似的问题,说iPhone的后期版本与OpenGles 1.1兼容,这只是他的代码中的错误。但是实际的线程并未指定他如何解决。资料来源:类似的堆栈溢出线程
我知道,所有版本的iPhone都应该与OpenGles 1.1兼容,但是新手机似乎有所改变。(也许这与金属有关?我在研究中注意到他们在iPhone 5s和以后的版本上实现了金属。)
我已经在这个主题上搜索了一段时间,找不到任何东西,也许最好将我的项目移植到OpenGles 2?有人知道这个怪异的iPhone版本错误吗?
当您告诉OpenGL您正在提供GL_FLOAT
数据时,它会期望GLfloat
数据。GLfloat
是float
的打字。
CGFloat
是32位设备上的float
的打字和64位设备上的double
。
因此,问题是一个错误的假设,即GLfloat
和CGFloat
是同一类型的不同名称。他们不是。
顺便说一句,这是Apple现在提供GLKVector2
et Seq的部分原因。您应该使用它,如果您需要便利,它的功能和所有其余的Glkit。
这是OpenGL(不是特定版本)的问题,对64位设备:iPhone5s 更严格。CGFloats确实可以在这些设备上使用(这包括CGPoints,因为它们包含CGFLOATS。)使用Glfloats,因为这是由OpenGL库提供的此确切目的。
。因此,在我的情况下,我制作了一些结构来替换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};
}
我在代码中使用此而不是CGPONT来解决此问题。该代码在使用顶点在64位设备上渲染时将正确端口。