cocos2d-0001: EventDispatcher _toRemovedListeners std::find O(L*R) MEDIUM 2.4x cocos2d-0002: PhysicsWorld collisionBeginCallback std::find O(J_body*J_world) MEDIUM 11.6x cocos2d-0003: BoneNode::visit _boneSkins.contains O(C*S) per frame MEDIUM 7.3x MOAD-0002 (Intertangle): heavy singleton pattern (Director, etc.) but architectural, not patchable MOAD-0003 (Leaked Context): no thread_local usage, CLEAN MOAD-0004 (Logged Secret): no credential logging, CLEAN MOAD-0005 (Thundering Herd): TextureCache uses unordered_map, CLEAN 6/6 unit tests PASS.
72 lines
3 KiB
Diff
72 lines
3 KiB
Diff
# UNDF: UNDF-2026-000000960
|
|
--- a/cocos/base/CCEventDispatcher.h
|
|
+++ b/cocos/base/CCEventDispatcher.h
|
|
@@ -29,6 +29,7 @@
|
|
#include <string>
|
|
#include <unordered_map>
|
|
+#include <unordered_set>
|
|
#include <vector>
|
|
#include <set>
|
|
|
|
@@ -335,7 +336,7 @@
|
|
std::vector<EventListener*> _toAddedListeners;
|
|
|
|
/** The listeners to be removed after dispatching event */
|
|
- std::vector<EventListener*> _toRemovedListeners;
|
|
+ std::unordered_set<EventListener*> _toRemovedListeners;
|
|
|
|
/** The nodes were associated with scene graph based priority listeners */
|
|
std::set<Node*> _dirtyNodes;
|
|
--- a/cocos/base/CCEventDispatcher.cpp
|
|
+++ b/cocos/base/CCEventDispatcher.cpp
|
|
@@ -607,8 +607,7 @@ void EventDispatcher::removeEventListener(EventListener* listener)
|
|
return;
|
|
|
|
// just return if listener is in _toRemovedListeners to avoid remove listeners more than once
|
|
- if (std::find(_toRemovedListeners.begin(), _toRemovedListeners.end(), listener) != _toRemovedListeners.end())
|
|
+ if (_toRemovedListeners.count(listener) > 0)
|
|
return;
|
|
|
|
bool isFound = false;
|
|
@@ -636,7 +635,7 @@ void EventDispatcher::removeEventListener(EventListener* listener)
|
|
}
|
|
else
|
|
{
|
|
- _toRemovedListeners.push_back(l);
|
|
+ _toRemovedListeners.insert(l);
|
|
}
|
|
|
|
isFound = true;
|
|
@@ -1171,9 +1170,8 @@ void EventDispatcher::updateListeners(Event* event)
|
|
{
|
|
iter = sceneGraphPriorityListeners->erase(iter);
|
|
// if item in toRemove list, remove it from the list
|
|
- auto matchIter = std::find(_toRemovedListeners.begin(), _toRemovedListeners.end(), l);
|
|
- if (matchIter != _toRemovedListeners.end())
|
|
- _toRemovedListeners.erase(matchIter);
|
|
+ if (_toRemovedListeners.count(l) > 0)
|
|
+ _toRemovedListeners.erase(l);
|
|
releaseListener(l);
|
|
}
|
|
else
|
|
@@ -1192,9 +1190,8 @@ void EventDispatcher::updateListeners(Event* event)
|
|
{
|
|
iter = fixedPriorityListeners->erase(iter);
|
|
// if item in toRemove list, remove it from the list
|
|
- auto matchIter = std::find(_toRemovedListeners.begin(), _toRemovedListeners.end(), l);
|
|
- if (matchIter != _toRemovedListeners.end())
|
|
- _toRemovedListeners.erase(matchIter);
|
|
+ if (_toRemovedListeners.count(l) > 0)
|
|
+ _toRemovedListeners.erase(l);
|
|
releaseListener(l);
|
|
}
|
|
else
|
|
@@ -1560,7 +1557,7 @@ void EventDispatcher::cleanToRemovedListeners()
|
|
{
|
|
for (auto& l : _toRemovedListeners)
|
|
{
|
|
- auto listenersIter = _listenerMap.find(l->getListenerID());
|
|
+ auto listenersIter = _listenerMap.find(l->getListenerID());
|
|
if (listenersIter == _listenerMap.end())
|
|
{
|
|
releaseListener(l);
|