我正在尝试计算Minecraft的光值,但我使用的算法非常慢。
计算灯光阵列的更好方法是什么?
代码如下所示:
struct chunk_data {
char light[16*16*256];
};
int j;
void fill(chunk_data* c, int i, int l) {
++j;
if(c->light[i] > l)
return;
c->light[i] = l;
if(!--l)
return;
if((i&0x0F) != 0x0F)
fill(c, i + 0x01, l);
if((i&0x0F) != 0x00)
fill(c, i - 0x01, l);
if((i&0xF0) != 0xF0)
fill(c, i + 0x10, l);
if((i&0xF0) != 0x00)
fill(c, i - 0x10, l);
if((i&0xFF00) != 0x0000)
fill(c, i - 0x0100, l);
if((i&0xFF00) != 0xFF00)
fill(c, i + 0x0100, l);
}
答案 0 :(得分:0)
当我在调用递归之前移动检查时,则减少了堆栈推送次数。 这将运行时间从250毫秒减少到23秒。
改进代码:
void fill(chunk_data* c, int i, int l) {
c->light[i] = l;
if(!--l)
return;
if((i&0x0F) != 0x0F && c->light[i + 0x01] < l)
fill(c, i + 0x01, l);
if((i&0x0F) != 0x00 && c->light[i - 0x01] < l)
fill(c, i - 0x01, l);
if((i&0xF0) != 0xF0 && c->light[i + 0x10] < l)
fill(c, i + 0x10, l);
if((i&0xF0) != 0x00 && c->light[i - 0x10] < l)
fill(c, i - 0x10, l);
if((i&0xFF00) != 0x0000 && c->light[i - 0x0100] < l)
fill(c, i - 0x0100, l);
if((i&0xFF00) != 0xFF00 && c->light[i + 0x0100] < l)
fill(c, i + 0x0100, l);
}