- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试为 MMO 游戏制作一个架构,但我无法弄清楚如何在 GameObjects 中存储我需要的尽可能多的变量,而无需同时进行大量调用以通过线路发送它们更新它们。
我现在拥有的是:
Game::ChangePosition(Vector3 newPos) {
gameobject.ChangePosition(newPos);
SendOnWireNEWPOSITION(gameobject.id, newPos);
}
它使代码成为垃圾,难以维护、理解和扩展。想想冠军的例子:
我必须为每个变量创建很多函数。这只是这个 Champion 的概括,对于每个 Champion 类型/“类”,我可能有 1-2 个其他成员变量。
要是能有OnPropertyChange就完美了来自 .NET 或类似的东西。我试图猜测的架构会很好地工作是如果我有类似的东西:
对于 HP:当我更新它时,自动调用 SendFloatOnWire("HP", hp);
对于 Position:当我更新它时,自动调用 SendVector3OnWire("Position", Position)
对于名称:当我更新它时,自动调用SendSOnWire("Name", Name);
SendFloatOnWire
、SendVector3OnWire
、SendSOnWire
究竟是什么?在 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); }
};
如果您希望将属性保留在您的类中,您会选择指向指针或成员指针而不是值的映射。在构建时,您将使用相关指针初始化 map 。如果您决定更改成员变量,您应该始终通过 setter。
您甚至可以更进一步,将您的 Champion
抽象为只是属性和行为的集合,可以通过 map 进行访问。此组件架构由 Mike McShaffry 公开在 Game Coding Complete (任何游戏开发者必读的书)。有一个 community site用于下载一些源代码的书。您可以查看 actor.h
和 actor.cpp
文件。不过,我真的建议阅读书中的完整解释。
组件化的优点是您可以将网络转发逻辑嵌入到所有属性的基类中:这可以将您的代码简化一个数量级。
关于方法二:
我认为基本想法非常合适,除了对所有对象进行完整分析(或更糟糕的是,传输)会有点矫枉过正。
一个不错的选择是有一个标记,当更改完成时设置,并在更改传输时重置。如果您传输标记的对象(并且可能只传输那些标记的属性),您将最大限度地减少同步线程的工作量,并通过集中传输影响同一对象的多个更改来减少网络开销。
关于C++ 成员变量变化监听器(100+类),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39274213/
当单击复选框(或选择所有复选框)时,我想向 CheckboxSelectionModel 添加一个监听器。 var smSensors = new xg.CheckboxSelectionModel(
我有一个简单的程序,允许 2 个客户端连接到服务器。 连接后,他们可以轮流点击空白卡片图像。 一旦 2 个客户中的任何一个点击空白卡片图片,卡片图片将变为 Ace 俱乐部图片。 更改将显示在客户端的两
我在这里看到了一个代码,该代码以字符串的形式检索鼠标的当前图标,但是此代码使用了TTimer来实现。 因此,我想知道是否存在某些事件(侦听器)来检测鼠标光标图标上的这些更改。 下面是使用TTimer的
我想在我的配置对象上获得一个 onload 事件。 以下工作,除非我创建一个 config.listeners={..} (我认为这就是我需要的?)替换 this.onload({...}); 我什至
通常,在 Java 中,当我有一个向其他对象提供某种通知的对象时,我将使用 Listener/Observer 模式。 有没有更类似于 Scala 的方式来做到这一点?我应该在 Scala 中使用这种
我有一个带有动画器的游戏对象和一些可以触发事件的动画(具有特定的回调函数)。 只要我将脚本添加到与动画器相同的游戏对象(包括接收器),一切都会正常工作: public class AnimatorEv
我有一个带有监听器的 DialogFragment,用于单击按钮以调用 fragment 中的函数。 我收到 lateinit property listener has not been initi
这个问题已经有答案了: Java ActionListener error: incompatible types (4 个回答) 已关闭 5 年前。 我最近刚刚开始学习 Java 代码。我在添加监听
我的代码遇到问题。我想知道是否有一种更简单的方法来使用监听器,而不是不断地这样做: example.addActionListener(new java.awt.event.ActionListene
有没有办法使用 .net 创建控制台应用程序。或通过某个端口监听 SMTP 消息的服务? 我需要创建一个中间层对象来捕获和处理 smtp 消息。也就是说,我希望该监听器发送和接收 smtp 消息,然后
我有一个带有动画器的游戏对象和一些可以触发事件的动画(具有特定的回调函数)。 只要我将脚本添加到与动画器相同的游戏对象(包括接收器),一切都会正常工作: public class AnimatorEv
我有许多向主事件生成服务注册的监听器。然而,我想告诉听众,事件流在某个时刻将会结束。您会通过简单地调用监听器上的方法(例如 finish())来完成此操作,还是有一个单独的事件方法 streamFin
我的代码有什么问题。 我创建了一个 JList,添加了项目并将其推到左侧(BorderLayout.WEST)。每次单击列表项时,我希望在列表右侧显示一个面板。但问题是,当选择列表项并运行监听器时,到
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
这可能是一个简单的问题,但我没有看到它。 我有一个界面 public interface RenderableListener{ public void update(T element);
有人可以直接指出我的正确方向吗?当从组合框中选择适当的选项时,我希望小程序中的 Action 监听器显示从 html 文件检索的 jlabel 中的 3 个参数之一。 干杯 最佳答案 对于组合框,您需
我有一个网站,每个页面上都有许多 jQuery 事件处理程序,所有这些都在一个大型 .js 文件中。 这意味着对于任何页面,大多数事件处理程序都是针对不存在且根本不会使用的 HTML。 这会影响我的表
我有一些 jQuery 监听器设置,用于监听 type="text" 字段上的表单输入。但是,当用户从自动完成下拉框中选择一个选项(即他们之前输入的值已被记住以供将来使用)时,下面的监听器不会收集该值
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我正在用 unity (c#) 做一个类似国际象棋的游戏,但我在尝试进行向上转换以将信息从一个 child 发送到另一个抽象类时遇到了困难。 基本上,我有一个抽象类,它有一个带有函数的事件/委托(de
我是一名优秀的程序员,十分优秀!