- 采用P2P于MMORPG是否一个不错的注意?这样能不能节省大量的服务器带宽呢?
首先,实事上服务器的带宽并不是运行MMORPG主要的开销,甚至连次要的也不是。产品内容,客户服务,人际关系的开销通常更高。
其次,对于P2P方式的MMORPGs有两个主要的技术挑战,就是难以以一种完全满意的方式来解决当前游戏设计中遇到的一些问题:
- 如何保护玩家的客户端数据的安全,例如游戏的状态数据、数据文件等等。从技术上来讲,没有绝对安全的计算机平台。
- 如何找到能够以足够低的延迟的其它网络节点,这样当玩家们来来回回走动的时候,能够进行相应的更新。
目前,P2P最适宜的工作是传输大量的较大的数据块(例如内容下载、软件补丁),在传输中你能够很容易的确认其正确性。如果你想发布一个你新关于P2P方式的MMORPG伟大设计的主题,请确信你之前实际写过一些验证的代码,至少在三台协作的机器上测试过,否则大部分人会一笑了之。
网络上有一些已经存在的研究文章,例如 VAST project. 如果你对P2P MMOGs感兴趣就应该看看这些。
- 如何取得我当前运行机器的IP地址?
答:一般来说,这并不是一个好主意,因为你自己的机器IP对于路由器外部的用户不一定可见。还有,不少机器都拥有不止一个的IP地址(一台机器上每个网卡都有一个)。最后,不是所有的ISPs或routers都设置有DNS/reverse DNS,用gethostname()跟随gethostbyname()就可以得出正确的答案。
要使用命令行来列出你的IP地址:在Windows下可以用"ipconfig";在Linux下用"ifconfig";在BSD下用"ifconfig",有些命令可能需要有足够的权限才能执行。
在浏览器中,你可以访问http://www.apnic.net/,这将显示你的外部IP地址(router),不是内部IP地址(机器),如果你在使用NAT防火墙。
- 我想在我的MMORPG中使用TCP,可以吗?
答:当然可以。查看 this long-running and productive thread ,有很多观点和建议。
- 客户端怎样寻找想要通讯的服务器?
答:这儿有一些方法可供参考;
1) 一些客户端允许玩家自己输入IP地址,或者一个主机名用于DNS。这些数据会被保存在配置文件中,便于将来存取。
2) 一些客户端有一个servers/IP地址的硬编码列表。类似于 1).
3) 一些客户端有一个"主服务器"的硬编码名称,通过它可以列出真实有效的服务器。通常,这个名称是作为文本形式编码的(非IP形式),这样在需要的时候主服务器可以被迁移(或通过DNS进行负载平衡),而不需要修改客户端。客户端连接到主服务器,然后取得用于通讯的有效服务器列表,这样可以让玩家来选择(或为玩家选择)适当的游戏服务器。
4) 对于LAN游戏,最常见的做法就是在周知端口上使用UDP进行网络广播,每次大概需要数秒钟的时间。在数据包的开始用一些周知的签名(一些特殊字节),这样在网络发生碰撞的时候你可以区别开自己和其他人的数据包。在尝试广播前确定打开了socket上的broadcast选项。广播只能在当前子网内工作,它们不会被路由到更大的internet。
- 在我已经关闭了位于某端口的socket不久之后,当试着在同一端口上再次打开一个新的socket时候,得到了一个错误,为什么?
答:这发生在TCP,因为TCP连接的结束实现是要等待一些时候,以允许一些迟来碎片包的到达(即使没有人会去读取)。这可以避免将先前连接的数据包和新连接的数据包混淆。
要关闭这种行为,在你创建socket的同时就要打开 SO_REUSEADDR 选项;这样就允许将来在同一端口重新绑定sockets的时候不用等待超时才终止。
- Do I need to send 4 bytes to send a float for position or heading in my entity state update packets?
答:To pack a floating point number of a known range into a fixed number of bits, do something like:
unsigned int pack_float( float v, float minVal, float maxVal, int bits ) {
assert( bits < 32 );
assert( v >= minVal && v < maxVal );
return (unsigned int)((1U<<bits) * (v-minVal) / (maxVal-minVal));
}
要重新解包,象这样做:
float unpack_float( unsigned int val, float minVal, float maxVal, int bits ) {
assert( bits < 32 );
assert( val < (1U<<bits) );
return val * (maxVal-minVal) / (1U<<bits) + minVal;
}
关于更多
注:FAQ - Multiplayer and Network Programming,至此结束。