【发布时间】:2012-09-12 15:47:03
【问题描述】:
我有一个实现 ICollidable 接口的实体列表。该接口用于解决实体之间的冲突。因此,我的实体是:
- 玩家
- 敌人
- 投射物
- 项目
- 瓷砖
在每次游戏更新(大约 60 t/s)时,我都会清除列表并根据游戏状态添加当前实体。我通过以下方式完成此操作:
collidableEntities.Clear();
collidableEntities.AddRange(players);
collidableEntities.AddRange(enemies);
collidableEntities.AddRange(projectiles);
collidableEntities.AddRange(items);
collidableEntities.AddRange(camera.VisibleTiles);
在我将可见图块添加到列表之前,一切正常。运行游戏循环的前约 1-2 秒会导致可见的打嗝延迟绘制(因此我可以看到渲染中的抖动)。我可以从字面上删除/添加添加图块的行并查看抖动是否发生,因此我将其缩小到该行。
我的问题是,为什么? VisibleTiles 的列表大约有 450-500 个图块,所以实际上并没有那么多数据。每个图块包含一个 Texture2D(图像)和一个 Vector2(位置),以确定渲染的内容和位置。我会继续寻找,但从头顶看,我无法理解为什么只有前 1-2 秒打嗝,但从那里开始就很顺畅了。
感谢任何建议。
更新
我尝试将初始容量增加到大约元素数量,但没有观察到差异。
更新
根据要求,这里是 camera.VisibleTiles 的代码
public List<Tile>
{
get { return this.visibleTiles; }
}
【问题讨论】:
-
您可以访问
camera.VisibleTiles的代码吗?它可能不仅仅是为您提供对象引用吗? -
是的,它只是一个返回对 List
的引用的属性。 -
按照@Brian 的建议,尝试用调用camera.VisibleTiles 但不将其添加到列表中的代码替换该行。这将确定是
AddRange调用还是VisibleTiles调用慢。 -
你能把这段代码粘贴进去吗?
VisibleTiles属性的代码? -
获取代码分析工具