我正在使用锯齿状数组来保存我正在制作的游戏中的地图片段(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数量。
答案 0 :(得分:3)
首先要改变的是修改loadCluster方法以从中返回xAxis [xIndex] [yIndex]值。然后就不需要锁定getCluster方法了。 那么代码的其他部分呢 - 从描述看起来似乎是一个多线程的问题。虽然您已经锁定了xAxis变量,但我不知道您还在其他地方做了什么。 还有一点 - 语言中的数组实际上是一个核心功能,因此在那里发现一个错误真是意料之外(我的意思是微软)。