我在为数据选择最相关的结构时遇到了麻烦,以下是解释:
我实际上正在为学校开展一个游戏项目,一个像c ++这样的炸弹人游戏。 我正在设计Map对象,它包含炸弹,盒子,玩家和墙壁。 地图是2D,我已经有2个类型的容器:
std::unordered_map<int, std::unordered_map<int, AEntity*> > *UMap;
一个包含墙壁,另一个包含可破坏的物体(炸弹,盒子)。 我已经在这里讨论了这个选择 - &gt; Choice of unsorted_map。 它主要用于快速访问时间,因为每个地图框只能有一个元素。
现在标题显示我在为我的玩家选择数据容器时遇到了麻烦,因为在一个地图的框中可能有多个玩家,因此无法使用无序的地图。
我第一次使用std::list<AEntity*>
排序std::sorted
,AEntity
包含实体信息(coords),但在编码我的时候
playerOn(const int x, const int y);
功能我发现这是一个糟糕的选择。我无法使用二分法快速检索哪个玩家在给定的盒子上,如果没有这个盒子的玩家则浪费时间。
如何存储我的(AEntity)玩家以便能够快速检索
(在发痒的事情上,一次可以有超过500名玩家,在大地图上,这就是我寻找优化的原因)
我的脑汁用完了。感谢您将来的答案。
编辑我的问题
这主要是因为我想知道是否还有另一个解决方案可以通过我的整个std ::播放器列表来查找盒子上是否有人(x,y)。看起来很慢但没有优化,但我无法想出另一种方法来做到这一点。 (如果需要,我可以更改容器类型)
答案 0 :(得分:2)
首先,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应该是一个2维数组,存储指向每个Map框中存在的实体的指针列表。 (每个Map[i][j]
都包含指向索引(i,j)框上所有元素的指针。
c)炸弹应该制造火元素。
d)你的中心例程应该是这样的:
while(gameContinued)
{
for each entity in the game
{
entity.Update(map);
}
game.Render();
}
炸弹更新包括使炸弹的纹理呈现动态,并在延迟过期时创建火焰(并相应地使用火焰指针更新地图)。
除非延迟过期(并更新Map),否则Fire更新除了消失外什么也没有。
玩家更新包括移动键盘事件处理(并更新其当前内部x和y值),如果需要创建炸弹,如果他们的位置(x,y)死亡,Map[i][j]
列表中有火实体。
3)在我的大多数学生实施炸弹人时,唯一可以得到的问题是纹理和对象的深层复制。确保你有一个纹理加载器(使用单例模式)以避免加载相同纹理的多次,你应该没问题。