小编Raú*_*dro的帖子

如何使用C++中的Slot Map/Object Pool模式管理数百万个游戏对象?

我正在开发一款名为Tibia的视频游戏的游戏服务器.

基本上,可以有多达数百万个对象,当玩家与游戏世界交互时,可以有多达数千个删除和重新创建.

问题是,原始创建者使用了一个插槽映射/对象池,当一个对象被移除时,指针被重复使用.这是一个巨大的性能提升,因为除非需要,否则不需要进行太多的内​​存重新分配.

当然,我正在努力实现这一目标,但我的Slot Map遇到了一个巨大的问题:

以下是根据我在网上找到的来源,Slot Map如何工作的一些解释:

Object类是每个游戏对象的基类,我的Slot Map/object Pool使用这个Object类来保存每个分配的对象.

例:

struct TObjectBlock
{
     Object Object[36768];
};
Run Code Online (Sandbox Code Playgroud)

插槽映射的工作方式是,服务器首先在TObjectBlock列表中分配36768个对象,并为每个Object提供唯一的ID ObjectID,当服务器需要创建时,可以在空闲对象列表中重用它们一个新的对象.

例:

对象1(ID:555)被删除,它的ID 555被放入一个空闲对象ID列表中,请求创建一个项目,因为它在自由对象列表上而被重用ID 555,并且不需要重新分配另一个TObjectBlock用于其他对象的数组.

我的问题:如何使用"播放器""生物""项目""平铺"来支持此插槽地图?我似乎没有想出解决这个逻辑问题的方法.

我正在使用虚拟类来管理所有对象:

struct Object
{
    uint32_t ObjectID;
    int32_t posx;
    int32_t posy;
    int32_t posz;
};
Run Code Online (Sandbox Code Playgroud)

然后,我自己创建对象:

struct Creature : Object
{
     char Name[31];
};

struct Player : Creature
{

};

struct Item : Object
{
     uint16_t Attack;
};

struct Tile : Object
{

};
Run Code Online (Sandbox Code Playgroud)

但是现在如果我要使用插槽地图,我必须做这样的事情:

Object allocatedObject;
allocatedObject.ObjectID …
Run Code Online (Sandbox Code Playgroud)

c++ logic design-patterns

4
推荐指数
1
解决办法
1798
查看次数

正则表达式匹配引号外的给定单词

我需要能够匹配引号之外的“互联网”一词。例如

Internet "InternetFormula works and it's internetformula"
Internet "The internet works"
Run Code Online (Sandbox Code Playgroud)

但我不知道该怎么做,因为正则表达式很复杂,而且我找不到类似的东西。

regex match quote

3
推荐指数
1
解决办法
761
查看次数

标签 统计

c++ ×1

design-patterns ×1

logic ×1

match ×1

quote ×1

regex ×1