gpt4 book ai didi

c++ - 创建棋盘图案的高效方法

转载 作者:行者123 更新时间:2023-11-28 03:12:19 24 4
gpt4 key购买 nike

所以我有一个图像,我想用棋盘图案叠加。这是我到目前为止想出的:

for ( uint_8 nRow = 0; nRow < image.width(); ++nRow)
for (uint_8 nCol = 0; nCol < image.height(); ++nCol)
if(((nRow/20 + nCol/20) % 2) == 0)
memset(&image.data[nCol + nRow], 0, 1);

不幸的是产生了一个白色的图像。我不认为这是非常有效的,因为 memset 是为图像中的每个像素而不是多个像素调用的。为什么这段代码不产生棋盘格图案?你会如何改进它?

最佳答案

为了获得更好的性能,请不要将图像视为二维实体。相反,将其视为连续数据的一维数组,其中图像的所有行都一个接一个地排列。

使用这种方法,您可以通过一个循环一次性编写模式,在每次迭代中,您 memset() 多个相邻像素并将索引增加您设置的像素数量的两倍:

int data_size = image.width() * image.height();
for (auto it = image.data; it < image.data + data_size; it += 20) {
memset(it, 0, 20);
if (((it - data) + 40) % (20 * 400) == 0) {
it += 40;
} else if (((it - data) + 20) % (20 * 400) != 0) {
it += 20;
}
}

(如果您不使用 C++11,请将 auto 替换为 image.data 的类型;我怀疑它是 unsigned char*.)

这对于 CPU 缓存预取是相当友好的。它对编译器也很友好,它可以潜在地向量化和/或执行循环展开。

关于c++ - 创建棋盘图案的高效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18102690/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com