网络模型杂谈

本文对比分析了P2P与Clientserver两种网络模型在即时战略游戏中的应用及各自的优缺点,如扩展性、持久性及游戏代码与网络代码的耦合等问题。

网络模型

像星际争霸,魔兽争霸这种即时战略都是基于P2P的网络模型. Unreal则是基于client server的模型.

Epic说明了一些P2P网络模型的缺点:

  • 缺少persistence. 就是说所有玩家都要一起开始游戏, 玩家不能再游戏中途加入游戏. 这是因为在一个完全P2P的网络环境想加入一个新的客户端很难
  • 可扩展性差. 在P2P里面, 必须通过lock-step的方式,让所有客户端以一个固定的内部帧数运行游戏, 所以客户端之间的协调开销是比较大的,所以不能有太多玩家在一个游戏里面. 同时, 玩家多了以后网络失败的可能性也线性增加.
  • 帧数的可扩展性差. 如上面一点说的, P2P里要求所有客户端用相同的内部帧数来进行游戏, 那么配置最好的客户端也要迁就配置最差的客户端. 这个对网络来说也是如此, 这就是为什么星际里面如果一个玩家网络很卡, 所有人都跟着卡.

Epic也说了client server模型的缺点:

  • Lack of open-endedness: 不明白这英文是什么意思, 但是解释是如果你新加一个物品比如武器什么的,你就要给这个物品写模拟和预测的代码.
  • 预测模型的难度比较大: 意思是游戏代码和网络代码是分开的,但是他们要互相知道. 也就是说作为一个游戏程序员,你要知道你的东西是怎么在客户端和服务器端运行的, 变量复制时怎么工作的.

我个人觉得这两个都不是什么缺点...P2P的难点也不小

理解这些概念, Unreal的网络就理解差不多了:

  • The server is the man
  • Roles: ROLE_SimulatedProxy
  • Relevancy
  • Prioritization
  • Variable replication
  • RPCs: reliable and unreliable

semi-reliable function calls

Unreal 里有reliable 和unreliable函数, 文档里居然有semi-reliable function call, 有点意思.

semi-reliable 函数的思想是来自于pawn的运动. 每帧server都把pawn运动的误差(如果有)发送到客户端, 这个每帧都发, 因此不必是reliable的, 这种纠正不是每个都必须的, 因为即使者帧RPC丢失了,下帧还会再次纠正(当然每个纠正都有一个时间戳,否则纠正到旧的位置就不好了).

不过这个也不是绝对的, 我遇到的一个极端的bug就是server认为带宽不够不够的时候, server会把unreliable都拒绝, 而这个server 总是带宽不够, 这导致位置纠正的RPC一直失败, 从而导致客户端和server的out of sync.

我本来想加一个semi-reliable的关键字, 介于reliable 和unreliable之间, 带这个关键字的函数在一个固定的时间区段内必须成功. 我想的这个semi-relialbe和Unreal自己说的显然不是一回事.

标题

内容

标题

内容

 

 

 

 

转载于:https://www.cnblogs.com/dbbs/archive/2013/01/16/2459761.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值