2015-07-20 93 views
0

我在Google和这里搜索了对此的答案。我发现了类似的问题,但不是这个问题,也没有答案。我也是xCode和Apple开发人员的新手,在苹果开发人员离开后我继承了这个项目。renderbufferStorage在iPad AIR上失败,但在iPad上没有Retina gen 4

这是使用cocos2d v0.99.4-rc3,iOS 8.3,Xcode 6.3.2。此外,这适用于iOS 7.1,并在我升级xCode之前。我同时在iPad上升级了xCode和iOS。

在下面的代码中,backingWidth_和backingHeight_在iPad Retina上设置为1536和2048,但在iPad AIR上设置为0。

当我在执行renderbufferStorage之后调用glGetError()时,在AIR上返回0x0501(GL_INVALID_VALUE),但在Retina上返回0x0000,所以我认为在将'layer'传递给它时renderbufferStorage存在问题为AIR。 glBindRenderbufferOES()执行后调用glGetError()将为AIR和Retina返回0x0000。我在Build Settings中列出了有效架构的arm64,armv7和armv7;但只有armv7和arm64显示在显示架构的第一行中,正好位于Base SDK上方。

- (BOOL)resizeFromLayer:(CAEAGLLayer *)layer 
{ 
    // Allocate color buffer backing based on the current layer size 
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer_); 
    [context_ renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:layer]; //This is fine on iPad Retina but causes error for AIR 
    GLenum_error = glGetError(); //this returns 0x0501 (GL_INVALID_VALUE)on the iPad AIR, but 0x0000 on the Retina. 

    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth_); //equals 1536 on Retina, 0 on AIR 
    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight_); //equals 2048 on Retina, 0 on AIR 

    if (glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) //this fails, so the resizeFromLayer returns NO. 
{ 
    NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES)); 
    return NO; 
} 

resizeFromLayer从layoutSubviews称为()

- (void) layoutSubviews 
{ 
    [renderer_ resizeFromLayer:(CAEAGLLayer*)self.layer]; 
    size_ = [renderer_ backingSize]; 

    // Avoid flicker. Issue #350 
    [[CCDirector sharedDirector] drawScene]; 
} 

任何人都经历这一点,你是怎么改正它。这里讨论的一个条目是在销毁黑屏时销毁帧缓冲区,然后在resizeFromLayer内部创建一个新的帧缓冲区,但这不是特定于AIR的。我还没有尝试过,但是如果它有效,我会将其作为可能的解决方案发布。关于该解决方案的一些评论表示,它掩盖了真正的潜在问题,这就是我问这个问题的原因。

应用程序代码在Retina和AIR上都成功构建,但在iPad和模拟器中,AIR明显显示黑屏,因为调整大小时失败。

+0

我试图拆除framebuffer并在resizeFromLayer中创建一个新的,我得到了相同的行为,所以没有奏效。 – michill

+0

我也确定在resizeFromLayer中,图层对于iPad Retina具有rasterizationScale = contentScale == 2,但两者对于iPad AIR均等于1536。 – michill

回答

0

由于没有人回复,我花了一段时间才弄清楚这一点,尤其是因为我是xCode,iOS和cocos2d的新手。这个问题原来是使用旧版Cocos2d版本的64位/ 32位问题。坐标偏移量计算错误,图像大小返回为0.如果Cocos2d已升级到较新版本,则可能不会出现浮点/双线不匹配。