native与creator混合开发,动态加载资源?

背景:
我们在一个应用中有多个小游戏(上百个),每个小游戏的资源都可能是远程动态更新和加载的。
为了提高性能和版本更新方便,我们使用了creator来开发这些小游戏,每个小游戏都是一个单独的scence+prefabs。

方案:

游戏大厅及导航使用了native进行开发,列出游戏来,用户可以在iOS 的native代码中进行注册、充值、加好友以及别的内容。当点击游戏入口进入游戏的时候,找到当前游戏的所有资源,动态生成settings.js,然后cocos2d::Application::getInstance(); 获取到游戏实例进行展示和运行。当切换游戏的时候,销毁当前cocos对象,重新启动一个。

这样的好处是,每次我需要运行游戏,都是iOS native准备好资源,然后再启动cocos 的application,从而实现了不需要每次加载所有游戏(几百个)的资源。而资源的版本管理和更新,也可以由native的resource manager来实现。

但是目前遇到一个问题:

cocos在运行态的时候是一个单例,而且根本无法进行销毁,销毁以后很多资源仍然存在。getInstance()回来的对象是空,而且无法再重新初始化。

所以:有什么办法可以完全销毁和析构掉cocos产生的对象吗?以便于我切换下一个游戏的时候,使用我准备好的资源。

3赞

完全销毁cocos重新搞一个出来,除了重启app,还真没有想到好的方法。
你的这个需求,个人有以下想法:
1,你的大厅应该是没有用到cocos,只是小游戏运行时使用 cocos
2,cocos的相关单例对象,可以一直保留,APP启动时,不创建js虚拟机。
3,当启动小游戏时,创建一个新的js虚拟机出来
4,当退出小游戏时,删除js的虚拟机实例
5,退出时,删除声音,图片缓存等资源即可。
6,这个过程和热更新之后的重启原理类似。
7,js的代码和对象随着虚拟机一起消亡,不必在意。

感谢「魔鬼之魂」的快速回复。

您说这个方案我们也在测试,发现ScriptEngine也是一个单例,无法直接销毁(而且是个静态变量单例),做了源代码一些改动后看起来析构函数调用了。但是在重新run的时候, 提示textureCache不存在。

此外,用这个方案可能还会有另外一个问题:c++中创建的那些用于渲染展示的对象,仍然存在,并未被销毁。所以当切换另外一个游戏的时候,之前的那些对象还存在内存中,多切换几次后,可能会产生内存消耗过大的问题?

1,为什么老是想着销毁例如textureCache这样的单例对象呢?删除里面保存的图片不就可以了么?
2,C++的那些渲染对象,比如Node,会随着场景的销毁自动析构。就算某个场景没有被及时的gc掉,当你正确关闭JVM的时候,也会触发销毁。如果你发现没有销毁,说明你很可能没能正确关闭虚拟机。我测试过,当热更完重启虚拟机时,会触发场景的析构。

好的,我们参照您的方法试试看。

目前发现ScriptEngine销毁好像有点麻烦 :slightly_smiling: 尝试修改下代码试试。

进度如何了 我也遇到这个问题了

我们也想这样去做,请问 “当点击游戏入口进入游戏的时候,找到当前游戏的所有资源,动态生成settings.js,然后cocos2d::Application::getInstance(); 获取到游戏实例进行展示和运行”,这一步是怎么动态生成settings.js的呢

最后我们已经较好解决了这个问题,尽量不完全销毁之前的对象,而是使用game的reset方法,将状态恢复到最初,然后重新动态加载另外一个课的资源,cocos view会自动判断资源重用情况,目前看相对稳定。

关于setting.js 我们写了一个编译器来实现,动态编译所有的资源,新生成uuid并避免重复,可以看看creator的源码,方案类似。

给个app链接 体验下啊

大神方便描述详细点吗,主要应用场景是原生VC点击进入cocos游戏,然后cocos里面点击退出游戏回到原生app,下次还可以继续在原生VC点击进入cocos,可以反复操作

没有可以参考的类似app么

大佬现在找到什么比较好的实现方式了吗?我是做安卓的,也有类似的需求:3:

大佬,怎么把creator制作的游戏,被app调用啊?类似于微信小游戏一样,即点即玩,跟你这个有点像

MASK

请问具体是怎么实现的?

我们已经实现了,不过只是IOS端(OC+Cocoscreator)

请问怎么实现的啊?我们也要做IOS的