【问题标题】:Efficient way to (not) draw pixels underneath of other pixels?(不)在其他像素下方绘制像素的有效方法?
【发布时间】:2013-04-17 11:04:24
【问题描述】:

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

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

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

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

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

有什么想法或方法吗?

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

【问题讨论】:

标签: c++ drawing pixel


【解决方案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++;
}

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

【讨论】:

    【解决方案2】:

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

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

    您可能需要:

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

    • 使用遮罩来区分精灵的哪些像素是透明的,哪些不透明

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-02
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多