2

我正在使用锯齿状数组来保存我正在制作的游戏中的地图段(集群)。数组中的位置对应于集群在地图中的位置。此外,如果内部数组(锯齿状部分)不再加载任何集群(集群在未使用的超时后从数组中删除),则外部数组的元素设置回 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)以某种方式无法添加集群。

它似乎不会发生在任何特定的集群中,但总是在未添加内部数组时发生(但是,大多数情况下它创建的内部数组完全没有问题)。loadCluster(int, int)此外,当 Visual Studio 捕获随后的空指针异常时,退后一步并始终(至少到目前为止)重新调用正常工作。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是一个布尔值,显示集群当前是否正在使用。 Cluster.clusterTimer是一个倒计时的 int,一旦clusterLoaded变为 false。如果clusterLoaded再次变为真,则将其重置为最大值。每次Cluster.Update(GameTime)运行时减1,而clusterLoaded为假。 loaded用于统计当前内部数组加载了多少个Cluster。

4

1 回答 1

3

此处要更改的第一件事是修改 loadCluster 方法以直接从中返回 xAxis[xIndex][yIndex] 值。这样就不需要锁定 getCluster 方法。代码的其他部分呢?从描述来看,这似乎是一个多线程问题。尽管您已锁定 xAxis 变量,但我不知道您在其他地方还做了什么。还有一点——语言中的数组确实是一项核心功能,所以那里有一个错误真的是出乎意料的(我的意思是微软)。

于 2012-08-16T22:13:35.120 回答