public static bool NotEqual(ref DrawTextures left, ref DrawTextures right) { return(left.Texture0 != right.Texture0); }
private void FlushBatch() { ElementInfo[] spriteQueueForBatch; // If Deferred, then sprites are displayed in the same order they arrived if (SortMode == SpriteSortMode.Deferred) { spriteQueueForBatch = drawsQueue; } else { // Else Sort all sprites according to their sprite order mode. SortSprites(); spriteQueueForBatch = sortedDraws; } // Iterate on all sprites and group batch per texture. int offset = 0; var previousTexture = new DrawTextures(); for (int i = 0; i < drawsQueueCount; i++) { DrawTextures texture; if (SortMode == SpriteSortMode.Deferred) { texture = drawTextures[i]; } else { // Copy ordered sprites to the queue to batch int index = sortIndices[i]; spriteQueueForBatch[i] = drawsQueue[index]; // Get the texture indirectly texture = drawTextures[index]; } if (DrawTextures.NotEqual(ref texture, ref previousTexture)) { if (i > offset) { DrawBatchPerTexture(previousTexture.Texture0, previousTexture.Texture1, spriteQueueForBatch, offset, i - offset); } offset = i; previousTexture = texture; } } // Draw the last batch DrawBatchPerTexture(previousTexture.Texture0, previousTexture.Texture1, spriteQueueForBatch, offset, drawsQueueCount - offset); // Reset the queue. Array.Clear(drawTextures, 0, drawsQueueCount); drawsQueueCount = 0; // When sorting is disabled, we persist mSortedSprites data from one batch to the next, to avoid // unnecessary work in GrowSortedSprites. But we never reuse these when sorting, because re-sorting // previously sorted items gives unstable ordering if some sprites have identical sort keys. if (SortMode != SpriteSortMode.Deferred) { Array.Clear(sortedDraws, 0, sortedDraws.Length); } }