我正在开发一款名为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) 我需要能够匹配引号之外的“互联网”一词。例如
Internet "InternetFormula works and it's internetformula"
Internet "The internet works"
Run Code Online (Sandbox Code Playgroud)
但我不知道该怎么做,因为正则表达式很复杂,而且我找不到类似的东西。