cocos2d-x“即时模式”?

我有一些c ++游戏代码,在“即时模式”下的每个游戏循环周期中绘制游戏状态。 我的意思是,游戏代码不会添加任何types的“场景图”或其他数据结构的精灵。 它从每个游戏循环周期的一个空白的石板开始,并从后面堆积在精灵之前。 (我知道你可能想知道这个c ++代码实际上在使用什么 API,它是用Marmalade编写的,我正在离开,Marmalade提供了一个抽象层,这个问题的实质就是replace这个抽象层。

我很难理解“直接模式”在操作中的真正意义,以及它与“固定function”与“可编程”stream水线的关系。 我读过的一些东西说,不要使用旧的即时模式函数,而应该使用基于现代着色器的可编程API。“但同时,我相信在opengl es 2.0中glDrawArrays()可以使用,对吧?这是一个“即时模式”function。

(我相信这里所说的“直接模式”是指不同层次的不同事物,我的理解是像cocosd2-x这样的库是“保留模式”,因为你可以在引擎管理的场景图上添加精灵。但是在opengl级别本身,我认为“即时模式”意味着有点不同,即是否将重要的绘图结构保留在CPU空间中,直到用begin()end()三明治绘制它们,而不是提前上传它们所以它可以感知GPU在通话过程中“保留”你的数据,但是你仍然可以使用glDrawArrays()来一次一个堆积一个精灵,必要。)

在cocos2d-x的“hello world”例子中,我们看到了

// add the sprite as a child to this layer this->addChild(sprite, 0); 

这正是我不想做的事情,因为正如我所说的,我的代码库设置时并没有将精灵视为对象,而是像从堆叠在顶部的纹理表(图集)中绘制一堆矩形彼此的。 我不想考虑在一些场景图中join精灵,并且“让引擎照顾它”。 一般来说,这可能是一种很好的思维方式,但是这将涉及到对现有代码的大量重写。

另一方面,我我喜欢cocos2d-x的想法,因为它给了我一个方便的方法来开发一个代码库,我可以在Windows上开发并运行在iPhone,Android和其他地方。

所以我想了解的是:我可以在一些“即时模式”的时尚使用cocos2d-x?

基本上,在opengles 2.0,我被允许调用glDrawArrays(),正确的? 如果我以合理的方式批量join我的精灵,我可以限制在每一帧中调用glDrawArrays()的次数。 所以我想这样做,而且我自己写这个gl代码是很好的。 但是我认为 ,尽管也许这首先解决了使用cocos2d-x的一些问题,但是使用cocos2s-x vs从头开始编写自己的东西,仍然有很大的可移植性,而不是重新发明轮子的优势。

那么我可以用“即时模式”的方式使用cocos2s-x,并且仍然保留一次写入/运行的好处?

Cocos2d-x可以在即时模式下绘制,在2.x中可以轻松完成,但在3.x中也是可行的。 基本上你有两种方法来做到这一点:

  • 最简单的方法是创建自己的inheritance自CCNode(或Node,如果你使用v3.x)的类并覆盖它的void draw() (或者v3.x void draw(Renderer *renderer, const Mat4& transform, uint32_t flags); )function。
    这是大多数的cocos2d类自己实现的。 比如你提到的CCSprite,在后台做同样的事情。

  • 一个更复杂的方法是重写“void visit”(或者v3.x virtual void visit(Renderer *renderer, const Mat4& transform, uint32_t flags); )函数。 通常这个函数完成所有这些节点转换,然后开始将所有的子节点从最小的zOrder渲染到最高的。 在zOrder = 0的第一个孩子之前,它也调用它的draw函数。

  • 如果你正在使用cocos2d-x v3.x,你应该使用CustomCommand。

那么你应该什么时候重写这些函数呢? 想想这样,你们这个类是要集成到cocos2d的代码stream中,还是要打破一切,并且把你自己的东西全部实现起来? 如果是前者,我建议你用压倒一切的方法来进行,如果是后来压倒一切的访问是明智的。

如果你想了解更多关于cocos2d-x每个框架如何处理的信息,请看一下Director::drawScene() ,你将在每个框架中基本上find这些按照指定的顺序完成的:

  1. 计算delta_time
  2. 过程input(又名触摸事件,关键事件…)
  3. 更新function和操作
  4. 在运行场景上调用访问function
  5. (在v3.x的情况下)做实际的渲染的东西