【问题标题】:Multi-threaded OpenGL Programming in Cocos2D-iPhoneCocos2D-iPhone中的多线程OpenGL编程
【发布时间】:2009-07-15 18:32:54
【问题描述】:

为了尝试为我正在开发的 iPhone 游戏(使用 Cocos2D)创建加载栏,我想使用多线程方法。

一个线程显示加载屏幕并运行主应用程序事件循环,而一个新线程在后台静默加载所有 Sprite(通过 spriteWithFile),然后将它们添加到图层。

我使用 NSThread 的 detachNewThreadSelector 方法创建新线程(该方法通过 performSelectorOnMainThread 将加载状态的更新发送到主线程)。

我面临的问题是新线程中的任何 OpenGL 调用(例如在 spriteWithFile 方法中发现的调用)都会因 BUS ERROR 或某种内存访问错误而死掉。我假设这是因为两个线程都试图同时进行 OpenGL 调用,或者新线程不知道 OpenGL 上下文。

必须做些什么才能允许多个线程在使用 Cocos2D-iPhone 的 iPhone 上进行 OpenGL 调用。

【问题讨论】:

    标签: iphone multithreading opengl-es cocos2d-iphone


    【解决方案1】:

    作为记录,新线程需要执行以下两行才能从并发线程中使用 OpenGL API:

    EAGLContext *k_context = [[[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1 sharegroup:[[[[Director sharedDirector] openGLView] context] sharegroup]] autorelease];
    [EAGLContext setCurrentContext:k_context];
    

    现在,Cocos2D 0.8.x 及更高版本的 TextureMgr 类提供的 addImageAsync 方法已过时,该方法为您执行异步纹理加载。

    【讨论】:

      【解决方案2】:

      我也想这样做。

      我从this thread开始。

      PS:这个答案很老了,现在我不确定异步纹理加载是否像以前那样有用,因为 iOS5 通过CVOpenGLESTextureCaches 添加了“免费”纹理上传。当然,您仍然可以(并且应该)在辅助线程中加载您的资源,但现在似乎没有必要为该线程提供EAGLContext

      【讨论】:

      • 第一个答案中的链接: 1. 我收到来自浏览器的恶意软件警告。当我仍然说忽略它时 2. 我得到 404。
      【解决方案3】:

      Apple 对多线程 OpenGL 有一些很好的指导方针here

      【讨论】:

        【解决方案4】:

        Cocos2d best practices 建议不要使用 NSTimer,我认为这同样适用于线程。你应该使用 Cocos 的Timer object。这会将线程管理留给 Cocos,并且还应该让您访问正确的图形上下文。 HTH。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-08-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-28
          • 1970-01-01
          相关资源
          最近更新 更多