我在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明顯顯示黑屏,因爲調整大小時失敗。
我試圖拆除framebuffer並在resizeFromLayer中創建一個新的,我得到了相同的行爲,所以沒有奏效。 – michill
我也確定在resizeFromLayer中,圖層對於iPad Retina具有rasterizationScale = contentScale == 2,但兩者對於iPad AIR均等於1536。 – michill