和大家探讨一下更新和io效率和存放lua在zip包里的几个疑问

今天无意间看到刀塔传奇这个游戏在第一次下载后可以秒进游戏 基本上没有解压资源和加载资源两个步骤
所以我很好奇 一开始我是这样猜测的:
1:不需要解压文件 那可能游戏内的整套资源是存放在一个大的资源包内 这样第一次下载后会把整个资源包拷贝到可写目录 通过合适的包管理算法 就可以做到即可以享受一次io的高效 也可以做到文件内部自动更新和读取的便利
2:不需要预加载资源 那基本上肯定是通过延时(用时)加载策略和适当的缓存机制实现

对于第二点应该没什么疑问 但是对于第一点 在我打开apk观察后就有了巨大的疑问!

刀塔传奇所有资源全部存放在assets目录下 那就产生了两个问题:一个是读取大量小文件的效率问题 二是如何做到增量更新?

对于第一点 因为apk本来就是一个zip压缩包 在zip压缩包内部读取大量小文件的性能应该很低才对 那刀塔传奇是如何处理的?是否是有更加高效的方式从apk中进行io读操作么??【1:求高人指点一下】
对于第二点 apk下文件应该完全不可写(难道我的认知是错误的??【2:求高人指点一下】) 如果完全不可写 那是如何做到资源热更新的? 难道是更新的时候在可写目录下映射出一样的目录结构 在读取的时候选择性的加载文件? 这样无疑会浪费大量的存储空间 【3:求高人指点一下】

最后还有一点是技术问题 我以前没有研究过 如下 【有研究过的稍微提一下吧 我没有看源码 因为平时是在太忙 所以想做伸手党向有经验的同学咨询一下 喷子勿喷】

quick中的lua整的zip包是如何实现的
【【【我的猜测:两种方式:

  1. 直接压缩所有的lua文本文件(可能会加密) 然后在存放在zip包中
  2. 直接把所有的lua文件编译成字节码,然后在存放在zip包中】】】

这两种我个人猜测的方式 个人觉得第一种会产生更小的zip包(因为字节码文件在zip包中的压缩很有限) 但是会有比较差的lua解释效率(运行效率)(因为是对对纯lua代码进行解释)
第二种则是一个稍大的zip包 但是lua的执行效率会更高(无论是lua还是luajit 字节码已经省去了大量先前工作)

但是 以上两点只是猜测 具体是怎么样的呢【4:求高人指点一下】

对于lua的zip包 如果是通过以上两种方式 个人认为都可以做到热更新 只是对zip包中的小文件进行覆盖写而已 如果不是上面两种思路 是不是可以做到热更新呢 或者说quick现在的那个lua整zip包文件能否以及如何做到热更新单个文件【5:求高人指点一下】

最后关于lua的zip包一样有一点疑问 【6:如果是通过重写loader的读方法 这样一样会有对zip包小文件频繁读取的性能问题 求高人指点一下怎么解决】

6点疑问 夹杂一系列小问题 有兴趣的朋友来共同探讨一下吧!

沙发基本上解答完了,暂时没有可补充的,呵呵

楼上 你没有回复我想要知道的核心问题:
1、4、5、6 我关心的是apk直接读取大量小文件的读取效率 这点在我的印象中性能会非常不堪 如果我一次性读取30个图片 会非常慢(不要和我说现在的机器性能如何 做安卓要面向的就是80%以上的机器 也就是我们要照顾到所有的低端机)
2 ok 确认一下这个常识性问题
3 我在我的猜测中有提到你所说的解决方案 但是 你没有回答双倍存储空间的弊病如何解决

总结一下:我关心的io的性能和存储空间的占用

实际上我提到的所有的问题 无论是内存占用还是io消耗 我都有解决方案 我所关心的是 在刀塔传奇的这种实现方式下【所有的散文件都是存放在apk中,所有的lua单独存放在zip中】 是如何做到高效的

ps:刚才看了一下刀塔传奇android的运行后存储 确认热更新应该是通过冗余存储的方式解决 而且是写在本地数据库中

ok 存储空间的问题我想当然了 因为早几年的游戏内部都是不放置资源包的 所有的资源包都是进游戏前下载的 现在时代进步了 呵呵

我们都是把所有资源打包成大包的 和端游走一样的补丁以及包机制 所以也不会有zip包的问题 -x的search path我们没用过 我们有一套uri的重新向机制 一样的效果

我们的方案也是资源打成一个大的zip然后解压到可写目录,不过必然会产生双倍的空间占用
现在就在纠结文件放在apk内和直接读文件的io性能差多少

io性能方面有具体的测试结果吗……求教

我的经验是apk里面读取20-30张小图片 卡住加载 延时会在2s以上(两三年前的安卓机器 256M的内存)在zip包里面读文件不可能快的
现在会好一些 但是在性能上面还是不要掉链子 这个是基础功能 一开始的路子走错了 以后纠正会非常麻烦

android 从apk里面读文件肯定没有直接从SD卡上读文件快 特别是主场景加载资源比较多得情况下。

那看来还是得做成提前释放,只不过占用内存的问题就无解了

内存不是io讨论的范畴了
使用打包纹理和压缩纹理可以很大程度解决高内存的问题
使用内存池可以减少内存碎片 一样可以缩减内存