2011-02-14 56 views
0

我的应用程序使用Cocos2D进行动画和2D渲染,但“游戏大厅”(这不是它是什么,但对于所有意图和目的)都是标准的UIView/UIKit代码。当标准UIKit UIView可见时,预加载Cocos2D纹理

我有一个UIViewController的子类,其主视图在XIB文件中设置为EAGLView。当我把所有的Cocos加载代码放入viewDidLoad时,一切都按预期工作,除了Cocos加载所有纹理时有1-2秒的冻结。

我有大约20种纹理,我在运行场景之前预加载到CCSpriteFrameCache之前 - 所以我的动画立即变得平滑。

我试图将此纹理加载代码移动到我的视图控制器的init方法 - 但是当我尝试这种方法时,Cocos崩溃,看起来是因为没有OpenGL上下文来处理。

我想要做的是,当显示UIViewController的主视图(而不是阻塞主线程)时,我想在背景中加载纹理,然后在完成后,在该UIView和OpenGL EAGLView

我知道现在Cocos中有一个addImageAsync:调用,所以它实际上只是一个“传递屏幕外EAGLView/EAGLContext”的问题,当我准备显示该视图时,它最终可以粘贴到Cocos。

有没有人有对此优雅的解决方案的任何指针?

回答

1

这个问题的解决方案是创建一个单独的EAGLContext,使用它我会加载纹理。该EAGLContext需要与我用于呈现内容的实际GL视图共享一个EAGLSharegroup。因此,步骤的工作是这样的:

  1. 创建/负载/展示我的UI查看
  2. 创建我要被使用EAGLView
  3. 抽丝EAGLSharegroup关闭该EAGLView
  4. 创建EAGLContext使用sharegroup
  5. 使用EAGLContext
  6. 我UIView切换到EAGLView
  7. 纹理加载和可用
  8. 载入我的纹理
+0

如果您可以在开始时获得最终上下文,为什么不直接将纹理直接加载到它呢?为什么要创建第二个? – 2011-04-11 03:47:21