老鸟入手cocos creator的5个问题!!!.....急!....急!.....急!!!

1.内存具体是怎么管理的,请给明确例子?(别含糊说无法确定内存释放时间)
2.creator提倡的数据驱动模式下,数据和界面该怎么设计为好?
3.可不可以提供一个较好的MVC例子?
4.游戏的不同模块需要怎么设计(在creator设计上),比如好友模块,和任务模块需要怎么设计,然后在代码中是怎么通过按钮菜单点击切换和释放的?
5.creator的API可以设计成电子书格式支持离线阅读么?
注:求触控爸爸用心解答一下,就当我们是小白吧~

我回答一下第一个问题,JS 内存管理依赖 JS 引擎的垃圾回收机制,垃圾回收机制是不断发展的一项技术,尤其是在 JS 引擎中,这十年来发生了天翻地覆的变化。对于普通开发者来说,你需要做就是,保障你想要释放的对象,不再被任何其他对象引用即可,至于这个对象的内存什么时候被释放,完全由垃圾回收机制说了算,一般情况下,v8 / Spidermonkey / ChakraCore / JavascriptCore 这些引擎的分片回收机制都会很及时得回收垃圾,但是,总会遇到一些情况释放不会那么及时。

假设两种情况,一个常驻对象,在游戏进程中存在了很长时间,但是某个时间点突然变成垃圾了,另一个对象,是一个函数的临时对象,函数退出时它就变成垃圾了。这两种情况下,第二种基本都会及时被回收,而第一种则很难被及时回收。

所以事实上就是无法确定内存确切释放的时间,不过不用担心,一般垃圾回收机制是很及时的。下面是 JS 内存管理的简介性质的文章

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Memory_Management

对于 Creator 引擎来说,需要区分引擎内部对对象的引用,和用户代码对于对象的引用,引擎提供了一些机制来管理引擎内部的引用,而用户代码的引用则无法提供任何有效的 API 来管理,需要用户自行管理。游戏中对于内存影响最大的是资源对象,可以参考这篇文档中对于资源对象的内存管理

http://cocos.com/docs/creator/scripting/load-assets.html

3赞

一路追随cocos走过来,也非常希望cocos creator能够坚定自己的定位,并以此不断完善,不希望看到使用cocos的用户越来越少。(从cocos2d-x 2.x到cocosd-x 3.x,然后再到cocos2d-x lua ,然后是quick,然后又是creator),说真的,不坚定引擎的定位,会流失大量用户,你们可以想想,这样一路过来用户得需要多少精力和时间去学习(所以用户疲于应对新引擎版本,抛弃选择也是在所难免),因此,哪怕我们触控能够在把引擎定位为最牛B的2d游戏引擎也好呀,起码能够保证市场地位!(建议不要盲目布局过远,先做好当下再说吧(说句不好听的,当前的引擎都没有完善,搞来搞去有意思么?所以问题在于没有把引擎定位好,更没有果断坚定自己定位),望慎思之!!!

2赞

你这回复跟帖子无关啊,咱们有技术问题就讨论。决策层面的问题建议你去搜一下论坛,有很多类似的帖子了,找喜欢的主题回复相信可以满足你表达的欲望。在这个技术问题帖子下面,我就不发表看法了

技术问题也是因为决策引起的,不然哪里那么多技术问题

楼主啊,你的题目说你是一个老鸟。
然后你的问题条目除了第一条和引擎有关之外,后面几个概括下来,就是:游戏要怎么做?
最后你的回答,就变成发泄对COCOS的不满。
这个思路不连贯啊?

关于第二条:creator提倡的数据驱动模式下,数据和界面该怎么设计为好?
关于第三条:可不可以提供一个较好的MVC例子?
第于第四条:4.游戏的不同模块需要怎么设计(在creator设计上),比如好友模块,和任务模块需要怎么设计,然后在代码中是怎么通过按钮菜单点击切换和释放的?

本质上就是你会有逻辑类,界面类:

从服务器下来的数据,由你的逻辑类来管理,用组件来切分逻辑,比如背包组件,好友组件,任务组件。这些逻辑组件对各自功能模块进行操作,然后发给服务器,服务器返回操作结果。逻辑组件更新数据。

数据更新之后,通过node.emit发送事件,至于谁来处理这些事件,逻辑组件不关心。

而界面打开时,使用逻辑类的数据来初始化界面;并且监听逻辑组件的事件,事件到来时,更新界面。这样就自然而然的把逻辑和显示分开了。

你说的提供MVC的例子,这和Creator本质上没有任何关系,是你怎么设计的问题,例子网上也一大把,但我不认为看了例子就能很好的用上。关键还在于为什么要用MVC,有什么好处,深刻理解这些之后,怎么设计才是自然的事情。

TM这也叫老鸟。。服了

1赞

醉了醉了。。。。。

creator的API可以设计成电子书格式支持离线阅读么?
也想要一份这个…

楼主要特别注意这篇文档中中的贴图资源释放,也就是这段代码

// 直接释放某个贴图
cc.loader.release(texture);
// 释放一个 prefab 以及所有它依赖的资源
var deps = cc.loader.getDependsRecursively('prefabs/sample');
cc.loader.release(deps);
// 如果在这个 prefab 中有一些和场景其他部分共享的资源,你不希望它们被释放,有两种方法:
// 1. 显式声明禁止某个资源的自动释放
cc.loader.setAutoRelease(texture2d, false);
// 2. 将这个资源从依赖列表中删除
var deps = cc.loader.getDependsRecursively('prefabs/sample');
var index = deps.indexOf(texture2d._uuid);
if (index !== -1)
    deps.splice(index, 1);
cc.loader.release(deps);

我们自己开发的H5游戏,内存占用峰值从500MB,注意手动释放纹理内存后降低到350MB,30%的明显提升。

首先声明一点是:我不是在发泄对引擎的不满,相反的是我非常期待我们的引擎更加完美!(如果是对引擎不满,大可不用便是!正因为充满期待,所以才会表达一下个人浅薄的看法。)
其次,这个‘老鸟’不是什么指我自己,只是随便起的一个标题。(现在看来糗大了,哈哈)
接着,非常感谢触控对我们这些用户的耐心解答,这也说明触控官方非常重视这个引擎,因此也坚定我们用户对触控官方信心,相信官方会把引擎做的更好,所以这点按现在来看是毋庸置疑的!
最后,本人会一直支持这款引擎的发展。非常谢谢解答~

这点可以请忽略,因为引擎本身是开源的~是我锅,误导了大家,非常抱歉,请忽略此点问题!(具体api可以参考开源源码)

谢谢王大大~

请叫我小白,膜拜大神~

我也是醉了,哈哈~

panda大大,我可以知道什么时候垃圾回收开始和什么时候结束吗,比如开始和结束的时候把信息打印出来。现在我这边出现个问题,就是切换到新场景后,部分手机很容易出现2-3s的卡死现象,现在想确定是不是当时正在垃圾回收从而导致卡。:14:

1.6 中有注册 Spidermonkey GC 的 start 和 end,不过要在 C++ 层写。2-3 秒卡死有点过,可以 QQ 联系我我提供新版本 native 库给你试试

100362595

可能我也是小白,至目前为止还没有关心过内存问题。。 不过我大概看了一下,基本上我的项目内存在200MB以下。 难道是我的游戏太简单了?

或者是你天生就对内存控制比较敏感比较注意,或者是你的美术不够浪。美术浪起来,那就挡不住了。

1赞

这样去释放资源就等于自己做一个资源的引用机制,不然怎么区分出哪些资源在哪里用,又在哪里没有用。正如你们自己说的