Memory 4

  一个游戏最大的内存消耗就是游戏资源的缓存。游戏资源主要包括图片、音频、游戏数据等等,这些资源都得从游戏硬盘上读取并加载到内存中,然后游戏才能使用。
  这些资源中尤其是图片对内存的消耗很大,像一张标准的1024x1024大小的png图片加载到内存中,每个像素占4个bytes,整张图片就要占4MB的内存。
  关于资源的优化有这一篇我认为已经是终极指南的文章了,推荐给大家看。在这里。人家游戏制作人的认真和严谨的态度真的是非常棒。
  我再补充一点点自己的见解。游戏资源管理的核心工作包括:

  • 资源的压缩和加密存储。游戏在发布时为了减小安装包大小和保护资源的版权,就需要做这些工作。使用压缩和加密会导致资源加载时消耗额外的时间。
  • 资源的获取。一般游戏的资源会全部附带在安装包中,也有的游戏不在安装包放所有资源而是随游戏更新从服务器下载。
  • 资源缓存的加载和清理。游戏卡顿的一个重要原因就是游戏资源的加载导致的。从硬盘上读取一个文件是非常慢的,有没有体会过某个游戏或是程序在点一些界面的时候,第一次点会很卡,以后就很流畅,那往往就是因为第一次要从硬盘上读取图片等等的资源。读取资源其实并没有多少CPU的工作,但是一般使用的底层io接口是同步执行会等待io操作,所以程序会一直停在那里,导致卡顿的现象。所以想要游戏不卡一定要仔细处理资源加载的方式和时机。比如方式可以用开一个专门负责加载的线程,或是将资源加载处理分散在多个游戏帧中进行,而不是集中在同一帧里;时机可以集中在场景切换时,或是根据游戏逻辑预测需要使用新资源时提前逐步进行缓存加载。

  Dorothy中有提供oContent接口进行资源的压缩和加密,目前还比较简单只提供了zip的打包压缩和简单地加密。资源的加载提供了oCache接口统一对所有需要缓存加载的资源进行管理。资源的获取Cocos2d-x的扩展中带有有AssetsManager帮助从服务器获取资源。
  Dorothy中还有统一进行所有支持资源的异步加载方法,oCache.loadAsync,简单的示例如下:

print("创建并执行一个新的Dorothy线程")

oRoutine(once(function()
	print("开始加载资源")
    
    oCache.loadAsync(
    {
    	"image1.png",
    	"image2.png",
        "girl.clip",
        "girl.model",
        "effect.particle",
    },function(filename) print("已加载资源",filename) end)
    
    print("资源加载完成")
end))

print("该线程不会阻塞主程序的运行")

--[[
输出:
	创建并执行一个新的Dorothy线程
    该线程不会阻塞主程序的运行
    开始加载资源
    已加载资源 image1.png
    已加载资源 image2.png
    已加载资源 girl.clip
    已加载资源 girl.model
    已加载资源 effect.particle
    资源加载完成
--]]
标题目录