这两种“传统”的做法实际上非常有效:
- 绘制所有内容可让您使用块传输(即您的数据作为大块传输,例如每像素行一次传输),这非常快。
- 您提到的第二种方法通常以模板和/或深度缓冲区的形式在硬件中实现。这也使事情变得相当快。
无论如何:为了提高效率,如果你想避免过度绘制,你通常会从前到后绘制图层/精灵,并使用第二个缓冲区和一些智能逻辑运算符来确定要绘制的颜色。
例如:
// This buffer contains a byte for each pixel. Either the byte is 0x00 for a free pixel
// or 0xFF for a colored pixel.
byte* overDrawBuffer;
// The colorbuffer is our rendertarget
byte* colorBuffer;
// The spritesource is where the pixeldata of our sprite resides
byte* spriteSource
for (int i = 0; i < numPixels; i++)
{
// will choose either the existing color or the new color depending on
// the value of the overDrawBuffer.
byte theColor = (*colorBuffer & *overDrawBuffer) | (*spriteSource & !*overDrawBuffer);
*colorBuffer = theColor;
// Mark the pixel
*overDrawBuffer = 0xFF;
//Move to the next pixel
*overdrawBuffer++;
*colorBuffer++;
*spriteSource++;
}
注意:这段代码肯定不能正常工作——它只是为了说明这个想法。像这样的代码,没有分支和很少的操作应该产生非常快的机器代码。