首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我的世界大水漫灌

我的世界大水漫灌
EN

Stack Overflow用户
提问于 2013-05-19 01:03:50
回答 1查看 475关注 0票数 1

我正在尝试计算“我的世界”的光度值,但我使用的算法非常慢。

计算照明阵列的更好方法是什么?

代码如下所示:

代码语言:javascript
运行
复制
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);
}
EN

回答 1

Stack Overflow用户

发布于 2013-05-19 02:19:17

当我在调用递归之前移动检查时,堆栈推送的次数就会减少。这将运行时间从250ms减少到23us。

改进的代码:

代码语言:javascript
运行
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16626846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档