wanggg 的blog

关于Cocos2d-x中的scheduleUpdate和update方法的使用

一、如果要让某类实例对象要连续执行某些语句(比如让每个Block实例从运行框最右边移动到最左边)

要在Block类中增加一些东西

1. 先在其.cpp文件的init()函数中执行scheduleUpdate()方法。

2. 然后在.h中声明一个虚拟的函数update,并在.cpp文件中定义update,当init中执行scheduleUpdate()时,会不断地调用update函数,里面的语句也不断地被执行,直到执行unscheduleUpdate()时停止调用update()函数,unscheduleUpdate()语句一般放在update函数中,当满足某个条件时就执行。

二、如果要不断地创建某个类的实例对象(比如不断地创建新的Block在最右边),可以用到嵌套的update方法

要在GameController类中增加一些东西

1. 先在HelloWorld类的.cpp文件的init()函数中执行scheduleUpdate()方法。

2. 然后在HelloWorld类的.h文件中声明一个虚拟的函数update,并在.cpp文件中定义update,里面的语句也不断地被执行,语句具体是去调用GameController实例中的onUpdate()函数。

关于Cocos2d-x中物理世界的物体乱跳的问题的解决

这是电脑短时间内帧率低,无法满足游戏配置的帧率引起的。

解决方法:

第一种:

1.打开AppDelegate.cpp文件

2.把director->setAnimationInterval(1.0 / 60);改为 director->setAnimationInterval(1.0 / 50);或者更低一点。

这样游戏性能会有些许的下降,就是游戏会变的卡一点,但是物体不会乱跳,在真机上运行,我相信不会出现乱跳的情况。所以等开发完后再把帧率调回来。

第二种:

把setPosition里面的参数都用变量的形式表示,不要直接用常量,用变量比较稳定,亲试可行。

用常量表示其实是非常不好的,因为如果改变屏幕分辨率,就会造成混乱,最好是用屏幕尺寸的几分之几来表示。

第三种:

用简单的精灵节点来代替节点加子节点的形式,亲试可行。

Sprite::init();
setTexture("s_1.png");
setScale(0.2);
setPhysicsBody(PhysicsBody::createBox(this->getContentSize()));

浅谈cocos2d之autorelease\retain\release的理解

三种情况,引出问题:

(1) new出来的对象需要释放,而释放时,如果有其他人引用了这个对象,再次使用这个对象时,则会出现野指针情况。

==> 于是出现了引用计数的释放管理机制。

(2) 对于一个返回对象指针的方法,你若不看文档不看内部代码,你无法知道这个指针需不需要你来释放。同样的对于将一个指针或者对象作为参数给一个方法后, 你也无法知道这个方法会不会将你的对象释放掉。

==> 于是出现了谁拥有谁释放的管理思想。

(3)使用上述管理机制和思想后,有些特定情况。比如方法内新建一个对象,然后返回对象时,按照谁拥有谁释放的思想,对象是在方法内部创建的,方法退出前需要释放掉这个对象,但又要在退出时返回这个对象,先返回还是先释放都是不对的。

==> 于是出现了autorelease。

1、release和retain是配套的,释放管理是通过引用计数的。

cocos2d中各种action方法的应用

Action示例:

1、移动动作

cc.MoveBy:create(time, posX, posY) 在time时间内,相对当前位置基础上移动x,y个单位。

cc.MoveTo:create(time, posX, posY) 在time时间内,移动到cc.p(posX, posY)位置。

2、缩放动作

cc.ScaleBy:create(time, scaleX, scaleY) 在time时间内,相对当前大小缩放scale(scaleX, scaleY)个单位

cc.ScaleTo:create(time, scaleX, scaleY) 在time时间内,缩放到scale(scaleX, scaleY)大小

3、斜歪动作 (skew 和 rotate 的区别是一个是压缩倾斜旋转(形状会变), 一个是正常旋转(形状不变))
cc.SkewTo:create(time, angleX, angleY) 在time时间内,压缩倾斜至angleX, angleY角度 (形状会变)

Cocos2dx——纹理使用

理论要点

要点一:

文件格式与像素格式的区别:文件格式是图像为了存储信息而使用的对信息的特殊编码方式,大都经过了压缩,它存储在磁盘或内存中,但是并不能被GPU所识别(jpg,png…),这些图片格式当被游戏读入后,还需要经过CPU解压成像素格式,如:RGBA8888,再传送到GPU端进行使用。
而像素格式是能被GPU所识别的,能被快速寻址并采样。

要点二:

图片本身大小和其所占内存大小是两码事。这就好比一个zip压缩包使用时要解压还原数据,这个zip文件就好比图片本身,而解压后的文件就好比图片所占内存大小。纹理本身大小主要看我们选用什么样的压缩格式和压缩比,而所占内存大小就只由两个因素决定:
1. 图片的像素点个数(分辨率)
2. 单位像素占用的字节数(像素格式)。

即纹理内存大小 = 纹理长度 * 纹理宽度 * 单位像素占用的字节数,如:一张1136x640的RGBA8888的png图片占用的内存为 1136x640x4 = 2.8M左右。

Cocos2d-x学习笔记——常见22种特效

1、CCShaky3D::create(int range。bool shakeZ,const ccGridSize& gridSize,float duration)//创建一个3D晃动的特效

參数1:晃动的范围

參数2:是否有Z轴晃动

參数3:网格大小

參数4:特效持续时间

2、CCShakyTiles3D::create(int nRange,bool bShakeZ。const ccGridSize& gridSize。float duration)//创建一个3D瓷砖晃动的特效

參数1:晃动范围

參数2:是否伴有Z轴晃动

參数3:网格大小

參数4:特效持续时间

3、CCWaves::create(int wav,float amp,bool h,bool v。const ccGridSize& gridSize,float durat)//创建一个波动特效

參数1:波动的速率

參数2:振幅

參数3:水平波动

參数4:垂直波动

參数5:网格大小

參数6:特效持续时间

4、CCWaves3D::create(int wav,float amp,const ccGridSize& gridSize。float duration)//创建一个3D波动特效

Cocos2d-x缓存机制

Cocos2d-x引擎提供3个缓存类,都是全局单例模式。

CCTextureCache

首先是最底层也是最有效的纹理缓存CCTextureCache,这里缓存的是加载到内存中的纹理资源,也就是图片资源。其原理是对加入缓存的纹理资源进行一次引用,使其引用计数加1,保持不被清除,而Cocos2d-x的渲染机制是可以重复使用同一份纹理在不同场合中进行渲染,从而达到重复使用,降低内存和GPU运算资源的开销的目的。常用以下三个接口:

1 static CCTextureCache* sharedTextureCache(); //返回纹理缓存的全局单例
2 CCTexture2D* addImage(const char* fileimage); //添加一张纹理图片到缓存中
3 void removeUnusedTextures(); //清除不使用的纹理

在这3个接口中,CCTextureCache屏蔽了加载纹理的许多细节;addImage函数会返回一个纹理CCTextrue2D的引用,可能是新加载到内存的,也可能是之前已经存在的;而removeUnusedTextures则会释放当前所有引用计数为1的纹理,即目前没有被使用的纹理。

Cocos2d-x内存管理

Cocos2d-x内存管理浅解

1、首先我们知道内存管理分为c++自身管理机制以及Cocos2d-x内存管理机制。在c++中。内存分为堆区、栈区、静态存储区(全局存储区)、常量存储区、自由存储区。

主要先说一下堆区和栈区。

堆区主要由new和malloc分配。new与delete,malloc与free成对出现,保证内存的分配与回收。堆内存分配地址是逐渐增大的,这一点与栈区相反,我们都知道栈是先进后出。所以栈的存储方向是内存地址逐渐减小的。栈中的内存也是系统自己主动回收的,这个我们不需要考虑自己管理内存泄露的问题,而堆区的释放一定要注意使用完后手动释放,不然就会出现内存泄露的问题。在小的程序中我们可能感受不到这个问题的严重性,在成品软件中我们必需要严防这个问题,非常多时候在PC端开发的时候没有感觉到不论什么问题。可是版本号公布后就会发现出现非常多Crash。这个当中非常重要的原因就是由于内存泄露。我们常常说手机内存的大小。当手机装了一大堆软件之后就会变得非常卡,就是这个原因,内存泄露之后正在执行的程序越来越感觉内存不够用,严重的就是不断卡顿然后Crash。所以要养成习惯,注意内存使用与回收的问题。

cocos2dx之如何优化内存使用(高级篇)

一、内存优化原则

为了优化应用内存,你应该知道是什么消耗了你应用的大部分内存,答案就是Texture(纹理)!它几乎占据了90%的应用内存。那么我们应该尽力去减小我们应用的纹理内存使用,否则我们的应用进程可能会被系统杀死。

为了减少内存警告,这里我们给出两个普遍的关于cocos2dx游戏内存优化的指导原则。

1)了解瓶颈,然后解决掉

什么样的纹理消耗了大部分应用的内存呢?或者说这些纹理消耗了多少内存呢?你不用去手工计算或者猜测。

这里我们正好有一个工具。它就是 Allocations & Leaks,在xcode中你长按Run按钮并且选择Profile去启动这两个工具。这里我们有个截图:

cocos2dx之如何优化内存使用

你可以使用Allocation工具去计算你应用的内存使用情况并且可以查看内存泄露情况。

Cocos2d-x 3.0 精灵帧缓存(SpriteFrameCache)

SpriteFrameCache 主要服务于多张碎图合并出来的纹理图片。这种纹理在一张大图中包含了多张小图,直接通过TextureCache引用会有诸多不便,因而衍生出来精灵框帧的处理方式,即把截取好的纹理信息保存在一个精灵框帧内,精灵通过切换不同的框帧来显示出不同的图案。

SpriteFrameCache的内部封装了一个Map<std::string, SpriteFrame*> _spriteFrames对象。key为帧的名称。SpriteFrameCache一般用来处理plist文件(这个文件指定了每个独立的精灵在这张“大图”里面的位置和大小),该文件对应一张包含多个精灵的大图,plist文件可以使用TexturePacker制作。

SpriteFrameCache的常用接口和TextureCache类似,不再赘述了,唯一需要注意的是添加精灵帧的配套文件一个plist文件和一张大的纹理图。下面列举了SpriteFrameCache常用的方法:(详细API请看SpriteFrameCache API)

获取单例的SpriteFrameCache对象。sharedSpriteFrameCache方法在3.0中已经弃用

同步内容
--电子创新网--
粤ICP备12070055号