c - 图形缓冲区 - 水平和垂直填充,性能
问题描述
我想知道是否有可能解决某个问题。简而言之:通过逐行和逐列填充缓冲区来获得最佳性能。
下面的描述:给出了一个图形缓冲区(即用于保存位图)
#define WIDTH 320
#define HEIGHT 256
typedef struct
{
unsigned char r,g,b,a;
}sRGBA;
sRGBA* bufor_1;
main()
{
bufor_1 = (sRGBA*)malloc(WIDTH*HEIGHT*sizeof(sRGBA));
}
逐行水平填充没有问题,因为它是“缓存友好”的情况,这是最好的情况,例如地板和天花板 rycasting:
main()
{
bufor_1 = (sRGB*)malloc(WIDTH*HEIGHT*sizeof(sRGB));
for (int y = 0; y < HEIGHT; ++y)
{
for (int x = 0; x < WIDTH; ++x)
{
bufor_1[x+y*WIDTH].r = 100;
}
}
}
当我们要垂直补充这样一个缓冲区时,性能上的差异就会出现,即逐列,例如壁再生,就是这样完成的,即
main()
{
bufor_1 = (sRGB*)malloc(WIDTH*HEIGHT*sizeof(sRGB));
for (int x = 0; x < WIDTH; ++x)
{
for (int y = 0; y < HEIGHT; ++y)
{
bufor_1[x+y*WIDTH].r = 100;
}
}
}
出现的问题是是否有可能以某种方式结合有效的逐行和逐列完成。从我执行的一些测试中,事实证明,如果缓冲区呈现为二维,即逐列填充甚至比一维中的逐行填充更快 - 但它是反过来,即逐行填充这样的二维缓冲区将是低效的。
我正在考虑的解决方案:
- 将缓冲区旋转 90 度,不幸的是这需要太多时间,至少使用我检查过的算法,除非有一些超快的 N (1) 方式
- 某种缓冲区重新映射,以便某些表包含指向列中下一个像素的指针,但它可能不会“缓存友好”或更糟 - 我还没有检查过