[建议] 增加 Creator 的内存管理和资源同步加载的 api

嗨,下午好

  1. 我们在一个 Scene 里面实现了自己的切换画面逻辑,并没有使用到 Creator 的 loadScene 等 api,目前提供的资源释放——自动释放场景资源有一定的局限性,希望能够增加完善的内存管理能力,方便开发者可以更好的掌控内存。
  2. 同步加载资源也是我们目前很需要的一个功能,当我们在一些性能较为孱弱的设备上运行游戏时会经常动态加载资源,异步的加载过程会给程序逻辑带来很大的不便,希望官方能够尽快推出同步加载方式。
  1. 资源管理的 API 计划在下个大版本中进行集中完善,下面简要介绍下,如果有不同意见欢迎指出:

增加场景内部资源管理用的辅助 API

来自志明的需求:
场景中有很多界面,界面之间有不少共享的 UI 元素,全部界面打开一遍后内存占用过高,希望能做到每关闭一个界面就立刻释放所用到的资源。并且界面重新打开后,如果发现资源已被释放,就自动再重新加载并渲染(类似资源不预加载时的处理方式)。

我建议在 Sprite 的 onEnable / onDisable 中做引用计数,计数结果保存在类似 cc.textureCache 或者 cc.Sprite.textureRefCounts 对象中,遍历该对象能获得所有渲染中的贴图信息。
该引用计数不负责处理其它组件及用户逻辑中的引用,仅仅表明 Sprite 组件对某个资源的使用状态。用户根据这个引用计数进行资源释放,风险自负。

这样一来,每当玩家隐藏一个 UI,开发者可以用 getComponentsInChildren 获得 UI 中的所有 sprite,然后判断每个 sprite 用到的资源计数是否为 0,如果为 0 则自行通过 cc.textureCache.removeTextureForKey(url) 进行释放

##loader 提供获得所有关联资源的 API
主要用于获得一个 prefab 依赖的所有资源,方便用户进行资源释放

##CCLoader 添加 releaseResAll
loadRes 是通过 releaseRes 进行释放的但是 loadResAll 缺没有对应的释放函数,所以需要添加。
反馈来自 http://forum.cocos.com/t/api/37308/48

##loadResAll 支持传入数组
之前 loader 的相关讨论中,一个出发点是为了避免传入参数类型不同,导致回调的类型不同,因此添加了 loadResAll 这个 API。

那不破坏这条规则,我们在保证回调仍然是传入一个数组的情况下,是否可以增加传入参数是数组的支持?

cc.loader.loadResAll(‘foo’, Type, function (err, results) {
// foo/1, foo/2, foo/3 …
});
cc.loader.loadResAll([‘foo/2’, ‘foo/3’], Type, function (err, results) {
var foo2 = results[0];
var foo3 = results[1];
});

##允许 cc.loader.getRes 传入类型参数
方便获取不同类型的资源
releaseRes 也统一加上吧

谢谢,我们的需求和上文 志明 的很接近,因为界面中有太多元素占用了比较多的内存,希望能够动态加载和释放。至于实现的方式,我觉得可以放在 CCLoader 中实现,利用现在的 releaseRes 等就好,只是在 CCLoader 内部实现你们也许使用引用计数,对于被共享的资源也只是在引用计数到 0 后才真正释放。这样看起来会显的整齐统一。