c#jagged array bug(元素并不总是设置)

时间:2012-08-16 21:58:32

标签: c# multithreading nullpointerexception jagged-arrays

我正在使用锯齿状数组来保存我正在制作的游戏中的地图片段(Clusters)。数组中的位置对应于Cluster在地图中的位置。此外,如果内部数组(锯齿状部分)不再加载任何Clusters(在未使用的超时后从数组中删除集群),则将外部数组的元素设置回null以保持映射的内存使用量下来。

当游戏试图从地图中获取群集时,问题似乎随机出现:

public Cluster getCluster(int xIndex, int yIndex)
{
    lock (xAxis)
    {
        loadCluster(xIndex, yIndex);
        return xAxis[xIndex][yIndex];
    }
}

public void loadCluster(int xIndex, int yIndex)
{
    lock (xAxis)
    {
        if (xAxis[xIndex] == null)
            xAxis[xIndex] = new Cluster[(int)worldSize.Y];
        if (xAxis[xIndex][yIndex] == null)
            xAxis[xIndex][yIndex] = new Cluster(this, new Vector2(xIndex * 256, yIndex * 256), worldLoader.loadClusterData(xIndex, yIndex));
    }
}

loadCluster(int, int)方法应该确保在getCluster(int, int)方法检索它之前将数据集加载到数组中,并且几乎所有时间都将其加载到数组中,但偶尔loadCluster(int, int)无法添加集群

似乎没有任何特定的集群发生,但总是在没有添加内部数组时发生(但是,大多数情况下它创建内部数组完全没有问题)。 此外,当Visual Studio捕获随后的空指针异常时,退回并重新调用loadCluster(int, int)总是(至少到目前为止)正常工作。在loadCluster(int, int)方法中向getCluster(int, int)添加额外调用也会大大降低此错误的发生频率。

老实说,我不知道是什么导致这个相当简单的功能无法正常工作,甚至看似随意。任何帮助将不胜感激

编辑:编辑xAxis [] []

的其他代码
public override void Update(GameTime gameTime)
{
    for (int x = 0; x < worldSize.X; x++)
    {
        if (xAxis[x] == null) continue;
        int loaded = 0;
        for (int y = 0; y < worldSize.Y; y++)
        {
            if (xAxis[x][y] == null)
            {
                continue;
            }
            xAxis[x][y].Update(gameTime);

            if (xAxis[x][y].clusterLoaded)
            {
                loaded++;
            }
            else if (xAxis[x][y].clusterTimer == 0)
            {
                xAxis[x][y] = null;
            }
        }

        if(loaded == 0) xAxis[x] = null;
    }
}

Cluster.clusterLoaded是一个bool,显示当前是否正在使用群集。 Cluster.clusterTimer是一个int,一旦clusterLoaded变为false,它就会倒计时。如果clusterLoaded再次变为真,则重置为最大值。每次运行Cluster.Update(GameTime)时,它会减1,而clusterLoaded为false。 loaded用于计算当前内部数组中加载的Clusters数量。

1 个答案:

答案 0 :(得分:3)

首先要改变的是修改loadCluster方法以从中返回xAxis [xIndex] [yIndex]值。然后就不需要锁定getCluster方法了。 那么代码的其他部分呢 - 从描述看起来似乎是一个多线程的问题。虽然您已经锁定了xAxis变量,但我不知道您还在其他地方做了什么。 还有一点 - 语言中的数组实际上是一个核心功能,因此在那里发现一个错误真是意料之外(我的意思是微软)。