gpt4 book ai didi

ios - Cocos2d v3 - addChild 方法产生性能问题

转载 作者:行者123 更新时间:2023-11-29 02:27:26 25 4
gpt4 key购买 nike

我目前在 cocos2d 3.3 版中的 addChild 方法存在性能问题。我目前的情况是,我有大约十个 CCNode,其中包含一捆其他 CCNode(大约 500 个),我将这十个称为“大节点”。

“大节点”的子节点有自己的子节点(大约 3 个)。那些 CCNodes 是 Sprite 。

“大节点”的子节点均未执行任何操作。一切都发生在他们的更新方法中(如果相关的话)。

在我的主场景中,我找出了屏幕上的“大节点”。如果他们是一个新的“大节点”或者旧节点在屏幕上不再可见,我运行此代码:

self = mainScene
_allBigNodes = holds all avaible big nodes

NSMutableArray * childsToRemove = [NSMutableArray arrayWithCapacity: _children.count];

for(CCNode * child in _children){
if([child isKindOfClass:[BigNode class]]){
[childsToRemove addObject:child];
}
}

for(CCNode * child in childsToRemove){
[child removeFromParentAndCleanup:NO];
}

[childsToRemove removeAllObjects];

for(int BigNodeIndex = _fromBigNodePosition; BigNodeIndex<=_toBigNodePosition; ++BigNodeIndex){

BigNode * BigNode = [_allBigNodes objectAtIndex: BigNodeIndex];

[self addChild: BigNode];

}

主屏幕通常最多有两个子屏幕。上述方法效果很好。

关于这个问题:有时在我的游戏中我有一些紧张的 Action 。因此,我使用分析工具计算出上述 addChild 方法的耗时在 60-100 毫秒之间。

Running Time    Self                        Symbol Name
90.0ms 79.6% 0.0 -[CCNode addChild:]
90.0ms 79.6% 0.0 -[CCNode addChild:z:name:]
89.0ms 78.7% 0.0 -[CCNode onEnter]
88.0ms 77.8% 0.0 -[NSArray makeObjectsPerformSelector:]
88.0ms 77.8% 0.0 -[CCNode onEnter]
72.0ms 63.7% 0.0 -[NSArray makeObjectsPerformSelector:]
71.0ms 62.8% 0.0 -[CCNode onEnter]
42.0ms 37.1% 0.0 -[NSArray makeObjectsPerformSelector:]
42.0ms 37.1% 0.0 -[CCNode onEnter]
39.0ms 34.5% 0.0 -[CCScheduler scheduleTarget:]
38.0ms 33.6% 2.0 PrioritySearch
1.0ms 0.8% 1.0 DYLD-STUB$$objc::DenseMap<objc_object*, unsigned long, true, objc::DenseMapInfo<objc_object*> >::grow(unsigned int)
1.0ms 0.8% 0.0 -[CCNode physicsNode]
1.0ms 0.8% 0.0 -[CCNode physicsNode]
1.0ms 0.8% 1.0 objc_msgSend
1.0ms 0.8% 1.0 objc_object::sidetable_release(bool)
28.0ms 24.7% 0.0 -[CCScheduler scheduleTarget:]
26.0ms 23.0% 1.0 PrioritySearch
1.0ms 0.8% 0.0 -[CCScheduler scheduledTargetForTarget:insert:]
1.0ms 0.8% 1.0 DYLD-STUB$$objc_msgSend
1.0ms 0.8% 0.0 -[CCNode physicsNode]
1.0ms 0.8% 1.0 DYLD-STUB$$objc_msgSend
16.0ms 14.1% 0.0 -[CCScheduler scheduleTarget:]
14.0ms 12.3% 0.0 PrioritySearch
2.0ms 1.7% 0.0 -[CCScheduler scheduledTargetForTarget:insert:]
1.0ms 0.8% 0.0 -[CCScheduler scheduleTarget:]
1.0ms 0.8% 1.0 -[CCNode wasRunning:]

所以我的问题是:有没有一种方法可以停用 ccnode 或者什么是最好的解决方案来处理这种具有许多 ccnode 或这些屏幕外的“大节点”的情况?

提前致谢

最佳答案

500 个节点是很多节点。您不想在运行时添加/删除它们。

相反,当您不需要它们时,只需更改它们父级的 visiblepaused 属性,以防止它们呈现和运行预定的选择器和操作。

关于ios - Cocos2d v3 - addChild 方法产生性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27346655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com