【问题标题】:Choosing the best stucture for my list of players为我的玩家列表选择最佳结构
【发布时间】:2013-05-17 11:37:14
【问题描述】:

我在为我的数据选择最相关的结构时遇到了麻烦,以下是解释:

我实际上正在为学校开发一个游戏项目,一个类似炸弹人的 C++ 游戏。 我正在设计包含炸弹、盒子、玩家和墙壁的地图对象。 地图是二维的,我已经有 2 个容器类型:

std::unordered_map<int, std::unordered_map<int, AEntity*> > *UMap;

一个包含墙壁,另一个包含可破坏的物体(炸弹、盒子)。 我已经在这里讨论过这个选择 -> Choice of unsorted_map。 这主要是为了快速访问时间,因为每个地图的盒子只能有一个元素。

现在正如标题所暗示的那样,我在为我的玩家选择数据容器时遇到了麻烦,因为一个地图的盒子上可以有多个玩家,unordered_maps 不能使用。

在第一次我打算使用std::list&lt;AEntity*&gt; 排序与std::sortedAEntity 包含实体信息(坐标),但在编码我的

playerOn(const int x, const int y);

function 我发现这是一个糟糕的选择。我无法使用二分法足够快地检索给定盒子上的玩家,如果这个盒子没有玩家,那就浪费时间了。

我应该如何存储我的 (AEntity)Players 以便能够快速检索它们

(最让人头疼的是,在大地图上,一次可以有超过 500 名玩家,这就是我在寻找优化的原因)

我的脑汁快用完了。感谢您未来的回答。

修改我的问题

这主要是因为我想知道是否有另一种解决方案可以通过我的整个 std::list 来查找 box(x, y) 上是否有人。看起来很慢而且没有优化,但我想不出另一种方法来做到这一点。 (如果需要,我可以更改容器类型)

【问题讨论】:

  • 1) 在实现 25 年以上的游戏时,您无需担心性能问题。 2) std::unordered_map&lt;int, std::unordered_map&lt;int, AEntity*&gt; &gt; *UMap; 用于存放盒子和墙壁听起来很傻。
  • 嗯,这是一个年终项目,所以我们会尽力而为,这也将使用我们学校 5 年前编写的 tardLib 以 3D 形式呈现......
  • 那么,你的坐标范围是多少?对象是否对齐网格?
  • @Pubby 是的,地图大小将在初始化时定义,但是“捕捉”是什么意思? (不是英语母语对不起)
  • 看起来像this

标签: c++ algorithm c++11 containers std


【解决方案1】:

首先,before trying any optimization,您应该分析您的代码以检测瓶颈在哪里。你会感到惊讶。曾经说过:

1) 您的 unordered_maps 似乎有很多过度设计。 your previous post 中提供的答案是正确的,但我认为在您的情况下它是无用的。当 n = 500 时,您绝对不关心 O(log(n)) 成本。只需制作一个 Entities* 的向量。够了。

2) 你似乎陷入了god object 反设计模式。炸弹人游戏是学习 OOP 的绝佳项目,因为它教您避免上帝对象设计模式。确保每个类都有自己的业务,并且没有类处理所有逻辑(我怀疑你的类 Map 或 Game 有太多的权力)。

a) 创建玩家向量、炸弹向量、墙壁向量、火向量等。

b) Map 应该是一个二维数组,存储指向每个 Map 框上存在的实体的指针列表。 (每个Map[i][j] 都包含指向索引 (i,j) 框上所有元素的指针)。

c) 炸弹应该会产生火元素。

d) 你的中心程序应该是这样的:

while(gameContinued)  
{  
    for each entity in the game  
    {  
        entity.Update(map);  
    }  
    game.Render();  
}     

炸弹更新包括使炸弹的纹理渲染动态并在延迟过期时创建火(并相应地使用火指针更新地图)。 如果延迟过期(并更新地图),火灾更新除了消失之外什么都没有。 玩家更新包括移动键盘事件处理(并更新他们当前的内部 x 和 y 值),如果需要创建炸弹,如果他们的位置(x,y)死亡,Map[i][j] 实体列表中存在火灾。

3) 在我的大多数学生实施炸弹人时,他们唯一能遇到的问题是纹理和对象的深层副本。确保你有一个纹理加载器(使用单例模式)以避免多次加载相同的纹理,你应该没问题。

【讨论】:

  • 感谢您提供完整的答案,我认为您对很多事情都是正确的!我要和我的团队谈谈。感谢您的回答。
  • 只是为您提供更多信息,因为您的方法看起来很酷,但我们正在使用过时的学校库以 3D(图形,而不是游戏玩法)进行此操作。在测试期间,他们将尝试拥有数百名玩家的 1000x1000 大小的地图。我不明白这对你这么多玩家的方法怎么能不滞后,但也许我错了,或者你可能期望更小的地图/玩家池。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
相关资源
最近更新 更多