Git Product home page Git Product logo

cocos_creator_framework's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cocos_creator_framework's Issues

没有粘包处理逻辑么

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的计算不准确?

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的依赖
    }
}`

打包example_ui案例到微信开发者工具环境报错

如题,定位原因是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有bug

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回调里进行资源释放会引发错误

节点跟着场景切换销毁,然后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.x的一点疑问

宝爷,这里有个问题,能请教你一下吗?,我看您在3.x版本中的 这里有多加了这一句。我清理的时候,看到新增的资源没有清理。多加的这里是做什么用的?另外我看了2.x。这里是没有引用的。这句注释之后。清理就成功了。看了下代码。这里也是addRef()了一下。
微信图片_20220831112537

loadDir和loadArray动态加载的资源如果管理?

看了你写的例子,现在用你的组件可以有效的管理释放资源了,但是基于项目的需求,我们有时候不一定是通过loadRes动态加载资源的。请问loadDir和loadArray这两个方法动态加载的资源如果有效的管理起来?

cocos creator 2.3.0版本打开工程,导入skel文件失败

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)

宝爷提一个,添加防触摸层 的 BUG

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;
   }

prefab实例化的时候资源应该如何管理?

如果调用了ResLoader.loadRes加载了一个prefab A,则A和A所引用的资源 引用计数都会+1,如果这时候我instantiate出了A1,则A1和A1所引用的资源好像没有被管理,请问这部分资源应该如何纳入ResLoader管理呢?

NetNode.ts 的自动重连貌似有一句写错了的代码

在NetNode.ts的第84行:
if (this._connectOptions == null) {
options.autoReconnect = options.autoReconnect
}
根据我我理解,宝爷在这里应该是想在第一次连接的时候设置自动重连的次数,所以正确的代码应该是这样色的:
if (this._connectOptions == null) {
this._autoReconnect = options.autoReconnect
}

cc.loader.load接口没有?

ResLoader没有调用cc.loader.load接口,这个接口用于加载远程资源或者是本地用户目录的资源,在移动端上还是很有必要的,希望可以加上这个接口。

龙骨动画在oppo平台上无法正确释放

检测item资源是否被场景依赖时是通过item的url进行检测。但在有些平台item的url会带上md5,因此会检测没有被场景依赖,从而导致不该释放的资源被释放。
目前测出来的:龙骨动画在oppo runtime2.6必现,vivo平台貌似也会出现。
不知道宝爷你这边有没有办法对item的url进行去除md5办法?

请问数据层调用UI的正确姿势是什么样子的

写了个类,里面需要操作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()
    }
}

请问一下。。。是不是我姿势不对。。。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.