创建网格 - 有什么高效的方法可以做到这一点

4
我最近在观看了新的《创:战纪》电影后制作一款基于文本的小游戏。(当你手头有太多时间,你就会这样做,因为你是个极客)。
我创建了一个网格,在其中可以放置物体,但目前发现网格的创建需要很长时间。
我对如何实现这个网格以及实用于这种类型的任何设计模式、想法、概念等感兴趣。
目前,我有四个主要的“部分”组成网格。
首先,我有网格本身,它包含一个“行”的数组。
public interface IGrid
{
    GridRow[] Rows { get; set; }
}

GridRow 持有 GridCell 数组,每个 GridCell 包含一个 IEntity 数组(每个可以放置在网格单元格中的对象都必须实现 IEntity 接口)。

public class GridRow
{
    public int Index { get; set; }
    public GridCell[] Cells { get; set; }
}

public class GridCell
{
    public int Index { get; set; }
    public IEntity[] Entities { get; set; }
}

在创建网格方面需要花费相当长的时间。目前一个200*200的“网格”需要约17秒来组成。

我非常确定必须有一种更高效的方式来存储这些数据或使用当前的概念来创建网格。

欢迎任何建议。

更新

以下是我目前组成网格的方法:

public IGrid Create(int rows, int cols, int concurentEntitiesPerCell)
        {
            var grid = new Grid();
            Rows = new GridRow[rows];

            grid.Rows = Rows;

            var masterCells = new GridCell[cols];

            var masterRow = new GridRow();
            var masterCell = new GridCell();

            for (var i = 0; i < masterCells.Count(); i++)
            {
                masterCells[i] = new GridCell();
                masterCells[i].Index = i;
                masterCells[i].Entities = new IEntity[concurentEntitiesPerCell];
            }

            masterRow.Cells = masterCells;

            for (var j = 0; j < rows; j++)
            {
                grid.Rows[j] = new GridRow();
            }
            return grid;
        }

我没有看到任何会导致如此长的加载时间的原因,除非对象非常大或者有一些东西在创建它们时出现了问题。您可以进行简单的分析来确定这一点。 - AbstractDissonance
1个回答

3

看起来你正在毫无理由地创建很多对象?为什么不使用一个 List<List<IEntity>> 或者一个多维数组 Entities[,] 呢?

无论如何,你展示的代码并没有表明减慢速度的原因。你能否发布你实际分配对象的代码?


感谢@AbstractDissonance。我已经更新了我的问题,包括创建代码。 - Jamie Dixon
嘿,既然你将经常处理性能问题,为什么不熟悉一下性能分析呢?在这里,你可以准确地找到某些操作所花费的时间,并找出原因(通常如此)。尝试使用一下,你会发现它非常易用。 - AbstractDissonance
谢谢你的帮助,伙计。经过考虑你的回复后,我现在意识到我真正需要的是一个不规则实体数组(Entities[,][])。这完美地实现了我的需求,并且对于一个1000*1000的网格只需要大约1秒钟。 - Jamie Dixon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接