Skip to content

Commit f723b75

Browse files
Merge pull request #324 from Cocos2DXNA/SPRITE_BATCH_QSORT
changed sort to use qsort per advice from Ricardo.
2 parents f437b69 + 6b51a44 commit f723b75

File tree

1 file changed

+54
-2
lines changed

1 file changed

+54
-2
lines changed

cocos2d/sprite_nodes/CCSpriteBatchNode.cs

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,16 +214,67 @@ public override void RemoveAllChildrenWithCleanup(bool cleanup)
214214
m_pobTextureAtlas.RemoveAllQuads();
215215
}
216216

217+
// Quick sort taken from http://snipd.net/quicksort-in-c
218+
public static void Quicksort(CCNode[] elements, int left, int right)
219+
{
220+
int i = left, j = right;
221+
CCNode pivot = elements[(left + right) / 2];
222+
223+
while (i <= j)
224+
{
225+
/*
226+
(pivot.m_nZOrder < elements[i].m_nZOrder ||
227+
(pivot.m_nZOrder == elements[i].m_nZOrder && pivot.m_uOrderOfArrival < elements[i].m_uOrderOfArrival)))
228+
*/
229+
while ((elements[i].m_nZOrder < pivot.m_nZOrder ||
230+
(pivot.m_nZOrder == elements[i].m_nZOrder && elements[i].m_uOrderOfArrival < pivot.m_uOrderOfArrival)))
231+
{
232+
i++;
233+
}
234+
235+
while ((elements[j].m_nZOrder > pivot.m_nZOrder ||
236+
(pivot.m_nZOrder == elements[j].m_nZOrder && elements[j].m_uOrderOfArrival > pivot.m_uOrderOfArrival)))
237+
{
238+
j--;
239+
}
240+
241+
if (i <= j)
242+
{
243+
// Swap
244+
CCNode tmp = elements[i];
245+
elements[i] = elements[j];
246+
elements[j] = tmp;
247+
248+
i++;
249+
j--;
250+
}
251+
}
252+
253+
// Recursive calls
254+
if (left < j)
255+
{
256+
Quicksort(elements, left, j);
257+
}
258+
259+
if (i < right)
260+
{
261+
Quicksort(elements, i, right);
262+
}
263+
}
264+
217265
//override sortAllChildren
218266
public override void SortAllChildren()
219267
{
220268
if (m_bReorderChildDirty)
221269
{
222270
int j = 0, count = m_pChildren.count;
223271
CCNode[] elements = m_pChildren.Elements;
224-
CCNode tempItem;
272+
// CCNode tempItem;
273+
274+
//insertion sort - change to qsort per RIQ
275+
Quicksort(elements, 0, count - 1);
225276

226-
//insertion sort
277+
/*
227278
for (int i = 1; i < count; i++)
228279
{
229280
tempItem = elements[i];
@@ -240,6 +291,7 @@ public override void SortAllChildren()
240291
241292
elements[j + 1] = tempItem;
242293
}
294+
*/
243295

244296
//sorted now check all children
245297
if (count > 0)

0 commit comments

Comments
 (0)