- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在为我的数据选择最相关的结构时遇到了麻烦,以下是解释:
我实际上正在为学校开发一个游戏项目,一个类似炸弹人的 C++ 游戏。我正在设计 Map 对象,它包含 Bombs、Boxes、Players 和 Walls。 map 是二维的,我已经有 2 个类型的容器:
std::unordered_map<int, std::unordered_map<int, AEntity*> > *UMap;
一个包含墙,另一个包含可破坏的对象(炸弹、盒子)。我已经在这里讨论了这个选择 -> Choice of unsorted_map .这主要是为了快速访问时间,因为每个 map 的框只能有一个元素。
现在正如标题所暗示的那样,我在为我的玩家选择数据容器时遇到了麻烦,因为一张 map 的盒子上可以有多个玩家,无法使用 unordered_maps。
第一次我打算使用 std::list<AEntity*>
按 std::sorted
排序, AEntity
包含实体信息(坐标),但在编码时
playerOn(const int x, const int y);
function 我发现这是一个糟糕的选择。我无法使用二分法足够快地检索给定盒子上有哪些玩家,如果这个盒子上没有玩家,那就是浪费时间。
我应该如何存储我的 (AEntity)Players 以便能够快速检索它们
(比较头疼的是大 map 上单次可以超过500人,这就是我寻求优化的原因)
我的脑汁快用完了。感谢您 future 的回答。
编辑我的问题
这主要是因为我想知道是否有另一种解决方案可以通过我的整个 std::player 列表来查找 box(x, y) 上是否有人。看起来很慢而且没有优化,但我想不出另一种方法来做到这一点。(如果需要,我可以更改容器类型)
最佳答案
首先,before trying any optimization ,您应该分析您的代码以检测瓶颈在哪里。你会感到惊讶。曾经说过:
1) 你的 unordered_maps 看起来像很多过度工程。 your previous post 中提供的答案是真的,但我认为这对你来说没用。当 n = 500 时,您绝对不关心 O(log(n)) 成本。只需制作一个 Entities*
vector 即可。足够了。
2) 你似乎掉进了god object反设计模式。炸弹人游戏是研究 OOP 的绝佳项目,因为它会教您避免 God Object 设计模式。确保每个类都有自己的业务,没有一个类可以处理所有逻辑(我怀疑你的类 Map 或 Game 有太多的权力)。
a) 创建玩家 vector 、炸弹 vector 、墙壁 vector 、火 vector 等。
b) Map 应该是一个二维数组,存储指向每个 Map 框上存在的实体的指针列表。 (每个 Map[i][j]
都包含指向索引 (i,j) 框内所有元素的指针。
c) 炸弹应该产生火元素。
d) 你的中心程序应该是这样的:
while(gameContinued)
{
for each entity in the game
{
entity.Update(map);
}
game.Render();
}
炸弹更新包括使炸弹的纹理呈现动态并在延迟过期时创建火焰(并相应地使用火焰指针更新 map )。如果延迟过期(并更新 map ),火灾更新除了消失之外什么都没有。玩家更新包括通过键盘事件处理(并更新他们当前的内部 x 和 y 值),在需要时创建炸弹,如果在他们的位置 (x,y) 中,Map[i] 中有火则死亡[j]
实体列表。
3) 在我的大多数学生的炸弹人实现中,他们唯一能遇到的问题是纹理和对象的深度复制。确保你有一个纹理加载器(使用单例模式)以避免多次加载相同的纹理,你应该没问题。
关于c++ - 为我的球员名单选择最佳结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16608035/
我喜欢 MVP 概念,它对我组织代码有很大帮助,但每次我需要从外部应用程序、对话框或请求权限获取结果时,我都会遇到同样的问题问题 - 架构的哪个组件应该关心这个? 例如,我们需要实现以下行为: 点击按
我正在尝试使用 MVP 模式重构我的应用程序,并且希望将来用 View 替换 fragment 。 当 Activity 配置发生变化时,如何存储演示者的缓存数据?我不想使用 SQLite、共享首选项
这个问题更倾向于范式。为什么我们不在 MVP 环境中使用事件总线而不是监听器?通常,“P”部分具有 View 和模型引用的依赖注入(inject)。当然,这有一个优势,即通过 Presenter 显示
在我的基于 MVP 模式(被动 View )的应用程序 (.NET) 中,我将消息框分离到 View 中,这样当我测试我的演示者和模型时,我的测试代码不会受到需要向用户展示一些信息的影响信息。但是当需
我是一名优秀的程序员,十分优秀!