1,资源问题:(加载和卸载资源)

---(总规则:谁加载谁负责卸载)----

*1:本场景模块自己用的资源;这样的资源一般在onEnter加载onExit卸载,但是如果该场景是玩家经常要进入的场景,或者是和其他场景交互比较频繁的,那么建议资源不要卸载,因为对textureCache和spriteFrameCache不停地操作也是很低效的,虽然可能降低游戏场景中使用内存的峰值,但是会很可能造成场景切换的时候卡顿。






*2:本场景和本场景相关模块,比如面板之类的公用资源(场景和面板公用);这样的资源最好把资源加载放在与场景相关的资源中,只有切换场景的时候才会考虑卸载,面板打开和关闭就不要考虑资源卸载,如果一些面板是玩家操作比较频繁的,也建议将资源加载到场景中,待场景切换时候在卸载相关资源。






     *3:面板单独使用的资源,如果改面板可操作性比较强,则建议资源加载到场景中,跟场景推出的时候卸载,反之,该类资源的加载就有面板控制类管理。



*4:cocostudio导出的.Export的json文件,使用GUIReader::widgetFromJsonFile(const char *fileName)创建相关UI的时候,ExportJson文件会自动加载所需要的plist文件,但是这种加载cocos2dx不会帮你卸载,所以最后手动加载,然后再创建相关ui,等ui从屏幕移除的时候卸载所加载的资源,否则该类资源就会永驻内存。






*5:资源加载的时候最好是按大小进行排序这样的话可以降低游戏运行的峰值,这样的话降低游戏崩溃或者是不可预见的内存警告等问题。加载texture的时候可以采取异步加载,因为cocos2dx底层在用到某个texture的时候会自动帮你讲资源加载到缓存中,而frameCache则不会,你用到某个frame的时候找不到就会造成对象创建失败。












2,游戏在切换场景的时候卡顿






**1:(资源问题导致卡顿)首先在场景切换的时候大量的资源加载和卸载相关操作会严重影响切换场景的速度,该类问题最好是减少资源加载和卸载的频率,如果场景资源不是很多的时候最好是资源只加载不要卸载,让手机收到内存警告的时候再删除,目前手机的运行内存也是相当可观的,但是如果特效类的资源比较多的时候,也可以选择适当卸载,还有就是进入场景的时候加载的资源可以分类加载,刚进入场景一定需要的资源立即加载,不是立即需要的可以采取异步加载或者是在使用的时候加载,比如一些特效之类的;还有些资源比如两个场景公用的资源,要么只加载不卸载,要么就是在卸载资源的时候判断一下下个场景是否需要这些资源如果需要的时候就不要卸载,这样可能就需要在游戏框架中加入各个游戏场景中需要的资源配置文件;而在场景中有些资源也是建议只有再使用的时候才加载而不是进入场景的时候加载场景中所有可能用到的资源,这样也可以很好的减缓切场压力。。。






**2:(一帧之内创建太多节点导致卡顿)针对这一个问题可以采取分帧创建相关的节点,只需要在进入场景的时候创建玩家第一眼能看到的节点,其他的可采取分帧创建,比如一些动态特性或者是走动的人物相关动画,如果策划能接受相关节点依次出现那就能解决问题,但是如果策划不满意效果,这类问题导致的卡顿也许只能通过添加loading界面解决了。。。






**3:(解析太多或者是太大.Export文件导致卡顿)这个问题是笔者无意中发现的,有些画布可能比较复杂每次都需要调用GUIReader::widgetFromJsonFile(const char *fileName)创建UI,使用cocostudio的同学都知道导出的ExportJson文件里包含节点的相关属性真是太多了,好多简直不忍直视,界面越是复杂问题越严重,记得我们做的游戏中有主城和战斗,主城中有ui布局包含玩家资源,等级相关属性,战斗里面也有,但是一个同学在做ui的时候虽然ui的control分成了主城控制和战斗控制,两个控制都继承一个baseControl,但是导出的ExportJson文件确没有分开,这样一来在主城中就会创建战斗相关的东西,反之在战斗中也会创建主城中相关的东西,最后讲ExportJson文件分开之后发现切入主城和战斗的时间整整缩短了将近1s时间;还有一个问题就是由于cocos2dx解析.Export的json文件很慢,那么创建一个复杂的节点的时候最好是保存引用不要被释放:






eg:




local mainUI = ccs.GUIReader:getInstance():widgetFromJsonFile("mainUI.ExportJson")
 
  
mainUI:retain()
 
  
local Scene = cc.Scene:create()
 
  
Scene:addChild(mainUI )



下次再创建的时候做个判断即可,如果mainUI 存在就可以直接添加到场景中,但是要注意mainUI的释放,也即在适当的时候释放mainUI:release();



还有一种情况就是在创建很多个类似节点的时候:


(第一种写法:)local shopGoods = ccs.GUIReader:getInstance():widgetFromJsonFile("shopGoods.ExportJson")
 
  
shopGoods :retain()
 
  
local shopLayer = cc.Layer:create()
 
  
for idx =1,10 do 
 
  
local shopItem = shopGoods:clone()
 
  
shopLayer:addChild(shopItem)
 
  
end
 
  

 
  

 
   
(第二种写法:)local shopLayer = cc.Layer:create()
 
   
for idx =1,10 do 
 
   
local shopItem = ccs.GUIReader:getInstance():widgetFromJsonFile("shopGoods.ExportJson")
 
   
shopLayer:addChild(shopItem)
 
   
end





以上两种方法相差的时候会根据shopGoods.ExportJson复杂度而递增,会跟要创建的shopGoods.ExportJson个数而递增,所以如果再一个场景中有好多类似的节点比如建筑之类的建议采取第一种方法,这样会节省一定的时间。