尝试有效地挖空我的世界中的球体(织物改装,1.16.5)

Trying to efficiently hollow out a sphere in minecraft (fabric modding, 1.16.5)

我正在尝试挖空一个球体,我已经做到了,但是它非常慢(半径为 5 的球体需要几秒钟,半径为 100 的球体需要几分钟)

这是我的代码:

BlockPos pos = player.getBlockPos();
int startX = pos.getX();
int startY = pos.getY();
int startZ = pos.getZ();

int squaredRadius = radius * radius;

int x1;
int y1;
int z1;
int flags = 2 | 8 | 16 | 32;
BlockPos.Mutable blockPos = new BlockPos.Mutable(0, 0, 0);
BlockState state = Blocks.AIR.getDefaultState();

for (int x = startX - radius; x < startX + radius; x++) {
    for (int y = Math.max(0, startY - radius), maxY2 = Math.min(255, startY + radius); y < maxY2; y++) {
        for (int z = startZ - radius; z < startZ + radius; z++) {
            x1 = x - startX;
            y1 = y - startY;
            z1 = z - startZ;
            if (x1 * x1 + y1 * y1 + z1 * z1 <= squaredRadius)
                world.setBlockState(blockPos.set(x, y, z), state, flags);
        }
    }
}

我怎样才能加快速度? (或者它已经尽可能快了?)

编辑:对于 100 半径,在我的机器上大约需要 8 分钟

更新:我设法修复了它!我所做的是将 mixin 混入 World#setBlockState(BlockPos, BlockState, int) 并检查标志是否是我设置的某个数字(在我的例子中是 999),如果它是我在设置块状态后立即取消方法执行的地方,节省了大量资金放置大量积木的时间。但是,它没有将块发送给玩家,所以您只需将更改的所有块发送给玩家,我通过存储我更改的所有块来做到这一点,并为世界上的每个玩家发送一个 ChunkDataS2CPacket有了播放器的新块,它完全解决了我的问题,它就像一个魅力 :D

编辑:它也不会阻止 updates/lighting 更新