我正在尝试绘制线程中的CCRenderTexture
。我有:
EAGLSharegroup *sharegroup = [[[[CCDirector sharedDirector] openGLView] context] sharegroup];
EAGLContext *k_context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2 sharegroup:sharegroup];
[EAGLContext setCurrentContext:k_context];
在线程的开头。除了CCSprite.draw
之外,一切都很好。我已经测试了渲染纹理:
[rt beginWithClear:1 g:1 b:1 a:1];
[sprite visit];
[rt end];
调用[CCSprite visit]
不会绘制精灵。 glGetError
在所有步骤中返回 0。
为了进一步调查这个问题,我将所有内容都放在 UI 线程中,并删除了上下文调用,我会看到使用相同的代码正确绘制了精灵。我还通过将这个精灵添加到场景中来验证这个精灵是正确的。
即使我不使用线程,放置上面的"上下文设置调用"也会使CCSprite.draw
停止工作,但只有在绘制到CCRenderTexture
时。如果它在屏幕上绘制,则工作正常。
有什么想法可以解决这个问题吗?提前感谢!
您只能在创建 cocos2d OpenGL 视图 (CCGLView) 的同一线程上绘制,这通常是主线程。这也是为什么调度到主队列可以解决问题的原因,但它也会阻止相关代码的并行执行,因为它现在在主线程上运行。
如果要通过使用多个线程来加快速度,请考虑并行化应用的其他算法,例如寻路、AI 或其他关键代码路径等游戏逻辑。