当向屏幕绘制多个精灵时(特别是当这些精灵具有不同的深度(即,在其他精灵之上或之下)时,可能会出现最终在其他像素上绘制许多像素的问题。
这是低效的,因为如果来自另一个精灵的另一个像素只是在那个像素的顶部绘制,则没有必要设置像素。当有更多的精灵和更大的精灵时,效率低下的问题只会变得更糟。
我只能想到两种传统方式:
1)只需绘制所有内容,从下到上并忽略问题(效率不高)
2)检查是否还没有绘制更高级别的像素,然后绘制。 (也没有效率,因为你必须检查每个图层中每个像素的)
有任何想法或意见吗?
PS:这个问题一般是关于绘制像素。
答案 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更有效地检测重叠精灵