示例#1
0
 public static bool NotEqual(ref DrawTextures left, ref DrawTextures right)
 {
     return(left.Texture0 != right.Texture0);
 }
示例#2
0
        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);
            }
        }