2d网络游戏的延迟补偿(Lag compensation with networked 2D games)
http://gamedev.stackexchange.com/questions/6645/lag-compensation-with-networked-2d-games
————————————————————————————————————————————————————————————————————
我要做一个物理驱动的2d网络游戏,有些问题我不大懂,通过研究发现,服务器发来的更新间隔应该是100毫秒,我能想出的是它们是这样工作的:并行的进行物理模拟,通过内插来进行延迟补偿。我不理解的地方是:如何处理来自其他玩家的更新。
如果客户端每个100毫秒获得一次玩家位置更新的通知,我不能想象会发生什么因为100毫秒足够发生太多的事了,玩家在此期间可能已经改变两次方向了。我想知道是否有人已经解决了这个问题,对于射击这样的场景又是如何工作的。
谢谢!
————————————————————————————
这个问题可以解决,但需要明确的一点是如果有任何延迟,那么精确的或者完美的多人物理是不可能实现的。为什么延迟会影响物理会被解释,并提供一些建议,关于如何减少这种这种延迟对物理模拟的影响。
——
创建多人物理游戏可以充满了危险。不可能创造一个“完美”的在线多人物理的体验。有很多事情可以做,以使它更好,但目前还没有办法让完美的物理承担任何延迟。
问题是,物理必须快速响应现实,但在同一时间具有基于各种因素的共同作用,以进行计算 - 这意味着所有玩家的组合动作。而且如果有延迟,这不能被实时实现。
开发者要决定,你是否保持不同的因素在控制之下,并且要明白如何延迟过高,玩家的体验就会降低。如果你能接受(你的玩家们也可以接受),那么就那么做吧。本帖的最后会给出一些关于如何保持平滑的建议。
一个显示事情如何搞砸的例子
想象一下一个游戏中,两个玩家都连到服务器。一个消息从客户端发送到服务器需要100毫秒。当一个玩家做了一个动作,这个消息要发送到服务器并告诉服务器它所做的,然后服务器广播消息给其他玩家,以便其他玩家能够知道这个发送消息的玩家做了什么。
现在想象这样一个场景,两个玩家都看到地面上的一个箱子,玩家A在一边击中这个箱子,使其向某个方向移动;同一时间,玩家B在另一个方向击中箱子,使箱子朝另一个方向移动。
让我们来看看不同的方式来处理这个问题会有那些效果...
只在服务器端进行物理计算
假设我们只在服务器端进行物理计算,玩家A发送消息给服务器“我从这边击中了这个箱子”,100毫秒后服务器收到该消息。玩家B也发送消息“我从另一边击中了这个箱子”。服务器结合着两个动作计算物理改变,并且向两个玩家返回这样的消息“好的,这个箱子应该这样移动”。基于两个玩家的动作的组合,完美物理被执行。但问题是,每个玩家要在200毫毛后才能看到箱子的反应,玩家的消息要用100毫秒到达服务器,另外100毫秒服务器计算结果并返回给玩家。
Bottom line, laggy gameplay.
只在客户端进行物理计算
假设我们只在客户端进行物理计算,让我们以玩家A的视角来看,玩家A击中箱子,箱子立刻向一边移动。玩家A的消息被发送到服务器告诉服务器玩家A所做的动作。
同时玩家B也击中箱子,箱子向另一边移动。玩家B的消息也被发送到服务器告诉服务器玩家B所做的动作。
200毫秒后,服务器的消息到达客户端,此时A,B都知道了各自的动作。问题是,两个客户端都说:“好吧,玩家X在这一点做了个动作,但箱子已经不在那个位置了,所以他们什么都没有打中”
Bottom line is,两个游戏不同步,玩家没有共享的游戏体验。What's the point of multiplayer if they both see different things?
客户端和服务器端同时进行物理计算
在这种情况下,客户端的物理计算是玩家能看到无延迟的反应,而服务器上的物理计算告诉所有玩家这个计算是正确的。
两个玩家都击中了箱子,每个玩家都能看到箱子移动了。但是200毫秒后,服务器返回消息说:“好吧,事实上你们都错了,箱子实际上按这条路移动”,此时两个玩家看到箱子改变了方向,跳跃到新的位置。
Bottom line is, a glitchy game.
结论
当任何延迟存在时,基本上无法无法做到完美的物理模拟。你可以做一个相当不错的游戏,但过度延迟总会给玩家造成不好的物理体验。但是有些事情可以提高玩家的屋里体验。
使多人游戏运行的好可以做的事
使用简单的碰撞形状。不要对形状的物理细节建模,一个简单的立方体就够了。
仅在客户端使用小而无关紧要的对象,例如来自被打破的玻璃的碎片。你可以让每个客户端以自己的方式模拟,因为即使不同也无关紧要。
只对必要的物理对象进行建模,保持活跃的物理对象数量最少。
当模拟多人物理时,使你的游戏运行在低速运动状态,例如子弹时间。低运动游戏弥补了延迟,允许多个玩家参与物理互动。
允许玩家设置某些共同的条件,根据这些条件,为所有玩家进行物理模拟,所有玩家看到这些组合动作的共同结果。玩家不干涉模拟的步骤直到模拟完成。(Allow players to setup a situation of some kind together, and then on some cue, the physics is simulated for both players and both watch the result of their combined actions. Players may not interfere with the sequence until it is completed.)
隔离每个玩家的物理模拟,以使其不能相互影响。例如保龄球或游泳池,同一时间只有一名玩家有控制权,每个玩家都有自己的沙箱。
如果你不能打败他们,就加入他们,物理延迟是你的游戏的一部分。
附录:射击游戏如何处理
射击游戏不需要复杂的物理,它们使用客户端效果,所以玩家能够很快看到东西。但是最后服务器决定到底发生了什么事。
TODO:。。。
2d网络游戏的延迟补偿(Lag compensation with networked 2D games)的更多相关文章
- NGUI创建Camera参数为Simple 2D的UI UI对象的结构UI Root(2D)
NGUI创建Camera参数为Simple 2D的UI UI对象的结构UI Root(2D) 使用NGUI创建的Camera参数为Simple 2D的UI,会在游戏的场景中生成1个名为UI Root( ...
- log4go的精确定时程序(带自动延迟补偿)
程序设计目标是在程序启动10秒后执行某个任务,例如日志转储(rotate),以后每隔15秒执行一次. 初次的设计 package main import ( "time" &quo ...
- 强大的游戏开发工具Unity3D推出2D开发工具,unity将混合3D与2D开发
2013 Unity全球开发者大会(Unite 2013)于2013年8月28日在温哥华隆重开幕,会上Unity全球CEO David Helgason在Keynote上宣布Unity 4.3版本即将 ...
- Meteor 之 数据的发布于订阅(Publish and subscribe )
发布和订阅 发布(Publication)和订阅(Subscription)是 Meteor 的最基本最重要的概念之一,但是如果你是刚刚开始接触 Meteor 的话,也是有些难度的. 这已经导致不少误 ...
- 3d引擎列表
免费引擎 Agar - 一个高级图形应用程序框架,用于2D和3D游戏. Allegro library - 基于 C/C++ 的游戏引擎,支持图形,声音,输入,游戏时钟,浮点,压缩文件以及GUI. A ...
- iPhone之Quartz 2D系列--编程指南(1)概览
以下几遍关于Quartz 2D博文都是转载自:http://www.cocoachina.com/bbs/u.php?action=topic&uid=38018 iPhone之Quartz ...
- 8年,从2D到3D,我的学习之路
Mickey 写了一篇 <一个本科毕业生创业两年的感悟>,从他的视角,总结了我们合作的两年经历. 我也来写一篇,介绍我的学习之路,希望对大家有所帮助,谢谢大家- 我的学习方法 1.直接从0 ...
- 论文翻译——Rapid 2D-to-3D conversion——快速2D到3D转换
https://blog.csdn.net/qq_33445835/article/details/80143598 目前想做一个关于2D转3D的项目,由于国内资料比较少而且大部分都是基于国外的研究 ...
- Rapid 2D-to-3D conversion——快速2D到3D转换
https://blog.csdn.net/qq_33445835/article/details/80143598 目前想做一个关于2D转3D的项目,由于国内资料比较少而且大部分都是基于国外的研究 ...
随机推荐
- 使用@RequestParam绑定请求参数到方法参数
@RequestParam注解用于在控制器中绑定请求参数到方法参数.用法如下:@RequestMapping public void advancedSearch( @RequestParam(& ...
- python练习程序(c100经典例9)
题目: 要求输出国际象棋棋盘. for i in range(1,9): for j in range(1,9): if i%2==0: if j%2==0: print '*', else: pri ...
- 【JavaScript学习笔记】if使用
<html> <body> <script language="JavaScript"> var a=4; var b=2; if(a==3) ...
- php 二维数组的排序
写这是之前一直二维数组排名困扰.自己写的好复杂. 正题: array_mutisort 官方帮助文档 <?php// 取得列的列表foreach ($data as $key => $ro ...
- Android 适配多种ROM的快捷方式
快捷方式 应该来说 很多人都做过,我们就来看一下基本的快捷方式 是怎么实现的,会有什么问题? 首先 肯定要获取权限: <!-- 添加快捷方式 --> <uses-permission ...
- windows 不能在本地计算机启动apache2 的解决方法(不是修改端口)
使用命令行运行apache目录下的httpd程序,它会提示哪里出错了,修改即可 D:\Program Files (x86)\Apache2.\bin\httpd
- [禅悟人生]"执著"是自缚的茧
宋代苏东坡和佛印禅师是好朋友,他们习惯拿对方开玩笑.有一天,苏东坡到金山寺和佛印禅师打坐参禅,苏东坡觉得身心通畅,于是问禅师道:“禅师!你看我坐的样子怎么样?” “好庄严,像一尊佛!” 苏东坡听了非常 ...
- Android 校验apk文件渠道号、包名、版本号
功能:可查看单个或目录下所有apk文件的渠道号.包名.版本号 下载地址:http://download.csdn.net/detail/zgz345/9248487使用:以查看包名.版本号为例 1.c ...
- hibernate的组成部分
持久化类 实现对应的序列化接口 必须有默认的构造函数 持久化类的属性不能使用关键字 标示符 映射文件 类型 java类型和hibernate类型 主键的产生器 increment identity a ...
- int (*p)[4] p 是二级指针 二维数组 二级指针 .xml
pre{ line-height:1; color:#2f88e4; background-color:#e9ffff; font-size:16px;}.sysFunc{color:#3d7477; ...