gpt4 book ai didi

iphone - EAGLView 到 UIImage 的时序问题

转载 作者:行者123 更新时间:2023-11-28 17:43:44 30 4
gpt4 key购买 nike

我有一个 EAGLView,我希望将其转换为 UIImage。我可以使用此处发布的解决方案来做到这一点:

How to get UIImage from EAGLView?

但是,如果在创建 EAGLView 和 UIImage 之间经过了一小段时间,我只能完成此操作。

这段代码创建了一个 EAGLView,然后又创建了一个 UIImageView,但它不起作用:

EAGLView *EAGLphoto = [[EAGLView alloc] initWithImage:photo.workAreaImage];

[theWorkArea.photoArea1 addSubview:EAGLphoto];

//I put a glfinish() here but it didn't help

UIImageView *photoView = [[UIImageView alloc] initWithImage:[self glToUIImage]];
//glToUIImage is taken from the link above

[theWorkArea.photoArea2 addSubview:photoView];

我假设 UIImageView 尝试在 EAGLView 创建完成之前创建。我试图在两者之间放置一个 glfinish() 但它什么也没做。当我运行代码时,EAGLView 显示正常,但 UIImageView 显示为黑色。

但是,上述代码的修改版本有效:

EAGLView *EAGLphoto = [[EAGLView alloc] initWithImage:photo.workAreaImage];

[theWorkArea.photoArea1 addSubview:EAGLphoto];

[self performSelector:@selector(getUIImage) withObject:nil afterDelay:0.1];

- (void)getUIImage {

UIImageView *photoView = [[UIImageView alloc] initWithImage:[self glToUIImage]];
//glToUIImage is taken from the link above

[theWorkArea.photoArea2 addSubview:photoView];

}

我是否错误地使用了 glfinish()?有比我的 hack 更好的方法吗?

最佳答案

通常,当您对 UIKit 对象进行可见更改而不是立即更新时,它们只是标记自己以在将来进行这些更改,然后在您下次放弃主线程时(通过返回到运行循环)。这不是实现中的错误或失败,实际上通常是您隐含的期望,这是您可以编写如下代码的原因:

view.frame = someNewFrame;
view.someOtherProperty = someOtherValue;

不用担心 View 会在采用其他更改之前明显地采用新框架。通常,您希望对 View 所做的事情看起来是原子的。

有时您会遇到这样的情况,就像您在这里遇到的那样,您已经请求的更改尚未生效的事实会暴露出来。 framesomeOtherProperty 将在上面的示例中返回它们的新值,因此您不必关心更改是否立即生效,但基于您对 performSelector:withObject:afterDelay: 您可能偶然发现了一种情况,即更改不会假装立即发生。

EAGLView 很难诊断,因为它并不是真正的 UIKit 功能。它所基于的 CAEAGLLayer 是,但 EAGLView 只是 Apple 在各种示例项目中为基于 CAEAGLLayer 构建的自定义 UIView 子类采用的名称.他们在他们的示例中对 EAGLView 的接口(interface)或实现并不一致,但我猜测它可能正在创建 OpenGL 帧缓冲区对象(即 OpenGL 使用的对象)存储与像素相关的数字,允许 glReadPixels 工作)只有在被要求对自己进行布局时才会进行布局,直到 UIKit 要求它这样做时它才会自行布局。直到你退出运行循环。

可以通过检查您拥有的 EAGLView 的代码来确认该诊断。如果由于 layoutSubviewsdrawRect 或其他一些不是由相关的 init 直接调用然后证明这一点。

假设诊断是正确的,您可以调整 EAGLView,但我认为最好的解决方案可能就是坚持使用 performSelector:withObject:afterDelay:0。这不是竞争条件,因此该解决方案一点也不古怪或不可靠,它只是一种稍微迂回的说法“让 UIKit catch 所有这些指令,因为我知道这会让 EAGLView进入有意义的状态,然后继续我的事情”。

关于iphone - EAGLView 到 UIImage 的时序问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7047639/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com