热更plist后,游戏永远无法读取或者是重启后才可以读取的

今天,我们游戏热更了一些游戏的Plist,但是,有的plist的图是需要重启才可以读取,有的是永远都无法读取。

1、那些永远都无法读取的plist的图

原因:addSpriteFramesWithFile的时候,资源的路径加的不对。

比如,下面是我们的search路径:(前7个是缓存路径,后6个是包内路径)

CCFileUtils:sharedFileUtils():addSearchPath(globalval.down_path.. "scripts/")
CCFileUtils:sharedFileUtils():addSearchPath(globalval.down_path .. "res/")
CCFileUtils:sharedFileUtils():addSearchPath(globalval.down_path .. "res/conf/")
CCFileUtils:sharedFileUtils():addSearchPath(globalval.down_path .. "res/fonts/")
CCFileUtils:sharedFileUtils():addSearchPath(globalval.down_path .. "res/images/")
CCFileUtils:sharedFileUtils():addSearchPath(globalval.down_path .. "res/pb/")
CCFileUtils:sharedFileUtils():addSearchPath(globalval.down_path .. "res/sfx/")
CCFileUtils:sharedFileUtils():addSearchPath("res/")
CCFileUtils:sharedFileUtils():addSearchPath("res/conf/")
CCFileUtils:sharedFileUtils():addSearchPath("res/fonts/")
CCFileUtils:sharedFileUtils():addSearchPath("res/images/")
CCFileUtils:sharedFileUtils():addSearchPath("res/pb/")
CCFileUtils:sharedFileUtils():addSearchPath("res/sfx/")

这时候热更了一个新的plist(之前的包没有的),然后我们这样加:display.addSpriteFramesWithFile("res/images/mahjong_tiles.plist", "res/images/mahjong_tiles.pvr.ccz"),这样我们就会找不到了。为什么呢?首先,对于原包来说,包里是没有这些资源的,所以在后6个路径肯定是找不到的。其次,对于缓存路径来说,我们addSpriteFramesWithFile的内容,都是从所有7个缓存路径的下面里找,很显然,在7个缓存路径的下面都是无法找到"res/images/mahjong_tiles.plist"。所以就出现了虽然热更了新的plist,但是却不能使用这个文件的问题。我们既然知道原因,那么,要解决这个问题就很简单了。只要把addSpriteFramesWithFile的内容改成images/mahjong_tiles.plist 或者mahjong_tiles.plist都是可以的,它们分别从第二个或第五个缓存路径加载资源。【我有个疑问,如果是原先包里就有这个Plist,然后也这么addSpriteFramesWithFile,那会出问题吗?

2、刚热更完游戏无法读取,但是重启后可以正常读取的Plist

原因1:热更了新的plist以后,程序没有清空缓存里的内容,所以即使程序有重新addSpriteFramesWithFile,但是由于缓存里已经存在该内容,所以addSpriteFramesWithFile是无效的。所以程序继续用缓存里旧的内容。

解决方法:我们只需要调用display.removeSpriteFramesWithFile("login.plist","login.pvr.ccz"),将缓存里的plist给清空,这样在addSpriteFramesWithFile的时候,才会真正重新加载。这样问题就解决啦~

原因2:其实原因2不算是直接原因。因为原因2导致了原因1的发生,最终才导致读取plist失败。所以原因2不能算是原因吧。但是在我的项目里,正是因为原因2,才让我查了好久为什么程序热更完无法及时读取新的Plist,而且这个原因2的问题,其实之前我就遇到过很多次了,所以我一定要把它当成一个原因来写。废话不多说,究竟是什么原因呢??这个是和热更流程息息相关的。大家都知道,lua文件热更新了以后,需要调用package.loaded["app.scenes.UpdateScene"] = nil 来将缓存里require过的文件进行置空。这次的坑,我就是因为没有对某个文件没有进行置空,所以那个文件还是继续执行缓存里的lua文件,而那个缓存里的lua文件,并没有removeSpriteFramesWithFile的代码。所以呢,缓存里的资源也没有及时被清空,所以呢,程序使用的还是缓存里旧的Plist文件,所以呢,游戏刚刚热更完无法正常读取。但是游戏重启就可以正常读取。因为重启后缓存里的数据都会被自动清空。所以,很清楚,解决这个原因2的方法就是要在热更完以后调用package.loaded["app.scenes.UpdateScene"] = nil 来置空缓存的lua文件,这样问题就迎刃而解了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值