Imrazor's Blog

Stay Hungry, Stay Foolish

Cocos2d中比较重要的类

一、CCDirector,导演,单例,主要负责场景切换,控制OpenGL ES中的一些设置(如投影)。 CCDirector有四种类型:
1、CCDirectorTypeNSTimer,如果你的程序中要使用uikit中的对象并且支持ios3.1以前的版本,使用此类型,此类型下可以设置每秒刷新率1~60;
2、CCDirectorTypeMainLoop,比上个导演类型稍快,这个类型下使用uikit相关对象效果不好,并且不能自定义刷新率;
3、CCDirectorTypeThreadMainLoop,跟上个差不多,这个导演有在一个独立线程中有个timer来控制主线程中的main loop;
4、CCDirectorTypeDisplayLink,通过CADisplayLink刷新屏幕,这个类型下可以使用uikit中的对象,在ios3.1以上的版本才能使用这个类型,刷新率可以定为60,30,15每秒

二、CCNode,一个父类,这个父类中包含了对OpenGL ES的操作,对action的展现等等

三、CCScene,场景,CCNode的子类,同一时间CCDirector只能有一个场景,场景持有屏幕上所有的可见对象,是CCLayer的容器

四、CCLayer,层,CCNode的子类,可以捕获touch和accelerometer事件,是CCSprite或其他可视游戏对象的容器

五、CCSprite,精灵,CCNode子类,包含一些逻辑和图片的控制,比如你游戏中的敌人,主角,物品等等都是精灵

六、CCSpriteBatchNode,CCNode子类,以前的版本叫sprite sheet,使用CCSpriteBatchNode有诸多好处:
1、减少OpenGL ES的bind call,这里简单说下图片的载入。当一张图片要显示时,首先它会被转为texture,之后装入内存,因为GPU大多认识解压后的图片(png是压缩格式的图片,GPU也可以处理一些压缩格式的,比如PVRTC),然后通过OpenGL ES把这张图片画到屏幕上,当一个场景载入大量图片时,势必会多次调用OpenGL ES,这样GPU都压力就会很大,帧数就掉下来了。使用CCSpriteBatchNode可以一次性的把当前场景所有的图片都载入进来,从而减少大量GPU的运算,帧数自然就高了;
2、减少内存占用,其实这一点现在已经不是最重要的了,因为3gs以后的设备都支持NPOT(NON POWER OF TWO)了。老GPU保存texture的时候只能存为power-of-two的大小,也就是你都图片是50x50像素的,最后在内存中最后就变为64x64的了,那么64 * 64 – 50 * 50这么大块的内存相当于浪费掉了(实际上,CPU和GPU操作图片内存地址不是一个,所以当GPU操作图片的时候,这个图片还要被考到GPU能操作的内存区域,所以那部分浪费都内存还会再被拷贝一便)。而使用texture atlas就没必要担心这个了,texture atlas让你把一个一个的图片放到一起,然后一次性载入内存,这样那些每张图片都浪费一点的内存就会大大减少了。不过从cocos2d1.1以后,默认只要设备支持NPOT,就会自动开启NPOT

Comments