wyb10a10 / cocos_creator_framework Goto Github PK
View Code? Open in Web Editor NEWcocos creator 基础框架,包含资源、ui管理,网络模块
cocos creator 基础框架,包含资源、ui管理,网络模块
用uimanager打开一个界面,Resloader里的_cacheItem缓存了一个use。然后UIManager执行uiview.autoReleaseRes时会报key已经存在,导致资源缓存无法存进autoRes中,导致无法自动释放
RT,两处不匹配,导致UIView在打开的时候adduse失败
rt
支持2.4.3吗?
NetNode的
protected onMessage(msg): void {
// console.log(`NetNode onMessage status = ` + this._state);
// 进行头部的校验(实际包长与头部长度是否匹配)
if (!this._protocolHelper.checkPackage(msg)) {
console.error(`NetNode checkHead Error`);
return;
}
// 接受到数据,重新定时收数据计时器
this.resetReceiveMsgTimer();
// 重置心跳包发送器
this.resetHearbeatTimer();
// 触发消息执行
let rspCmd = this._protocolHelper.getPackageId(msg);
console.log(`NetNode onMessage rspCmd = ` + rspCmd);
// 优先触发request队列
if (this._requests.length > 0) {
for (let reqIdx in this._requests) {
let req = this._requests[reqIdx];
if (req.rspCmd == rspCmd) {
console.log(`NetNode execute request rspcmd ${rspCmd}`);
this._callbackExecuter(req.rspObject, msg);
this._requests.splice(parseInt(reqIdx), 1);
break;
}
}
console.log(`NetNode still has ${this._requests.length} request watting`);
if (this._requests.length == 0) {
this.updateNetTips(NetTipsType.Requesting, false);
}
}
let listeners = this._listener[rspCmd];
if (null != listeners) {
for (const rsp of listeners) {
console.log(`NetNode execute listener cmd ${rspCmd}`);
this._callbackExecuter(rsp, msg);
}
}
}
这里
if (!this._protocolHelper.checkPackage(msg)) {
console.error(`NetNode checkHead Error`);
return;
}
是不是应该返回一个msg出来,这个返回的msg才是真正意义上的逻辑包
releasRes会释放item以及item的依赖资源,但是resLeakChecker只会对item进行进行移除,这是否会导致resLeakChecker的计算不准确?如下注释所示:
public releaseRes() { let resArgs: ReleaseResArgs = ResLoader.makeReleaseResArgs.apply(this, arguments); let item = this._getResItem(resArgs.url, resArgs.type); if (!item) { console.warn(
releaseRes item is null ${resArgs.url} ${resArgs.type}`);
return;
}
// cc.log(arguments);
let cacheInfo = this.getCacheInfo(item.id);
if (resArgs.use) {
cacheInfo.uses.delete(resArgs.use)
if (this.resLeakChecker) {
this.resLeakChecker.logRelease(item.id, resArgs.use);//会将item 从resLeakChecker的_log里面移除
}
}
if (cacheInfo.uses.size == 0) {
this._release(item, item.id);//递归释放item资源以及item的依赖
}
}`
有明显的内存泄漏。。你试试。。spine 的文件,加载/卸载 内存一直加。。目测是spine的纹理没有卸载掉。。。
如题,定位原因是let depItem = ccloader._cache[depKey];depItem可能为空,尝试depItem.id会直接报错。需要在_release()方法写 depItem&&this._release(depItem, item.id);_buildDepend()方法写上depItem&&this._buildDepend(depItem, depItem && depItem.id ? depItem.id : refKey);
没有声音管理哦!
ResLoader._release根据item.url获取cacheInfo,应该改为根据item.id获取。
如果打包md5,item.url是会带md5码的。
// 2. 监听场景切换 cc.director.on(cc.Director.EVENT_BEFORE_SCENE_LAUNCH, (scene) => { this._cacheScene(scene); });
场景切换时,会将上一个场景的常驻节点的资源清除,这并不是我们希望看到的。
节点跟着场景切换销毁,然后onDestroy里面进行资源释放,会引发如下错误
private _isSceneDepend(itemUrl) {
let scene: any = cc.director.getScene();
let len = scene.dependAssets.length;//scene为null
for (let i = 0; i < len; ++i) {
if (scene.dependAssets[i] == itemUrl)
return true;
}
return false;
}
预制father上面有两个子节点A、B,A、B上面各引用了预制a、b。a预制的脚本上挂了b预制,b脚本上挂了a预制。这样我在加载预制资源father的时候,_buildDepend()会陷入死循环
目前我的解决办法是定义一个数组记录已经打上标记的资源,打上标记的时候跳过数组内的元素。代码如下: /**已经被打上标记的 */ addedDepKeyArray:any[] = []; private _buildDepend(item: any, refKey: string) { // 反向关联引用(为所有引用到的资源打上本资源引用到的标记) if (item && item.dependKeys && Array.isArray(item.dependKeys)) { for (let depKey of item.dependKeys) { let index = this.addedDepKeyArray.indexOf(depKey); if(index!==-1){ cc.log('已经打上标记的不再打上标记'); cc.log(depKey); continue; } this.addedDepKeyArray.push(depKey); // 记录该资源被我引用 this.getCacheInfo(depKey).refs.add(refKey); cc.log(
${depKey} ref by ${refKey}); let ccloader: any = cc.loader; let depItem = ccloader._cache[depKey] this._buildDepend(depItem, refKey); } } }
build之前置空数组
private _finishItem(url: string, assetType: typeof cc.Asset, use?: string) { let item = this._getResItem(url, assetType); if (item && item.id) { this.addedDepKeyArray.length = 0;//制空 this._buildDepend(item, item.id); } else { cc.warn(
addDependKey item error! for ${url}); } cc.log('_buildDepend Finish'); // 添加自身引用 if (item) { let info = this.getCacheInfo(item.id); info.refs.add(item.id); if (use) { info.uses.add(use); } } }
同样的,release资源的时候也会有循环引用的问题
很好的框架,为什么不继续进行更新呢?每半年 更新一版本都行啊。。。。
宝爷什么时候更新到3.4版本?
todo: 热更新
todo: 新手引导框架
比较期待这些使用功能!!!
什么时候可以出个多语言本地化
看了你写的例子,现在用你的组件可以有效的管理释放资源了,但是基于项目的需求,我们有时候不一定是通过loadRes动态加载资源的。请问loadDir和loadArray这两个方法动态加载的资源如果有效的管理起来?
E:\cocoscreator\cocoscreator\cocos_creator_framework\assets\Spine\10000\10000_Attack2.skel, message: Error: Can not find E:\cocoscreator\cocoscreator\cocos_creator_framework\assets\Spine\10000\10000_Attack2.atlas
at I:\CocosCreator_2.3.0\resources\engine\extensions\spine\editor\spine-meta.js:56:26
at I:\CocosCreator_2.3.0\resources\app.asar\node_modules\fire-fs\index.js:14:9
at FSReqCallback.oncomplete (fs.js:163:21)
UIManager 中的防触摸层如果设置成跟实际CANVAS大小的话,会失效!
如: iphonexs CANVAS Size {width: 375, height: 812}
而实际显示的 VisibleSize {width: 760, height: 1645} 这样子,那个防触摸层 就不能起到作用了!!
/**
* 添加防触摸层
* @param zOrder 屏蔽层的层级
*/
private preventTouch(zOrder: number) {
let node = new Node()
node.name = 'preventTouch';
let uiCom = node.addComponent(UITransform);
console.error("防止触摸的层级尺寸",view.getCanvasSize(),view.getVisibleSize());
uiCom.setContentSize(view.getVisibleSize()); // 改成这样子就好了!!!!
node.on(Node.EventType.TOUCH_START, function (event: any) {
event.propagationStopped = true;
}, node);
let child = director.getScene()!.getChildByName('Canvas');
child!.addChild(node);
uiCom.priority = zOrder - 0.01;
return node;
}
rt
如果调用了ResLoader.loadRes加载了一个prefab A,则A和A所引用的资源 引用计数都会+1,如果这时候我instantiate出了A1,则A1和A1所引用的资源好像没有被管理,请问这部分资源应该如何纳入ResLoader管理呢?
在NetNode.ts的第84行:
if (this._connectOptions == null) {
options.autoReconnect = options.autoReconnect
}
根据我我理解,宝爷在这里应该是想在第一次连接的时候设置自动重连的次数,所以正确的代码应该是这样色的:
if (this._connectOptions == null) {
this._autoReconnect = options.autoReconnect
}
ResLoader没有调用cc.loader.load接口,这个接口用于加载远程资源或者是本地用户目录的资源,在移动端上还是很有必要的,希望可以加上这个接口。
export let uiManager: UIManager = new UIManager();
为什么不写成
export let UIMgr = UIManager.getInstance();
检测item资源是否被场景依赖时是通过item的url进行检测。但在有些平台item的url会带上md5,因此会检测没有被场景依赖,从而导致不该释放的资源被释放。
目前测出来的:龙骨动画在oppo runtime2.6必现,vivo平台貌似也会出现。
不知道宝爷你这边有没有办法对item的url进行去除md5办法?
写了个类,里面需要操作UI层,但是一引用就报错:load script [./ResLoader] failed : TypeError: ResKeeper_1.default is not a constructor
把这个类文件,放到uI同个目录,就不报错了。。
目前结构:
script
---ui
---mgr
mgr里面写了个Test.ts:
import UIGameMain from "../ui/uiviews/UIGameMain"
export class SignInMgr {
test() {
UIGameMain.Ins.onClickSign()
}
}
请问一下。。。是不是我姿势不对。。。
如题
好久没有看到更新了?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.