有效的方法(不)在其他像素下绘制像素?

时间:2013-04-17 11:04:25

标签: c++ drawing pixel

当向屏幕绘制多个精灵时(特别是当这些精灵具有不同的深度(即,在其他精灵之上或之下)时,可能会出现最终在其他像素上绘制许多像素的问题。

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

我只能想到两种传统方式:

1)只需绘制所有内容,从下到上并忽略问题(效率不高)

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

有任何想法或意见吗?

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

2 个答案:

答案 0 :(得分:1)

这两种“传统”方式实际上非常有效:

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

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

e.g:

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

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

答案 1 :(得分:0)

考虑到可能重叠的精灵的坐标和位置,您应该计算每个精灵的哪些部分可见。那些是你应该画的。

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

您可能需要:

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

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

  • 使用quadtrees更有效地检测重叠精灵