异步GLKit的GLKViewController替换(异步OpenGL绘图)

时间:2015-04-13 11:20:31

标签: ios opengl-es grand-central-dispatch glkit

根据此question and its answer GLKViewController与async OpenGL绘图模式并不完全兼容。

是否有人知道任何开源或代码示例重新实现GLKViewControllerUIViewController子类)但有更多手动控件以便它可以与异步绘图一起使用?

1 个答案:

答案 0 :(得分:1)

这个问题太宽泛了。您正在寻找具有更多手动控制的样本?您应该更加具体地了解您的需求。

我不知道很多优秀的资源或示例实现了与视图控制器相比更高级别的东西,但我知道一些关于如何分离模块的非常好的程序以获得对异步的强大支持在iOS上使用openGLES。

有关如何移植GLKViewController的详细说明,您应列出您正在使用的项目,或者您在网络上找不到答案的项目。不幸的是,我对同时使用GLKViewControllerGLKView的看法只是"不要!"。

关于多线程的模块分离,我使用的是一个包装上下文的类,并使用一个线程初始化,并可选地使用另一个上下文包装器来支持上下文之间的共享。这个包装器的工作原理是传递包装器上调用的每个方法都在包装器绑定的线程上执行。另外,它还包含方法performBlock:performBlock:callback:,它们将在绑定线程上执行块,并可选择在完成后调用另一个块。

从此处开始,此包装器进一步子类化以包含当前上下文状态(用于优化),包括加载的着色器池(缓存)和加载的纹理池(缓存)。共享包装器也链接到创建它们的父级,因此只有父级包含池。

因此在背景中加载纹理的过程看起来像这样:

  • 仅从mainContext
  • 开始
  • 创建newThread
  • sharedContextmainContext
  • 创建newThread
  • 请求mainContext创建texture(仅获取ID)
  • 完成后请求sharedContext将纹理数据加载到texture,并在完成后通知mainContext
  • 使用texture执行您想要的操作并删除sharedContext或者保留以供日后使用。

现在我希望您可以通过此过程看到您可以轻松创建更高级别的系统,对于最常见的情况,您将创建一个包含两个上下文包装器,主上下文和后台工作程序的类。这种类型的系统应该非常易于维护,从使用角度来看,您永远不必担心多线程。

之后接近GLKViewController我有一个包含帧缓冲区和渲染缓冲区的类,它使用UIView进行初始化,以显示或初始化为生成纹理的大小用于FBO系统。因此,拥有一个包含此类和上下文包装器的视图控制器可能是一个非常强大的工具,看起来像你可能需要的那样。

如果您选择实施此类系统并遇到任何问题,我会很高兴听到它并帮助您或者更确切地知道您的成功。