【发布时间】:2014-10-16 15:51:26
【问题描述】:
背景信息:
我开始为我正在进行的一个小型演示项目学习网络。我有一个服务器,其中包含一堆具有各种参数(大小、颜色、速度、加速度等)的 Ball 对象。我希望服务器能够做两件事
- 将所有参数发送到客户端,以便客户端可以创建一个与服务器上完全相同的新 Ball 对象。
- 能够定期发送关于球的较小更新,这些更新只会改变它的一些参数(通常是位置和速度)。我们的想法是不要重复发送信息。
我对如何处理这个问题有点不知所措,因为要处理的事情太多了。我的想法是创建一个名为 ClientUpdate 的类,它是我可能想要发送的特定更新类型的抽象基类。
class ClientUpdate
{
protected:
UpdateTypes type;
public:
ClientUpdate(){};
void setType(UpdateTypes t){ type = t; }
virtual void print(ostream& where)const;
friend std::ostream& operator<<(std::ostream& os, const ClientUpdate & obj)
{
obj.print(os);
return os;
}
};
然后对于服务器上可能发生的每个事件,例如当球改变颜色或将其状态从冻结变为未冻结时,我将创建 ClientUpdate 的子类来描述事件。子类将具有简单的变量(字符串、整数、布尔值),我将使用 print 函数将其写入 ostream。
最后,我将在每个更新周期中存储在我的游戏的某个区域(例如房间)发生的所有更新,然后对于订阅该区域的任何客户端,我会发送 1 个大字节客户端更新数组,格式为 UPDATETYPE_DATA_UPDATETYPE_DATA_....等。客户端将解析输入流并从中重新创建更新类(我还没有编写此代码,但我认为这不会很困难)。
我正在使用 Boost::Asio 作为网络代码,我正在关注这里的教程:http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting-started-with-boostasio/?pg=10。我之所以提到这一点,是因为我很确定我想坚持使用 boost asio,因为我试图对 boost 和现代 c++ 感到非常舒服。
问题:
(1) 基本问题是“这是解决我的问题的合理方法吗?”我非常有信心至少可以让它工作,但作为任何网络相关的新手,我不确定我是否在重新发明轮子或在有更简单的做事方式时浪费时间。特别是,将所有“更新”对象收集在一起并通过 1 次大写入发送它们是否效率低下,或者我应该通过单独的写入将单个更新发送到套接字?
(2) 例如,我读过关于 Boost::Serialize 的文章,它似乎与我正在做的非常相似。但是,我对更新在客户端和服务器上应该几乎相同的对象的某些成员变量更感兴趣。 Boost::serialize 对这个有好处,还是更适合发送整个对象?是否还有其他库可以做与我所描述的类似的事情?
【问题讨论】:
标签: c++ networking serialization boost