# redgametest **Repository Path**: jerry-pang/redgametest ## Basic Information - **Project Name**: redgametest - **Description**: 测试项目 - **Primary Language**: C++ - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-09-23 - **Last Updated**: 2025-09-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 关于redgame框架中redmanager 和 cocos 界面root node 循环引用的问题简单demo演示 仓库中提供了TestLayer 用于模拟 redmanager的使用场景 GameScene 为 cocos 界面运行的载体 其中TestLayer 介绍 如下: RedManager 模拟框架中的redmanager ```cpp class RedManager :public Ref { private: cocos2d::Vector _layers; public: RedManager(); virtual ~RedManager(); void addLayer(Node* pLayer); void clearLayerRef(); }; ``` CompoRebolt 模拟框架中的CompoRebolt ```cpp class CompoRebolt :public cocos2d::Component { private: RedManager * _redManager; public: /// 获取组件 static CompoRebolt* GetOrCreateFrom(Node*); static CompoRebolt* GetFrom(Node*); static CompoRebolt* create(Node* param); CompoRebolt(); virtual ~CompoRebolt(); bool init(Node* owner); void setManager(RedManager* pRedManager); RedManager* getRedManager(); }; ``` 模拟实际界面 ```cpp class TestLayer :public LayerColor { public: // 创建场景 static TestLayer* create(); TestLayer(); virtual ~TestLayer(); // 初始化 virtual bool init() override; RedManager* getRedManager(); // 退出事件 virtual void onExit() override; private: RedManager* _redManager; }; ``` 以下是测试代码 ```cpp auto pTestLayer = TestLayer::create(); addChild(pTestLayer); CompoRebolt::GetOrCreateFrom(pTestLayer)->setManager(pTestLayer->getRedManager()); CompoRebolt::GetOrCreateFrom(pTestLayer)->getRedManager()->addLayer(pTestLayer); ``` TestLayer::create(); 模拟的是redmain界面的解析和创建 当解析的时候会创建redmanager对象,同时绑定到CompoRebolt组件中,供后续行为树使用。 行为树中有利用cocos节点执行runAction的逻辑,同时会用cocos2d::Map 持有运行节点的引用, 这对导致组件的对象持有节点的引用,节点又含有组件对象,相互引用。导致引用计数无法归0的问题。 CompoRebolt::GetOrCreateFrom(pTestLayer)->getRedManager()->addLayer(pTestLayer); 其实就是为了模拟这个问题 解决办法:只有在节点退出的时候,手动断掉引用链才行。 但这种设计对于使用者来说是很容易出问题的。一但忘记手动断掉引用关系就会导致内存泄露。 或者断开时机不对,会导致时序错误,引起崩溃。