CCSpriteBatchNode:使用单个帧还是整个纹理地图集?

3
使用CCSpriteBatchNode的好处是它的每个子节点不会被OpenGL单独绘制,如果你有很多在屏幕上相同的图像,使用批处理节点可以提高性能。
然而,我想知道如果将整个纹理图集加载到CCSpriteBatchNode中时会发生什么;这是否意味着当你使用纹理图集中的一个单一精灵帧时,它(在背后)绘制了纹理中的所有精灵帧?
换句话说,这样做和这样做之间的性能差异是否存在:
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"texture.plist"];

 CCSpriteFrame *starFrame=[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:@"throwstar.png"];

stars=[CCSpriteBatchNode batchNodeWithTexture:starFrame.texture];

[self addChild:stars];

或者可以直接使用整个纹理图集,而不是批处理节点的starFrame.texture

1个回答

1
CCSpriteBatchNode绘制其子节点。因此,只有添加到其中的子节点(必须是CCSprite对象)才会被绘制。由于精灵使用CCSpriteFrame,因此每个子节点仅呈现由精灵帧定义的纹理部分。
CCSpriteFrame对象保存对其使用的纹理的引用。这与CCSpriteBatchNode纹理相同。换句话说,精灵帧的纹理始终是纹理集的纹理,而不仅仅是其中的一部分。这就是CCSpriteFrame中的CGRect所做的工作,它指示精灵仅绘制较大纹理的特定区域。

当您说batchnode绘制其子节点时,它只会一次性“绘制”所有子节点,对吗(在一个批处理中,一个GL调用)?但是您还提到每个子节点仅呈现其纹理的一部分。因此,如果多个子节点具有来自相同batchnode纹理的不同帧,则每个子节点都会获得自己的渲染调用,因为它是纹理的不同部分? - johnbakers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接