当数组内容发生变化时,如何运行代码?

时间:2016-12-20 14:16:23

标签: c# multidimensional-array

基本上,我正在创建一个基于体素的游戏。我有一个对象Chunk,其中包含对象Voxel的三维数组。在Voxels数组中,Voxel目前有一个isAir bool,表示没有体素在那里。

我正在尝试向Chunk添加一个属性,该属性返回一个位于块表面的Voxel的二维数组。目前,此数组在Y值较低时始终为Voxel.isAir == false,在较高Y值中始终为Voxel.isAir == true,在数组的“Y”轴上从未有明确的运行,这些都是“空气” “s或全部Voxel,并且数组中的Voxel下面永远不会有”空气“。

要仅获取“Surface”Voxel,我已将此代码添加到Chunk

public Voxel[,,] Voxels { get; set; }

private Voxel[,] _surfaceVoxels = null;
public Voxel[,] SurfaceVoxels
{
    get
    {
        if (_surfaceVoxels == null)
        {
            _surfaceVoxels = new Voxel[this.Voxels.GetLength(0), this.Voxels.GetLength(2)];
            for (var x = 0; x < this.Voxels.GetLength(0); x++)
            {
                for (var z = 0; z < this.Voxels.GetLength(2); z++)
                {
                    for (var y = 0; y < this.Voxels.GetLength(1); y++)
                    {
                        Voxel v = this.Voxels[x, y, z];

                        var solidAbove = false;
                        var solidBelow = false;
                        if (y - 1 >= 0)
                        {
                            Voxel vBelow = this.Voxels[x, y - 1, z];
                            solidBelow = !vBelow.isAir;
                        }
                        if (y + 1 < this.Voxels.GetLength(1))
                        {
                            Voxel vAbove = this.Voxels[x, y + 1, z];
                            solidAbove = !vAbove.isAir;
                        }
                        if (!v.isAir && !solidAbove && solidBelow)
                        {
                            _surfaceVoxels[x, z] = v;
                        }
                    }
                }

            }

        }
        return _surfaceVoxels;
    }
}

以这种方式计算表面体素在计算上是昂贵的,我无法看到更快的方法。因此我有效地“缓存”表面阵列,这一点很好,直到底层三维阵列发生变化,因为表面体素显然需要重新计算。

get的{​​{1}}上是否有某种方式它只返回数组的克隆而不是数组本身,并在public Voxel[,,]上设置整个数组并设置{{ 1}}到set,或者更好的是,当数组中的值发生变化时,有一些廉价的方法来执行代码吗?

有没有更有效的方法来完成我在这里解释的我忽略的内容?

0 个答案:

没有答案