当前位置: 首页 > news >正文

如何查看网站域名360seo

如何查看网站域名,360seo,wordpress第二步500,信阳网络推广公司【唠叨】整合参考文档。【参考】【内存管理机制】在3.x版本#xff0c;Cocos2d-x采用全新的根类 Ref#xff0c;实现Cocos2d-x 类对象的引用计数记录。引擎中的所有类都派生自Ref。1、引用计数Cocos2d-x 提供引用计数管理内存。 调用 retain() 方法 #xf…【唠叨】整合参考文档。【参考】【内存管理机制】在3.x版本Cocos2d-x采用全新的根类 Ref实现Cocos2d-x 类对象的引用计数记录。引擎中的所有类都派生自Ref。1、引用计数Cocos2d-x 提供引用计数管理内存。 调用 retain() 方法             令其引用计数增1表示获取该对象的引用权。 调用 release() 方法          在引用结束的时候令其引用计数值减1表示释放该对象的引用权。 调用 autorelease() 方法 将对象放入自动释放池。 当释放池自身被释放的时候它就会对池中的所有对象执行一次release()方法实现灵活的垃圾回收。Cocos2d-x 提供 AutoreleasePool管理自动释放对象。 当释放池自身被释放的时候它就会对池中的所有对象执行一次release()方法。核心类Ref实现了引用计数。///***CCRef.h**/class CC_DLL Ref{public:void retain();      // 保留。引用计数1void release();     // 释放。引用计数-1Ref* autorelease(); // 实现自动释放。unsigned int getReferenceCount() const; //被引用次数protected:Ref();          // 初始化public:virtual ~Ref(); // 析构protected:unsigned int _referenceCount; // 引用次数friend class AutoreleasePool; // 自动释放池};/***CCRef.cpp**/// 节点被创建时引用次数为 1Ref::Ref() : _referenceCount(1){}void Ref::retain(){CCASSERT(_referenceCount  0, reference count should greater than 0);_referenceCount;}void Ref::release(){CCASSERT(_referenceCount  0, reference count should greater than 0);--_referenceCount;if (_referenceCount  0){delete this;}}Ref* Ref::autorelease(){// 将节点加入自动释放池PoolManager::getInstance()-getCurrentPool()-addObject(this);return this;}//Ref原理分析 当一个 Ref 初始化(被new出来时)_referenceCount 1 当调用该 Ref 的 retain() 方法时_referenceCount 当调用该 Ref 的 release() 方法时_referenceCount--。 若  _referenceCount 减后为0则 delete 该 Ref。2、retain() 和 release() 使用下面一段简单的例子来学习 retain() 和 release() 的使用。//TestObject* obj1  new TestObject(testobj1);CCLOG(obj1 referenceCount%d,obj1-getReferenceCount());obj1-retain();CCLOG(obj1 referenceCount%d,obj1-getReferenceCount());obj1-release();CCLOG(obj1 referenceCount%d,obj1-getReferenceCount());obj1-release();//控制台显示的日志如下cocos2d: TestObject:testobj1 is createdcocos2d: obj1 referenceCount1cocos2d: obj1 referenceCount2cocos2d: obj1 referenceCount1cocos2d: TestObject:testobj1 is destroyed通过例子和打印结果可以看到 obj1对象创建后引用计数为1 执行一次retain()后引用计数为2 执行一次release()后引用计数回到1 再执行一次release()后对象会被释放掉。因此 我们可以调用retain()方法令其引用计数增1表示获取该对象的引用权 在引用结束的时候调用release()方法令其引用计数值减1表示释放该对象的引用权。 直到对象的引用计数为0释放该对象。3、autorelease() 使用同样一段简单的例子来学习autorelease的使用代码如下//TestObject* obj  new TestObject(testobj);CCLOG(obj referenceCount%d,obj-getReferenceCount());obj-autorelease();CCLOG(obj is add in currentpool %s,PoolManager::getInstance()-getCurrentPool()-contains(obj)?true:false);CCLOG(obj referenceCount%d,obj-getReferenceCount());obj-retain();CCLOG(obj referenceCount%d,obj-getReferenceCount());obj-release();CCLOG(obj referenceCount%d,obj-getReferenceCount());//obj in current pool will be releaseDirector::getInstance()-replaceScene(this);//控制台显示的日志如下cocos2d: TestObject:testobj is createdcocos2d: obj referenceCount1cocos2d: obj is add in currentpool truecocos2d: obj referenceCount1cocos2d: obj referenceCount2cocos2d: obj referenceCount1...cocos2d: TestObject:testobj is destroyed通过代码和打印结果我们可以看到 obj对象创建后引用计数为1 执行一次autorelease()后obj对象被加入到当前的自动释放池。 obj对象的引用计数值并没有减1。 但是在下一帧开始前当前的自动释放池会被回收掉并对自动释放池中的所有对象执行一次release()操作。 当对象的引用计数为0时对象会被释放掉。 obj对象执行autorelease()后我们对其执行了一组retain()和release()操作。 此时obj对象的引用计数为1在场景切换后当前的自动释放池被回收 obj对象执行一次release()操作引用计数减为0时对象会被释放掉。注意autorelease()只有在自动释放池被释放时才会进行一次释放操作如果对象释放的次数超过了应有的次数则这个错误在调用autorelease()时并不会被发现只有当自动释放池被释放时(通常也就是游戏的每一帧结束时)游戏才会崩溃。在这种情况下定位错误就变得十分困难了。例如在游戏中一个对象含有1个引用计数但是却被调用了两次autorelease()。在第二次调用autorelease()时游戏会继续执行这一帧结束游戏时才会崩溃很难及时找到出错的地点。因此我们建议在开发过程中应该避免滥用autorelease()只在工厂方法等不得不用的情况下使用尽量以release()来释放对象引用。4、AutoreleasePool类 使用Cocos2d-x提供AutoreleasePool管理自动释放对象。下面一段简单的例子讲解AutoreleasePool的使用代码如下//TestObject* obj2  new TestObject(testobj2);CCLOG(obj2 referenceCount%d,obj2-getReferenceCount());//use AutoreleasePool{AutoreleasePool pool;obj2-retain();CCLOG(obj2 referenceCount%d,obj2-getReferenceCount());obj2-release();CCLOG(obj2 referenceCount%d,obj2-getReferenceCount());obj2-autorelease();CCLOG(obj2 is add in pool %s,pool.contains(obj2)?true:false);TestObject *obj3  new TestObject(testobj3);obj3-autorelease();CCLOG(obj3 is add in pool %s,pool.contains(obj3)?true:false);}//控制台输出日志如下cocos2d: TestObject:testobj2 is createdcocos2d: obj2 referenceCount1cocos2d: obj2 referenceCount2cocos2d: obj2 referenceCount1cocos2d: obj2 is add in pool truecocos2d: TestObject:testobj3 is createdcocos2d: obj3 is add in pool truecocos2d: TestObject:testobj2 is destroyedcocos2d: TestObject:testobj3 is destroyed通过代码和输出结果可以看到 创建了一个obj2对象此时obj2对象的引用计数为1。 接着创建了一个自动释放池对obj2对象执行retain()和release()操作后执行autorelease()操作此时obj2对象被加入到当前新建的自动释放池中。 接着新建了obj3对象并执行autorelease()操作。同样obj3也被加入到当前新建的自动释放池中。 在代码块结束后自动释放池被回收加入自动释放池中的obj2和obj3执行release()操作引用计数减为0被释放销毁。我们可以自己创建AutoreleasePool管理对象的autorelease。我们已经知道调用了autorelease()方法的对象(下面简称autorelease对象)将会在自动释放池释放的时候被释放一次。虽然Cocos2d-x已经保证每一帧结束后释放一次释放池并在下一帧开始前创建一个新的释放池但是我们也应该考虑到释放池本身维护着一个将要执行释放操作的对象列表如果在一帧之内生成了大量的autorelease对象将会导致释放池性能下降。因此在生成autorelease对象密集的区域(通常是循环中)的前后我们最好可以手动创建并释放一个回收池。例如//// example of using temple autorelease pool{AutoreleasePool pool2;char name[20];for (int i  0; i {snprintf(name, 20, object%d, i);TestObject *tmpObj  new TestObject(name);tmpObj-autorelease();}}//总结 autorelease()的实质是将对象加入自动释放池对象的引用计数不会立刻减1在自动释放池被回收时对象执行release()。 autorelease()并不是毫无代价的其背后的释放池机制同样需要占用内存和CPU资源。 过多的使用autorelease()会增加自动释放池的管理和释放池维护对象存取释放的支出。 在内存和CPU资源本就不足的程序中使得系统资源更加紧张。 此时就需要我们合理创建自动释放池管理对象autorelease。 不用的对象推荐使用release()来释放对象引用立即回收。5、特殊内存管理5.1、工厂方法 create()在Cocos2d-x中提供了大量的工厂方法创建对象。仔细看你会发现这些对象都是自动释放的。下面以 Label 的 create 方法为例代码如下//Label* Label::create(){auto ret  new Label();if (ret){ret-autorelease();}return ret;}//我们可以发现创建了一个Label的对象并对该对象执行autorelease()。表示该对象是自动释放的。细心的你会发放Layer/Scene/Sprite等类的 create() 方法都相同。使用工厂方法创建对象时虽然引用计数也为1但是由于对象已经被放入了释放池因此调用者没有对该对象的引用权除非我们人为地调用了retain()来获取引用权否则不需要主动释放对象。5.2、Node 的 addChild() / removeChild 方法在Cocos2d-x中所有继承自Node类在调用 addChild 方法添加子节点时自动调用了retain。 对应的通过 removeChild移除子节点时自动调用了release。调用addChild方法添加子节点节点对象执行retain。子节点被加入到节点容器中父节点销毁时会销毁节点容器释放子节点。对子节点执行release。如果想提前移除子节点我们可以调用removeChild。在Cocos2d-x内存管理中大部分情况下我们通过调用 addChild/removeChild 的方式自动完成了retain,release调用。不需再调用retainrelease。【内存优化】1、内存优化原理为优化应用内存使用开发人员首先应该知什么最耗应用内存答案就是纹理 纹理几乎会占据90%应用内存。所以尽量最小化应用的纹理内存使用否则应用很有可能会因为低内存而崩溃。本节介绍Cocos2d-x游戏通用的两条内存优化原理指导。1.1、认识瓶颈寻找方案什么样的纹理最耗应用内存或这些纹理会消耗多少内存当然这个不用手动计算只需猜测。工具在这里已经准备好了使用的是苹果的工具“Allocation Leaks”。你可以在Xcode中长按“Run”命令选择“ Profile ”来启动这两个工具。如下所示使用Allocation工具可以监控应用的内存使用使用Leaks工具可以观察内存的泄漏情况。此外还可用一些代码获取游戏内存使用的其他信息。如下所示//Sprite* bg  Sprite::create(HelloWorld.png);bg-setPosition(240, 160);this-addChild(bg);CCLOG(%s, Director::getInstance()-getTextureCache()-getCachedTextureInfo().c_str());//调用这个代码后游戏便会在DEBUG模式运行这时你会在Xcode控制台窗口看到一些格式工整的日志信息。//cocos2d: ****/HelloWorld.png rc2 id3 480 x 320  32 bpp  600 KB/cc_fps_p_w_picpaths rc5 id2 999 x 54  16 bpp  105 KBTextureCache dumpDebugInfo: 2 textures, for 705 KB (0.69 MB)//从上可以看到会显示纹理的名称、引用计数、ID、大小及每像素的位数。最重要的是会显示内存的使用情况。如“cc_fps_p_w_picpaths”指消耗了105KB内存而“HelloWorld.png”消耗了600KB内存。1.2、切勿过度优化这是一个通用的优化规则。在优化过程中应该做一些权衡取舍。因为有时候图像质量和图像内存使用是处于两级的状态。千万不要过度优化2、内存优化水平在此将ccos2d-x内存优化分为三个等级。每个等级都有不同的说明策略也有点不一样。2.1、客户端等级这是最重要的的优化等级。因为我们要在Cocos2d-x引擎顶层编译游戏引擎自身会提供一些优化选项。 在这个等级我们可以进行大部分优化。简而言之我们可以优化纹理、音频、字体及粒子的内存使用。第一看纹理优化,为了优化纹理内存使用必须知道什么因素对纹理内存使用的影响最大。主要有3个因素会影响纹理内存即纹理格式(压缩还是非压缩)、颜色深度和大小。我们可以使用PVR格式纹理减少内存使用。推荐纹理格式为pvr.ccz。纹理使用的每种颜色位数越多图像质量越好但是越耗内存。所以我们可以使用颜色深度为RGB4444的纹理代替RGB8888这样内存消耗会降低一半。此外超大的纹理也会导致内存相关问题。所以最好使用中等大小的纹理。第二音频优化,3个因素会影响音频文件的内存使用即音频文件数据格式、比特率及采样率。推荐使用MP3数据格式的音频文件因为Android平台和iOS平台均支持MP3格式此外MP3格式经过压缩和硬件加速。背景音乐文件大小应该低于800KB最简单的方法就是减少背景音乐时间然后重复播放。音频文件采样率大约在96-128kbps为佳比特率44kHz就够了。第三字体和粒子优化,在此有两条小提示使用BMFont字体显示游戏分数时请尽可能使用最少数量的文字。例如只想要显示单位数的数字你可以移除所有字母。至于粒子可以通过减少粒子数来降低内存使用。2.2、引擎等级需要 OpenGL ES 及游戏引擎高手。2.3、C语言等级在这个等级中建议是编写无内存泄露代码。遵循Cocos2d-x内置的内存管理原则尽量避免内存泄露。3.、提示和技巧(1)    一帧一帧载入游戏资源(2)    减少绘制调用使用“Auto-batching”自动批处理。(3)    载入纹理时按照从大到小的顺序(4)    避免高峰内存使用(5)    使用载入屏幕预载入游戏资源(6)    需要时释放空闲资源(7)    收到内存警告后释放缓存资源.(8)    使用纹理打包器优化纹理大小、格式、颜色深度等(9)    使用JPG格式要谨慎(10)  请使用RGB4444颜色深度16位纹理(11)  请使用NPOT纹理不要使用POT纹理(12)  避免载入超大纹理(13)  推荐1024*1024 NPOT pvr.ccz纹理集而不要采用RAW PNG纹理
http://www.zqtcl.cn/news/936438/

相关文章:

  • 抖音代运营内容seo职业规划
  • dedecms网站制作教程做网站买好域名怎么办
  • 网站建立于网页设计ai网站设计
  • 青海省建设工程造价网站电商设计网站培训
  • 软件开发过程的阶段划分优化手机访问网站速度
  • 知名网站建设公司做分销网站好吗
  • 服务器php网站打不开潍坊网站模板在哪
  • 网站管理员要干些什么开发公司专票
  • 陕西省建设银行网站6网站都有什么类型的
  • 哪里有做网站设计全国室内设计学校
  • 简单的网站php开发教程账户竞价托管哪里好
  • dede网站搬家教程浙江省住房和城乡建设部网站
  • 网站分页符怎么做做网站是什么意思
  • 影视网站开发工程师店铺装修
  • ip138查询网站网址域名ip网站外包制作
  • 网站建设需求怎么写网站seo快速排名优化
  • 网站后台文章添加成功 不显示注册安全工程师是干什么的
  • 网页制作网站建设百度网站推广费用多少钱
  • 长沙网站建设软件wordpress加菜单
  • 网站建设教育板块wordpress $pagenow
  • 岳阳手机网站建设自己可以给公司做网站吗
  • 旅游网站建设目的关于建设网站的需求分析
  • 手机可以建立网站吗自己造网站
  • 厦门建网站哪家好手机编程网站
  • 网站搭建后台奥门网站建设
  • 电子商务网站免费模板展示型网站与营销型网站
  • 除了红动中国还有哪些设计网站宁波建网站哪家
  • 网站的建设费用预算策划书wdcp网站备份
  • 济南制作公司网站网站设计的实例
  • 网站建设需要的文案一个网站的后台怎么做