ios的opengl究竟能不能在非主线程渲染

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ios的opengl究竟能不能在非主线程渲染相关的知识,希望对你有一定的参考价值。

参考技术A 可以,但很少这样做,使用eglMakeCurrent,使当前线程绑定gl上下文,几乎不会用多个线程去渲染,因为opengl是基于状态机的,另外,opengl在多个线程之间切换的开销也很大(即eglMakeCurrent的开销是不可忽视的)

IKImageBrowserView "--ImageKit 错误:在非主线程中调用了 reloadData"

【中文标题】IKImageBrowserView "--ImageKit 错误:在非主线程中调用了 reloadData"【英文标题】:IKImageBrowserView "--ImageKit Error: reloadData called in non main thread" 【发布时间】:2011-01-09 20:10:25 【问题描述】:

我正在编写一个使用 IKImageBrowserView 的 Cocoa Mac 应用程序。 当我调用以下内容时:

[imageBrowserView reloadData];

调试器控制台打印:

--ImageKit Error: reloadData called in non main thread

我尝试将 reloadData 方法放在另一个方法中,然后调用以下内容:

[self performSelectorOnMainThread:@selector(reloadMyView) withObject:nil waitUntilDone:NO];

但我仍然得到相同的 ImageKit 错误。有什么想法吗?

【问题讨论】:

【参考方案1】:

** 已修复 **

原因是结合使用 Bindings 从 NSArrayController 填充我的 IKImageBrowserView,以及在填充更新后调用保存在它自己的 NSManagedObjectContext 上的 NSOperation。

我有一个通知观察器,用于保存 NSOperation 中的上下文,因此我可以 mergeChangesFromContextDidSaveNotification 到我的主线程上下文,但我需要在 MainThread 上执行此操作。 NSArrayController 将 automaticallyPreparesContent 设置为 YES,“也注册为其托管对象上下文的观察者”。因此,由于从通知执行合并,这是在与 NSOperation 相同的单独线程上完成的,因此 NSArrayController 再次在单独的线程上准备它的内容,然后再次在单独的线程上更新 IKImageBrowserView导致错误/警告。

【讨论】:

以上是关于ios的opengl究竟能不能在非主线程渲染的主要内容,如果未能解决你的问题,请参考以下文章

在非主线程里面使用NSTimer创建和取消定时任务

非主线程中的QApplication

为何invalidate()不可以直接在UI线程中调用

关于message的内存优化

Android Handler 消息机制原理解析

Android Handler 消息机制原理解析