gpt4 book ai didi

C++ 成员变量变化监听器(100+类)

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:46:59 25 4
gpt4 key购买 nike

我正在尝试为 MMO 游戏制作一个架构,但我无法弄清楚如何在 GameObjects 中存储我需要的尽可能多的变量,而无需同时进行大量调用以通过线路发送它们更新它们。

我现在拥有的是:

Game::ChangePosition(Vector3 newPos) {
gameobject.ChangePosition(newPos);
SendOnWireNEWPOSITION(gameobject.id, newPos);
}

它使代码成为垃圾,难以维护、理解和扩展。想想冠军的例子:

GameObject Champion example

我必须为每个变量创建很多函数。这只是这个 Champion 的概括,对于每个 Champion 类型/“类”,我可能有 1-2 个其他成员变量。

要是能有OnPropertyChange就完美了来自 .NET 或类似的东西。我试图猜测的架构会很好地工作是如果我有类似的东西:

对于 HP:当我更新它时,自动调用 SendFloatOnWire("HP", hp);

对于 Position:当我更新它时,自动调用 SendVector3OnWire("Position", Position)

对于名称:当我更新它时,自动调用SendSOnWire("Name", Name);

SendFloatOnWireSendVector3OnWireSendSOnWire 究竟是什么?在 char 缓冲区中序列化这些类型的函数。

或方法 2(首选),但可能很昂贵

正常更新 Hp、Position,然后每个 Network Thread tick 扫描服务器上的所有 GameObject 实例以查找更改的变量并发送它们。

如何在大规模游戏服务器上实现?我有哪些选择?有什么对这种情况有用的书吗?

宏会有用吗?我想我接触过一些类似东西的源代码,我认为它使用了宏。

提前谢谢你。

编辑:我想我找到了一个解决方案,但我不知道它实际上有多稳健。我将尝试一下,然后看看我的立场。 https://developer.valvesoftware.com/wiki/Networking_Entities

最佳答案

关于方法一:

使用通过 getter/setter 访问的映射,这种方法可能相对“容易”实现。总体思路是这样的:

class GameCharacter {
map<string, int> myints;
// same for doubles, floats, strings
public:
GameCharacter() {
myints["HP"]=100;
myints["FP"]=50;
}
int getInt(string fld) { return myints[fld]; };
void setInt(string fld, int val) { myints[fld]=val; sendIntOnWire(fld,val); }
};

Online demo

如果您希望将属性保留在您的类中,您会选择指向指针或成员指针而不是值的映射。在构建时,您将使用相关指针初始化 map 。如果您决定更改成员变量,您应该始终通过 setter。

您甚至可以更进一步,将您的 Champion 抽象为只是属性和行为的集合,可以通过 map 进行访问。此组件架构由 Mike McShaffry 公开在 Game Coding Complete (任何游戏开发者必读的书)。有一个 community site用于下载一些源代码的书。您可以查看 actor.hactor.cpp 文件。不过,我真的建议阅读书中的完整解释。

组件化的优点是您可以将网络转发逻辑嵌入到所有属性的基类中:这可以将您的代码简化一个数量级。

关于方法二:

我认为基本想法非常合适,除了对所有对象进行完整分析(或更糟糕的是,传输)会有点矫枉过正。

一个不错的选择是有一个标记,当更改完成时设置,并在更改传输时重置。如果您传输标记的对象(并且可能只传输那些标记的属性),您将最大限度地减少同步线程的工作量,并通过集中传输影响同一对象的多个更改来减少网络开销。

关于C++ 成员变量变化监听器(100+类),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39274213/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com