好吧,当我问到“纯色”时,我的意思是-“在您从中复制的 .png 中的 8x8 像素区域中,所有 64 像素是否具有相同的 RGB 值?” 它在您的图表中看起来是这样的,那么这个怎么样:
如何创建一个, 并使用从原始 .png 读取的值直接绘制其成员SDL_Surface
指向的内存的 8x8 像素区域。pixels
SDL_Surface
然后当你完成后,将该表面转换为一个SDL_Texture
并渲染它?
你会避免所有的SDL_UpdateTexture()
电话。
无论如何,这里有一些示例代码。假设您创建了一个名为EightByEight
.
class EightByEight
{
public:
EightByEight( SDL_Surface * pDest, Uint8 r, Uint8 g, Uint8 b):
m_pSurface(pDest),
m_red(r),
m_green(g),
m_blue(b){}
void BlitToSurface( int column, int row );
private:
SDL_Surface * m_pSurface;
Uint8 m_red;
Uint8 m_green;
Uint8 m_blue;
};
EightByEight
您可以通过传递一个指向 an 的指针SDL_Surface
以及红色、绿色和蓝色的一些值来构造一个类型的对象。此 RGB 对应于从您当前正在读取的 .png 的特定 8x8 像素区域获取的 RGB 值。SDL_Surface
您将使用此 RGB 值绘制像素的特定 8x8 像素区域。
因此,现在当您想要绘制 的区域时SDL_Surface
,您可以使用该函数BlitToSurface()
并传入列和行值。例如,如果您将其划分SDL_Surface
为 8x8 像素的正方形,BlitToSurface(3,5) 表示使用我在构造时设置的 RGB 值在第 4 列和第 5 行绘制正方形。
BlitToSurface()
看起来像这样:
void EightByEight::BlitToSurface(int column, int row)
{
Uint32 * pixel = (Uint32*)m_pSurface->pixels+(row*(m_pSurface->pitch/4))+column;
// now pixel is pointing to the first pixel in the correct 8x8 pixel square
// of the Surface's pixel memory. Now you need to paint a 8 rows of 8 pixels,
// but be careful - you need to add m_pSurface->pitch - 8 each time
for(int y = 0; y < 8; y++)
{
// paint a row
for(int i = 0; i < 8; i++)
{
*pixel++ = SDL_MapRGB(m_pSurface->format, m_red, m_green, m_blue);
}
// advance pixel pointer by pitch-8, to get the next "row".
pixel += (m_pSurface->pitch - 8);
}
}
我相信您可以通过预先计算构建时的 RGB 值来进一步加快速度。或者,如果您正在从纹理中读取像素,您可能会省去 SDL_MapRGB()(但它只是在 Surface 与 .png 具有不同像素格式的情况下存在)。
memcpy
可能比对 RGB 值的 8 个单独分配要快 - 但我只想演示该技术。你可以做实验。
因此,EightByEight
您创建的所有对象都指向同一个SDL_Surface
.
然后,当你完成后,你只需将其转换SDL_Surface
为 anSDL_Texture
并 blit 即可。