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)的更多相关文章

  1. 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( ...

  2. log4go的精确定时程序(带自动延迟补偿)

    程序设计目标是在程序启动10秒后执行某个任务,例如日志转储(rotate),以后每隔15秒执行一次. 初次的设计 package main import ( "time" &quo ...

  3. 强大的游戏开发工具Unity3D推出2D开发工具,unity将混合3D与2D开发

    2013 Unity全球开发者大会(Unite 2013)于2013年8月28日在温哥华隆重开幕,会上Unity全球CEO David Helgason在Keynote上宣布Unity 4.3版本即将 ...

  4. Meteor 之 数据的发布于订阅(Publish and subscribe )

    发布和订阅 发布(Publication)和订阅(Subscription)是 Meteor 的最基本最重要的概念之一,但是如果你是刚刚开始接触 Meteor 的话,也是有些难度的. 这已经导致不少误 ...

  5. 3d引擎列表

    免费引擎 Agar - 一个高级图形应用程序框架,用于2D和3D游戏. Allegro library - 基于 C/C++ 的游戏引擎,支持图形,声音,输入,游戏时钟,浮点,压缩文件以及GUI. A ...

  6. iPhone之Quartz 2D系列--编程指南(1)概览

    以下几遍关于Quartz 2D博文都是转载自:http://www.cocoachina.com/bbs/u.php?action=topic&uid=38018 iPhone之Quartz ...

  7. 8年,从2D到3D,我的学习之路

    Mickey 写了一篇 <一个本科毕业生创业两年的感悟>,从他的视角,总结了我们合作的两年经历. 我也来写一篇,介绍我的学习之路,希望对大家有所帮助,谢谢大家- 我的学习方法 1.直接从0 ...

  8. 论文翻译——Rapid 2D-to-3D conversion——快速2D到3D转换

    https://blog.csdn.net/qq_33445835/article/details/80143598  目前想做一个关于2D转3D的项目,由于国内资料比较少而且大部分都是基于国外的研究 ...

  9. Rapid 2D-to-3D conversion——快速2D到3D转换

    https://blog.csdn.net/qq_33445835/article/details/80143598  目前想做一个关于2D转3D的项目,由于国内资料比较少而且大部分都是基于国外的研究 ...

随机推荐

  1. tomcat启动出错(转)

    刚刚装载好的myeclipse 在添加项目到服务器的时候,突然异常涌现. 其实这是一个新手常见的错误.平常配置JDK环境的时候有些人习惯把JDK安装到磁盘的当前文件夹里,这样十分的方便,但是安装时,你 ...

  2. POJ 2069 Super Star

    模拟退火. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm& ...

  3. pageX, clientX ,screenX, offsetX, layerX, ,x的区别

    事件对象event的位置属性,这些参数比较容易混淆 1. pageX,pageY :IE不识别的,鼠标在页面上的位置,从页面左上角开始,即是以页面为参考点,不随滑动条移动而变化,其实就是clientY ...

  4. eclipse 报错 import ... cannot be resolved 处理方法

    项目上右键,properties, 找java build path,切到libraies标签,将爆红的jdk编辑一下,选用你需要的jdk版本,一般1..我看你类的httpServlet报错,也是这个 ...

  5. js屏弊错误

    <SCRIPT language=javascript> <!-- window.onerror=function(){return true;} // --> </SC ...

  6. android 语言切换过程分析

    android 语言切换过程分析 2014-02-27 18:13 1207人阅读 评论(0) 收藏 举报 语言切换android语言切换android改变语言 最近在看一个bug,系统切换语言后,本 ...

  7. [转] gc tips(3)

    原文地址:http://kevincao.com/2011/08/actionscript-garbage-collection-2/ 谈谈ActionScript垃圾回收(下) 前文我们介绍了GC的 ...

  8. Android 高仿腾讯旗下app的 皮肤加载技术

    http://www.cnblogs.com/punkisnotdead/p/4968851.html 以前写的这篇文章 可以高仿出 知乎 新浪微博等 绝大多数app的换肤技术,但是遗漏了腾讯的效果, ...

  9. 关于iOS APP中网络层的设计

    在iOS开发中,请求网络数据,处理获得的数据是很常见的功能,但是很少有资料会讨论关于网络的处理应该放在MVC中得哪个层中. 我在网上Google了一番,记下了几个觉得比较不错的链接.现记录如下: ht ...

  10. 关于RF 315MHz

    1.https://www.pjrc.com/teensy/td_libs_VirtualWire.html These modules worked very reliably when sitti ...