Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone iOS中的OpenGL ES缓冲区?_Iphone_Ios_Ipad_Opengl Es - Fatal编程技术网

Iphone iOS中的OpenGL ES缓冲区?

Iphone iOS中的OpenGL ES缓冲区?,iphone,ios,ipad,opengl-es,Iphone,Ios,Ipad,Opengl Es,我在iOS上从OpenGL捕获图像时遇到了一个奇怪的问题。我使用苹果的示例代码创建了一个视图,允许用户对图像进行注释。生成的绘制视图随后作为用户输入表单的一部分添加到各种UITableViewCell中。完成表单后,使用以下采样代码(在my PaintingView中)将用户注释捕获到UIImage 在我的应用程序中,用户可以在两个表单之间切换,这两个表单都包含一个用于注释的PaintingView。如果用户提交初始表单,或切换到辅助表单,则图像捕获工作正常。如果用户提交初始表单,然后从切换到辅

我在iOS上从OpenGL捕获图像时遇到了一个奇怪的问题。我使用苹果的示例代码创建了一个视图,允许用户对图像进行注释。生成的绘制视图随后作为用户输入表单的一部分添加到各种UITableViewCell中。完成表单后,使用以下采样代码(在my PaintingView中)将用户注释捕获到UIImage

在我的应用程序中,用户可以在两个表单之间切换,这两个表单都包含一个用于注释的PaintingView。如果用户提交初始表单,或切换到辅助表单,则图像捕获工作正常。如果用户提交初始表单,然后从切换到辅助表单,那么原始注释中的工件将显示在第二个表单上

在这里,用户注释并提交初始表单。

在这里,一旦用户开始注释辅助表单,就会出现来自初始表单的工件。


这个问题似乎与采样代码有关,因为它只在采样之后出现(我可以在表单之间切换并注释每个表单,只要我不先采样就可以了)。知道这里发生了什么吗?

我不确定这里到底是什么问题(看起来缓冲区内存被破坏了,但我找不到地址空间可能重叠的地方)

最初的Apple代码使用LayoutSubView在布局发生变化时动态调整绘制表面的大小,并在每次调用时删除和重新创建帧缓冲区。因为我将绘制视图放在表视图单元格中,所以在滚动期间会多次调用layoutSubviews,从而导致不必要地多次创建和删除缓冲区。似乎通过这些多次调用,缓冲区地址空间在某个地方被破坏了

在将缓冲区分配移动到我的初始化例程中,以便只执行一次之后,一切正常

- (UIImage*)getImage {

    // calculate buffer size
    NSInteger dataLength = backingWidth * backingHeight * 4;
    void *buffer = (GLubyte*)malloc(dataLength);
    GLubyte *data = (GLubyte*)malloc(dataLength * sizeof(GLubyte));

    // transfer image from frame buffer
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
    glPixelStorei(GL_PACK_ALIGNMENT, 4);
    glReadPixels(0, 0, backingWidth, backingHeight, GL_RGBA, GL_UNSIGNED_BYTE, data);

    // capture image
    CGDataProviderRef ref = CGDataProviderCreateWithData(NULL, data, dataLength, NULL);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGImageRef imageRef = CGImageCreate(backingWidth, backingHeight, 8, 32, backingWidth * 4, colorSpace, kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast, ref, NULL, true, kCGRenderingIntentDefault);
    UIImage *image = [UIImage imageWithCGImage:imageRef scale:1.0f orientation:UIImageOrientationDownMirrored];

    // clean up
    CGImageRelease(imageRef);
    CGColorSpaceRelease(colorSpace);
    CGDataProviderRelease(ref);
    free(buffer);
    free(data);

    // capture image
    if( image == nil)
        NSLog(@"Save EAGLImage failed to bind data to a UIImage");

    return image;
}