字节小游戏平台cacheManager缓存机制可能存在bug。

我们项目遇到一个问题,首次玩游戏的过程中,有较高的概率出现文件复制失败的警告,而且这个警告会不断地出现并导致游戏卡死。

经过排查,发现如果短时间内下载较多的文件,由于cacheManager缓存文件有500毫秒的延迟,这些文件的缓存操作会延后。
然而如果这个延迟的时间过长,重新引用字节小游戏引擎的临时文件时可能会找不到(可能是临时文件数量过多触发了字节小游戏临时文件清理机制)。
但是即使文件没找到,cacheManager的_cache方法仍会不断尝试复制这个不存在的文件,导致警告不断出现。

  • Creator 版本:2.4.4

  • 目标平台:Android

  • 详细报错信息,包含调用堆栈:



demo中在_cache方法中打印了缓存的id、srcUrl和localPath字段用于调试。

  • 重现方式:
    1、删除游戏缓存,确保首次进入游戏(设置中清除今日头条app的数据)
    2、使用今日头条扫码进入游戏
    3、根据文件下载提示,等待所有文件(demo中需要下300个文件)下载完成提示
    4、文件下载完成后需要等几分钟时间,让cacheManager缓存的文件数量达到一定上限(大约是400~500个文件,可以根据demo打印的localPath的值来判断缓存文件数量)。
    5、文件达到上限后会出现类似警告:
    copy file failed: path: ttfile://temp/tma/downloadfile/xxx.json message:copyFile:fail no such file or directory, copyFile xxx => xxx。
    从报错上看似乎是cacheManager在不断尝试复制不存在的文件。

  • 手机型号:华为mate20

  • 今日头条app版本:8.2.3

  • 编辑器操作系统 :windows 10

  • 编辑器之前是否有其它报错 :无

  • 出现概率:必现

demo链接: https://pan.baidu.com/s/14XonwS1dRPKhzqLjLsFbCg 提取码: mfc9

个人认为,短时间下载大量文件是不正常的。建议使用压缩包方式。

字节跳动也是支持解压的,点击查看

由于我们游戏的资源量比较大,为了优化加载性能,我们的游戏只把通用资源放到压缩包内并在登录前加载压缩包资源,而非通用资源都是在打开对应模块界面时动态加载的。

如果是采用这种使用时动态加载资源的方式,我觉得短时间内下载大量文件是可能的。比如我最初发现这个问题时就是先打开我们游戏的英雄界面,因为英雄数量比较多,所以会加载许多英雄头像,然后从主场景跳转到战斗场景,在战斗场景中加载资源时就可能会出现copyFile:fail no such file or directory的问题。

而且目前遇到的这个问题,只有在字节小游戏平台上出现,在微信小游戏和手Q平台是不会出现的。

应该是不影响游戏运行的吧?

我是用今日头条app测试的,今日头条app的版本是8.2.3

会影响游戏运行的。
我们游戏在从主场景的英雄界面切换到战斗场景,或者从战斗场景回到主界面打开英雄界面时有较高的概率出现 copyFile:fail no such file or directory的报错,然后后面会因为资源加载失败卡死

字节研发这边反馈在 8.2.4 版本有处理过这个问题,你这边升级下试试呢

好的,我明天用8.2.4版本的今日头条app试试看




我昨晚把今日头条app更新了,显示最新的版本号是8.2.5,但是刚刚用最新版本的app跑我们的项目还是会出现Copy file failed的报错,然后资源加载失败导致游戏卡住了。

你能直接用安卓的文件管理器,看下是不是存在gamecaches 目录么?小游戏缓存文件也在头条的目录下面

小游戏缓存文件夹是在 “/data/头条app包名” 的目录下吗?我的手机是华为mate20,没有root,没权限查看这个目录。



不过,我在真机调试环境下用头条的文件系统api是可以查询到gamecaches目录存在的。

gamecaches 下的 loadOnPlay 目录有么?

已向字节反馈,字节那边在定位中


gameCaches下的loadOnPlay目录是存在的。



刚刚测试发现有时ttfile://temp的目录用头条的文件系统api会访问不到

可能被头条自动清理了

大大,请问字节那边后面有反馈吗?

字节的人还在查,暂时还没回复我们