Cocos2d-x   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了【玩转cocos2d-x之三十七】粒子系统的加载优化大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

Cocos2d-x的粒子系统是通过加载plist生成的。plist包含两部分内容:粒子系统属性和粒子纹理。然而每次调用create都会对plist进行读取解析,如果重复地使用同一个粒子效果,这样的调用明显是低效冗余的。所以我们要做的是,将粒子系统属性和粒子纹理分别抽出。
(1)将粒子系统属性预加载并全局保存,避免每次进行读取。
(2)粒子纹理可视且可以进行纹理打包,加载粒子纹理就和加载普通的图片一样。
本文通过增加ParticleSystemQuad的接口实现对粒子系统属性和纹理帧的直接载入,来提高粒子系统的加载效率和实现内存纹理的优化。


1.ParticleSystemQuad

首先先看下ParticleSystemQuad,ParticleSystemQuad继承于ParticleSystem,拥有后者的所有特性,并且增加了一些新的特性:
(1)粒子大小支持浮点数
(2)支持缩放
(3)支持选择
(4)支持subrect
(5)支持批渲染
ParticleSystemQuad同时也是其他特效的父类,创建一个粒子系统的函数调用顺序为:
  1. Create→initWithFile→initWithDictionary@H_@R_674_11235@_46@

在initWithDictionary中对粒子数据和纹理进行了读取和解析(这部分有兴趣的可以直接看源码)。


2.如何优化?

initWithDictionary的函参
    staticboolinitWithDictionary(ValueMap&dictionary,conststd::string&dirName);@H_@R_674_11235@_46@
设计如下接口,当然你要传入文件名也可以:
    staticParticleSystemQuad*create(ValueMap&valueMap,SpriteFrame*framE);@H_@R_674_11235@_46@
  1. boolinitWithValueMap(ValueMap&valueMap,SpriteFrame*framE);@H_@R_674_11235@_46@
源码如下:
    ParticleSystemQuad*ParticleSystemQuad::create(ValueMap&map,SpriteFrame*framE)@H_@R_674_11235@_46@
  1. {@H_@R_674_11235@_46@
  2. ParticleSystemQuad*ret=newParticleSystemQuad();@H_@R_674_11235@_46@
  3. if(ret&&ret->initWithValueMap(map,framE))@H_@R_674_11235@_46@
  4. {@H_@R_674_11235@_46@
  5. ret->autorelease();@H_@R_674_11235@_46@
  6. returnret;@H_@R_674_11235@_46@
  7. }@H_@R_674_11235@_46@
  8. CC_SAFE_deletE(ret);@H_@R_674_11235@_46@ @H_696_165@returnret;@H_@R_674_11235@_46@
  9. }@H_@R_674_11235@_46@
    boolParticleSystemQuad::initWithValueMap(ValueMap&valueMap,108); list-style:decimal-leading-zero outside; color:inherit; line-height:20px; margin:0px!important; padding:0px 3px 0px 10px!important"> std::stringdirname="";@H_@R_674_11235@_46@
  1. boolret=false;@H_@R_674_11235@_46@
  2. unsignedchar*buffer=nullptr;@H_@R_674_11235@_46@
  3. unsignedchar*deflated=nullptr;@H_@R_674_11235@_46@
  4. @H_@R_674_11235@_46@ @H_696_165@do@H_@R_674_11235@_46@
  5. int@H_483_43@maxParticles=valueMap["maxParticles"].asInt();@H_@R_674_11235@_46@
  6. //self,notsuper@H_@R_674_11235@_46@ @H_696_165@if(this->initWith@R_261_10586@lParticles(maxParticles))@H_@R_674_11235@_46@
  7. //Emitternameinparticledesigner2.0@H_@R_674_11235@_46@
  8. _configName=valueMap["configName"].asString();@H_@R_674_11235@_46@
  9. @H_@R_674_11235@_46@
  10. //angle@H_@R_674_11235@_46@
  11. _angle=valueMap["angle"].asFloat();@H_@R_674_11235@_46@
  12. _angleVar=valueMap["angleVariance"].asFloat();@H_@R_674_11235@_46@
  13. //duration@H_@R_674_11235@_46@
  14. _duration=valueMap["duration"].asFloat();@H_@R_674_11235@_46@
  15. //blendfunction@H_@R_674_11235@_46@
  16. if(_configName.length()>0)@H_@R_674_11235@_46@
  17. _blendFunc.src=valueMap["blendFuncsource"].asFloat();@H_@R_674_11235@_46@ @H_696_165@else@H_@R_674_11235@_46@
  18. _blendFunc.src=valueMap["blendFuncsource"].asInt();@H_@R_674_11235@_46@
  19. _blendFunc.dst=valueMap["blendFuncDesTination"].asInt();@H_@R_674_11235@_46@
  20. //color@H_@R_674_11235@_46@
  21. _startColor.r=valueMap["startColorRed"].asFloat();@H_@R_674_11235@_46@
  22. _startColor.g=valueMap["startColorGreen"].asFloat();@H_@R_674_11235@_46@
  23. _startColor.b=valueMap["startColorBlue"].asFloat();@H_@R_674_11235@_46@
  24. _startColor.a=valueMap["startColorAlpha"].asFloat();@H_@R_674_11235@_46@
  25. _startColorVar.r=valueMap["startColorVarianceRed"].asFloat();@H_@R_674_11235@_46@
  26. _startColorVar.g=valueMap["startColorVarianceGreen"].asFloat();@H_@R_674_11235@_46@
  27. _startColorVar.b=valueMap["startColorVarianceBlue"].asFloat();@H_@R_674_11235@_46@
  28. _startColorVar.a=valueMap["startColorVarianceAlpha"].asFloat();@H_@R_674_11235@_46@
  29. _endColor.r=valueMap["finishColorRed"].asFloat();@H_@R_674_11235@_46@
  30. _endColor.g=valueMap["finishColorGreen"].asFloat();@H_@R_674_11235@_46@
  31. _endColor.b=valueMap["finishColorBlue"].asFloat();@H_@R_674_11235@_46@
  32. _endColor.a=valueMap["finishColorAlpha"].asFloat();@H_@R_674_11235@_46@
  33. _endColorVar.r=valueMap["finishColorVarianceRed"].asFloat();@H_@R_674_11235@_46@
  34. _endColorVar.g=valueMap["finishColorVarianceGreen"].asFloat();@H_@R_674_11235@_46@
  35. _endColorVar.b=valueMap["finishColorVarianceBlue"].asFloat();@H_@R_674_11235@_46@
  36. _endColorVar.a=valueMap["finishColorVarianceAlpha"].asFloat();@H_@R_674_11235@_46@
  37. //particlesize@H_@R_674_11235@_46@
  38. _startSize=valueMap["startParticleSize"].asFloat();@H_@R_674_11235@_46@
  39. _startSizeVar=valueMap["startParticleSizeVariance"].asFloat();@H_@R_674_11235@_46@
  40. _endSize=valueMap["finishParticleSize"].asFloat();@H_@R_674_11235@_46@
  41. _endSizeVar=valueMap["finishParticleSizeVariance"].asFloat();@H_@R_674_11235@_46@
  42. //position@H_@R_674_11235@_46@
  43. floatx=valueMap["sourcePositionx"].asFloat();@H_@R_674_11235@_46@
  44. floaty=valueMap["sourcePositiony"].asFloat();@H_@R_674_11235@_46@
  45. this->setPosition(Point(x,y));@H_@R_674_11235@_46@
  46. _posVar.x=valueMap["sourcePositionVariancex"].asFloat();@H_@R_674_11235@_46@
  47. _posVar.y=valueMap["sourcePositionVariancey"].asFloat();@H_@R_674_11235@_46@
  48. //Spinning@H_@R_674_11235@_46@
  49. _startSpin=valueMap["rotationStart"].asFloat();@H_@R_674_11235@_46@
  50. _startSpinVar=valueMap["rotationStartVariance"].asFloat();@H_@R_674_11235@_46@
  51. _endSpin=valueMap["rotationEnd"].asFloat();@H_@R_674_11235@_46@
  52. _endSpinVar=valueMap["rotationEndVariance"].asFloat();@H_@R_674_11235@_46@
  53. _emitterMode=(ModE)valueMap["emitterType"].asInt();@H_@R_674_11235@_46@
  54. //ModeA:Gravity+tangentialaccel+radialaccel@H_@R_674_11235@_46@ @H_696_165@if(_emitterMode==Mode::GRAVITY)@H_@R_674_11235@_46@
  55. //gravity@H_@R_674_11235@_46@
  56. @H_728_42@modeA.gravity.x=valueMap["gravityx"].asFloat();@H_@R_674_11235@_46@
  57. @H_728_42@modeA.gravity.y=valueMap["gravityy"].asFloat();@H_@R_674_11235@_46@
  58. //speed@H_@R_674_11235@_46@
  59. @H_728_42@modeA.speed=valueMap["speed"].asFloat();@H_@R_674_11235@_46@
  60. @H_728_42@modeA.speedVar=valueMap["speedVariance"].asFloat();@H_@R_674_11235@_46@
  61. //radialacceleration@H_@R_674_11235@_46@
  62. @H_728_42@modeA.radialAccel=valueMap["radialAcceleration"].asFloat();@H_@R_674_11235@_46@
  63. @H_728_42@modeA.radialAccelVar=valueMap["radialAccelVariance"].asFloat();@H_@R_674_11235@_46@
  64. //tangentialacceleration@H_@R_674_11235@_46@
  65. @H_728_42@modeA.tangentialAccel=valueMap["tangentialAcceleration"].asFloat();@H_@R_674_11235@_46@
  66. @H_728_42@modeA.tangentialAccelVar=valueMap["tangentialAccelVariance"].asFloat();@H_@R_674_11235@_46@
  67. //rotationisdir@H_@R_674_11235@_46@
  68. @H_728_42@modeA.rotationIsDir=valueMap["rotationIsDir"].asBool();@H_@R_674_11235@_46@
  69. //orModeB:radiusmovement@H_@R_674_11235@_46@
  70. elseif(_emitterMode==Mode::rADIUS)@H_@R_674_11235@_46@
  71. @H_728_42@modeB.startRadius=valueMap["maxRadius"].asInt();@H_@R_674_11235@_46@
  72. @H_728_42@modeB.startRadius=valueMap["maxRadius"].asFloat();@H_@R_674_11235@_46@
  73. @H_728_42@modeB.startRadiusVar=valueMap["maxRadiusVariance"].asFloat();@H_@R_674_11235@_46@ @H_696_165@if(_configName.length()>0)@H_@R_674_11235@_46@
  74. @H_728_42@modeB.endRadius=valueMap["minRadius"].asInt();@H_@R_674_11235@_46@
  75. }@H_@R_674_11235@_46@ @H_696_165@else@H_@R_674_11235@_46@
  76. @H_728_42@modeB.endRadius=valueMap["minRadius"].asFloat();@H_@R_674_11235@_46@
  77. @H_728_42@modeB.endRadiusVar=0.0f;@H_@R_674_11235@_46@
  78. @H_728_42@modeB.rotatePerSecond=valueMap["rotatePerSecond"].asInt();@H_@R_674_11235@_46@
  79. @H_728_42@modeB.rotatePerSecond=valueMap["rotatePerSecond"].asFloat();@H_@R_674_11235@_46@
  80. @H_728_42@modeB.rotatePerSecondVar=valueMap["rotatePerSecondVariance"].asFloat();@H_@R_674_11235@_46@
  81. }else{@H_@R_674_11235@_46@
  82. CCassERT(false,"InvalidemitterTypeinconfigfile");@H_@R_674_11235@_46@
  83. CC_BREAK_IF(true);@H_@R_674_11235@_46@
  84. //lifespan@H_@R_674_11235@_46@
  85. _life=valueMap["particleLifespan"].asFloat();@H_@R_674_11235@_46@
  86. _lifeVar=valueMap["particleLifespanVariance"].asFloat();@H_@R_674_11235@_46@
  87. //emissionRate@H_@R_674_11235@_46@
  88. _emissionRate=_@R_261_10586@lParticles/_life;@H_@R_674_11235@_46@
  89. //don'tgettheinternaltextureifabatchNodeisused@H_@R_674_11235@_46@ @H_696_165@if(!_batchNodE)@H_@R_674_11235@_46@
  90. //Setacompatibledefaultforthealphatransfer@H_@R_674_11235@_46@
  91. _opacitymodifyRGB=false;@H_@R_674_11235@_46@ @H_696_165@if(!_configName.empty())@H_@R_674_11235@_46@
  92. _yCoordFlipped=valueMap["yCoordFlipped"].asInt();@H_@R_674_11235@_46@
  93. setDisplayFrame(framE);@H_@R_674_11235@_46@
  94. ret=true;@H_@R_674_11235@_46@ @H_696_165@while(0);@H_@R_674_11235@_46@
  95. free(buffer);@H_@R_674_11235@_46@
  96. free(deflated);@H_@R_674_11235@_46@
  97. }@H_@R_674_11235@_46@
注意,这里只是提供了通过粒子系统属性和纹理创建粒子系统的接口,并没有实现对粒子属性的全局保存(可以参 Earth Warriors 3D中ParticleManager的实现 )和图片帧的预加载。

粒子属性的获取:
    ValueMapFileUtilsApple::getValueMapFromFile(conststd::string&fileName);@H_@R_674_11235@_46@
图片帧的获取(这个获取方式就比较多了。。。):
    SpriteFrame*create(conststd::string&filename,153); font-weight:bold; BACkground-color:inherit">constRect&rect);@H_@R_674_11235@_46@

3.如何使用?

    autoplistData=FileUtils::geTinstance()->getValueMapFromFile("Particles/emissionPart.plist");@H_@R_674_11235@_46@
  1. autoemission_frame=SpriteFrame::create("Images/ENGIne.jpg",Rect(0,25,32));@H_@R_674_11235@_46@
  2. autoemitter=ParticleSystemQuad::create(plistData,emission_framE);@H_@R_674_11235@_46@
  3. _BACkground->addChild(_emitter,10);@H_@R_674_11235@_46@

4.源码下载

我也不知道3.0release会不会集成这个功能,这里先发出pull request的链接:https://github.com/cocos2d/cocos2d-x/pull/5979/files

大佬总结

以上是大佬教程为你收集整理的【玩转cocos2d-x之三十七】粒子系统的加载优化全部内容,希望文章能够帮你解决【玩转cocos2d-x之三十七】粒子系统的加载优化所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:17cocoscocos2ddx之三优化加载十七粒子系统
猜你在找的Cocos2d-x相关文章
其他相关热搜词更多
phpJavaPython程序员load如何string使用参数jquery开发安装listlinuxiosandroid工具javascriptcap