0

当在屏幕上绘制多个精灵时(尤其是当这些精灵具有不同的深度(即高于或低于其他精灵)时,您可能最终会在其他像素之上绘制许多像素。

这是低效的,因为如果来自另一个精灵的另一个像素只是在该像素之上绘制,则没有必要设置像素。当有更多的精灵和更大的精灵时,效率低下的问题只会变得更糟。

我只能想到两种传统的方法:

1)只画一切,自下而上并忽略问题(效率不高)

2) 检查是否还没有绘制更高级别的像素,然后绘制。(也效率不高,因为您必须检查每一层中的每个像素)

有什么想法或意见吗?

PS:这个问题一般是关于绘制像素的。

4

2 回答 2

1

这两种“传统”的做法实际上非常有效:

  • 绘制所有内容可让您使用块传输(即您的数据作为大块传输,例如每像素行一次传输),这非常快。
  • 您提到的第二种方法通常以模板和/或深度缓冲区的形式在硬件中实现。这也使事情变得相当快。

无论如何:为了提高效率,如果你想避免过度绘制,你通常会从前到后绘制图层/精灵,并使用第二个缓冲区和一些智能逻辑运算符来确定要绘制的颜色。

例如:

// 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++;
}

注意:这段代码肯定不能正常工作——它只是为了说明这个想法。像这样的代码,没有分支和很少的操作应该产生非常快的机器代码。

于 2013-04-17T12:10:50.613 回答
0

给定可能重叠的精灵的坐标和位置,您应该计算它们中的哪些部分将是可见的。这些是你应该画的。

如果您的精灵是非矩形或透明的,这会增加复杂性,但想法保持不变。

您可能需要:

  • 向下到扫描线级别(水平 1 像素厚的跨度构成整个精灵)而不是矩形级别

  • 使用遮罩告诉精灵的哪些像素是透明的,哪些不是

  • 使用四叉树更有效地检测重叠精灵

于 2013-04-17T12:15:20.967 回答