Minecraft洪水填充

时间:2013-05-18 17:03:50

标签: c minecraft flood-fill

我正在尝试计算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);
}

1 个答案:

答案 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);
}