【发布时间】:2015-09-17 10:53:17
【问题描述】:
我正在创建一个多人视频游戏以供娱乐,我有一个服务器和一个客户端正在运行。 我想尽可能优化服务器上的流程。当我们同时收到来自不同客户端的大量信息时,服务器会滞后。
我想和你核实一下我所做的是否可以优化,我觉得很容易。
代码如下:
我们有一张地图:
std::vector< std::vector < caseMap > > _map;
一个简单的对象caseMap:
struct caseMap
{
int areaId;
bomb *bombs;
Bonus *bonus;
int underEffect;
int effectOwnerId;
std::list< player* > players;
};
在此操作之后,我们会花费大量时间来映射案例: (例如当玩家死亡时)
this->_map[pl->getPosY()][pl->getPosX()].players.erase(itp);
有我的问题和解决方案: - 我们可以只有一个向量而不是两个向量,并且有一个小公式来检索我们正在寻找的实际案例。
但是像我现在这样使用它很重吗?我认为通过 [] 访问是大 O 常数,所以它不应该超重。
我可以在某个时候使用一些 const 引用吗?
我应该使用不同的对象,例如 std::map 吗?
如果你们能在 c++ 代码上刷新我的大脑,我有点困惑。 谢谢你:)
【问题讨论】:
-
查找时间是固定的。你把时间浪费在小事上。 “过早的优化是万恶之源”——Donald Knuth。
-
先分析和测量,选择实际需要优化的部分。
-
您需要知道与 STL 数据结构相关的开销很大:一个包含 10 个项目的 std::vector 比仅由 10 个项目使用的内存成本(多一点),这这是由于 STL 簿记所使用的数据结构以及操作员 new[]/malloc() 簿记所使用的数据结构。一般来说,如果有大量元素,“嵌套”STL 类(例如vector
)不是一个好主意,因为开销会变得很大(也就是说,我同意@jcoffland) -
您是如何得出您在那里花费大量时间的结论的?您是否在此处保留列表以查找地图给定区域上的玩家?你与多少玩家打交道?
-
如何优化这取决于更广泛的架构。让我印象深刻的是你取消了很多指针。指针可能意味着非连续存储,并且在某些情况下,非连续存储可能比连续存储慢得多。立即浮现在脑海的问题是:
list<player*>可以替换为vector<player*>吗?你必须为球员使用指针吗?或者您可以将 实际 播放器对象存储在您的caseMap> akavector<player> players中吗?
标签: c++ dictionary optimization vector