Skip to content

Commit bdc9603

Browse files
authored
Fix the issue where the Spine batch feature fails to work properly on native platforms. (#18729)
1 parent 6cebb55 commit bdc9603

File tree

3 files changed

+18
-12
lines changed

3 files changed

+18
-12
lines changed

native/cocos/2d/renderer/Batcher2d.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,7 @@ CC_FORCE_INLINE void Batcher2d::handleMiddlewareDraw(RenderEntity* entity, Rende
427427

428428
// check for merge draw
429429
auto enableBatch = !entity->getUseLocal();
430-
if (enableBatch && _currTexture == texture && _currMeshBuffer == meshBuffer && !_currEntity->getUseLocal() && material->getHash() == _currMaterial->getHash() && drawInfo->getIndexOffset() == _currDrawInfo->getIndexOffset() + _currDrawInfo->getIbCount() && layer == _currLayer) {
430+
if (enableBatch && _currTexture == texture && _currMeshBuffer == meshBuffer && !_currEntity->getUseLocal() && material->getHash() == _currMaterial->getHash() && drawInfo->getIndexOffset() == _currDrawInfo->getIndexOffset() + _currMiddlewareIbCount && layer == _currLayer) {
431431
_currMiddlewareIbCount += drawInfo->getIbCount();
432432
} else {
433433
generateBatch(_currEntity, _currDrawInfo);

native/cocos/editor-support/MiddlewareManager.cpp

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,17 +55,22 @@ MeshBuffer *MiddlewareManager::getMeshBuffer(int format) {
5555
}
5656

5757
void MiddlewareManager::updateOperateCache() {
58-
for (auto &iter: _operateCacheMap) {
59-
auto it = std::find(_updateList.begin(), _updateList.end(), iter.first);
60-
if (iter.second) {
58+
for (const auto &op : _operateCacheQueue) {
59+
IMiddleware *editor = op.first;
60+
bool isAddOperation = op.second;
61+
62+
auto it = std::find(_updateList.begin(), _updateList.end(), editor);
63+
if (isAddOperation) {
6164
if (it == _updateList.end()) {
62-
_updateList.push_back(iter.first);
65+
_updateList.push_back(editor);
66+
}
67+
} else {
68+
if (it != _updateList.end()) {
69+
_updateList.erase(it);
6370
}
64-
} else if (it != _updateList.end()) {
65-
_updateList.erase(it);
6671
}
6772
}
68-
_operateCacheMap.clear();
73+
_operateCacheQueue.clear();
6974
}
7075

7176
void MiddlewareManager::update(float dt) {
@@ -85,7 +90,7 @@ void MiddlewareManager::update(float dt) {
8590
void MiddlewareManager::render(float dt) {
8691
// Object._deferredDestroy is called after component update in Director.tick and before emitting BEFORE_DRAW event in which MiddlewareManager::render is invoked,
8792
// so the native object may be released here and it needs to be erased from _updateList.
88-
for (auto &iter : _operateCacheMap) {
93+
for (auto &iter : _operateCacheQueue) {
8994
auto it = std::find(_updateList.begin(), _updateList.end(), iter.first);
9095
if (!iter.second && it != _updateList.end()) {
9196
_updateList.erase(it);
@@ -126,11 +131,11 @@ void MiddlewareManager::render(float dt) {
126131
}
127132

128133
void MiddlewareManager::addTimer(IMiddleware *editor) {
129-
_operateCacheMap[editor] = true;
134+
_operateCacheQueue.emplace_back(editor, true);
130135
}
131136

132137
void MiddlewareManager::removeTimer(IMiddleware *editor) {
133-
_operateCacheMap[editor] = false;
138+
_operateCacheQueue.emplace_back(editor, false);
134139
}
135140

136141
se_object_ptr MiddlewareManager::getVBTypedArray(int format, int bufferPos) {

native/cocos/editor-support/MiddlewareManager.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,8 @@ class MiddlewareManager {
112112
void updateOperateCache();
113113

114114
ccstd::vector<IMiddleware *> _updateList;
115-
ccstd::unordered_map<IMiddleware *, bool> _operateCacheMap;
115+
// bool true means add, false means delete
116+
ccstd::vector<std::pair<IMiddleware *, bool>> _operateCacheQueue;
116117
ccstd::unordered_map<int, MeshBuffer *> _mbMap;
117118

118119
SharedBufferManager _renderInfo;

0 commit comments

Comments
 (0)