Ios GLGetRenderBufferParameterives返回错误的大小

Ios GLGetRenderBufferParameterives返回错误的大小,ios,ios5,opengl-es,Ios,Ios5,Opengl Es,我目前正在开发一个iOS应用程序,它需要利用其视图的renderbuffer。可以通过手势调整这些视图的大小,因此,我正在调整renderbuffer的大小 但是,当用户将视图大小调整为fast时,glGetRenderBufferParameterives(GL_RENDERBUFFER_OES、GL_RENDERBUFFER_WIDTH_OES和backingWidth)返回错误的值 glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuff

我目前正在开发一个iOS应用程序,它需要利用其视图的renderbuffer。可以通过手势调整这些视图的大小,因此,我正在调整renderbuffer的大小

但是,当用户将视图大小调整为fast时,
glGetRenderBufferParameterives(GL_RENDERBUFFER_OES、GL_RENDERBUFFER_WIDTH_OES和backingWidth)返回错误的值

glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);

if(NO == [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(id<EAGLDrawable>)self.layer]) {
    NSLog(@"renderBufferStorage unsucessful!");
}
NSLog(@"_ %d %d", (int)self.layer.bounds.size.width, (int)self.layer.bounds.size.height);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);

glGenRenderbuffersOES(1, &depthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);

if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) == GL_FRAMEBUFFER_COMPLETE_OES) 
    NSLog(@"+ %d %d", backingWidth, backingHeight);
虽然快速调整大小(这里是增长,而不是收缩)给了我以下输出(这不好,差异太大)

如果我对结果不满意(立即和延迟),我已经尝试过人工延迟调整大小或再次调用resize函数,但都没有成功

在现有代码中很难合并的解决方案是在纹理中渲染,然后在视图上绘制纹理。renderbuffers/EagleDrawable是否有什么我遗漏的地方,或者API是否不适合实时调整大小


我已经检查了Glerror,但没有任何结果。

我真的不知道为什么会发生这种情况,但这里有一些想法:

可能在
layoutSubviews
时间层的备份存储尚未更新。您可以尝试将其移动到
CADisplayLink
回调,看看是否有更好的结果


如果您的目标是iOS 5+,另一种选择是使用
GLKView
,或者允许
CALayer
在live resize期间缩放其内容。

我真的不确定为什么会发生这种情况,但以下是一些想法:

可能在
layoutSubviews
时间层的备份存储尚未更新。您可以尝试将其移动到
CADisplayLink
回调,看看是否有更好的结果


如果您的目标是iOS 5+,另一种选择是使用
GLKView
,或者允许
CALayer
在live resize期间缩放其内容。

您发布的代码在哪里运行?它在主线上吗?它是否在CADisplayLink回调中?它在主线程(com.apple.main thread)中通过LayoutSubview调用。堆栈跟踪如下所示:
0-[MyClass resize]1-[MyClass layoutSubviews]2-[UIView(CALayerDelegate)LayoutSublayerOfLayer:
您发布的代码在哪里运行?它在主线上吗?它是否在CADisplayLink回调中?它在主线程(com.apple.main thread)中通过LayoutSubview调用。堆栈跟踪如下所示:
0-[MyClass resize]1-[MyClass layoutSubviews]2-[UIView(CALayerDelegate)LayoutSublayerOfLayer:
谢谢您的回答!我尝试将调整大小的代码移动到显示链接,但不幸的是,出现了相同的问题。备份缓冲区的大小似乎没有正确调整,因为对大小的重复查询(如在显示链接中)会返回相同的结果。请澄清“允许CALayer在实时调整大小期间缩放其内容”是什么意思?我的意思是,在实时调整大小完成之前,您可以避免调整渲染缓冲区的大小,并在CALayer上使用适当的内容模式以保持外观正常。我真的不明白为什么需要这样做。谢谢你的回答!我尝试将调整大小的代码移动到显示链接,但不幸的是,出现了相同的问题。备份缓冲区的大小似乎没有正确调整,因为对大小的重复查询(如在显示链接中)会返回相同的结果。请澄清“允许CALayer在实时调整大小期间缩放其内容”是什么意思?我的意思是,在实时调整大小完成之前,您可以避免调整渲染缓冲区的大小,并在CALayer上使用适当的内容模式以保持外观正常。不过,我真的不明白为什么需要这样做。
_ 452 321
+ 450 319
_ 453 322
+ 452 321
_ 453 322
+ 452 321
_ 453 323
+ 453 323
 _ 491 350
 + 456 325
 _ 555 394
 + 491 348
 _ 548 390
 + 554 394
 _ 540 384
 + 548 390
 _ 459 326
 + 539 383
 _ 389 277
 + 459 326
 _ 313 222
 + 389 275