Articles of 插补

当位置和速度与更新程序相关时,为什么插值会传递到渲染例程?

我已经阅读了几个众所周知的文章,包括这个: deWiTTERS Game Loop 在插值和预测下,子标题是公式的描述。 我正在使用文章中建议的游戏循环(不通过插值)。 我明白为什么要使用插值,但是我很难理解为什么在渲染过程中应用它,以及它与我的游戏有什么关系。 目前我正在使用32×32瓷砖的纯瓷砖运动。 所以,只要B区可以被占用,我的玩家就从A区移动到B区,并且每10ms固定速率1个像素。 状态是“行走”,直到玩家移动完整的32个像素,此时状态是“停止”。 这一切都发生在一个标准的计时器,但所有在我的更新程序。 我的渲染程序只需要玩家的位置并将其渲染到地图上。 在那个可以访问的方程中没有“速度”。 那么我将如何使用插值?

如何模拟networking延迟的影响来testing我的滞后补偿?

我试图在我的游戏中观察滞后补偿的影响,通过将ping增加到200以上,增加损失,并通过限制带宽来使用networking仿真器for Windows Toolkit来模拟广域网延迟。 看起来无论应用的延迟程度如何,我都不会在服务器上看到我的角色位置的任何视觉变化,因为滞后补偿/插值方法总是能够预测我的确切位置。 但是在现实世界中,远距离连接的玩家的同步性很差。 我怎样才能产生与远距离连接的玩家所见到的差同步,这样我就可以为我的游戏select理想的滞后补偿技术。 作为参考,我正在使用Unity 3D进行这个游戏,这是一个快节奏的抽搐射击游戏。

计算插值百分比

我最近一直在阅读关于多人联网的文章 ,一切都在开始。 但是我想知道的一件事是用于插值的百分比值。 例如,文章显示了这个图像: 然后给出以下解释: 客户端收到的最后一个快照的时间是344或10.30秒。 根据此快照和客户端帧速率,客户端时间继续增加。 如果渲染一个新的video帧,则渲染时间是当前客户端时间10.32减去视图插值延迟0.1秒。 在我们的例子中这将是10.22,所有实体及其animation使用快照340和342之间的正确分数进行插值。 在最后一句末尾,它声明使用“快照340和342之间的正确分数”。 这个部分会是什么? 这是一个框架渲染的时间吗?…或者我离开了吗?

使用渲染插值时的input和数据包处理

我为我的简单的自上而下的游戏实施阀门的networking模型,但我有一些devise问题,我不能想到好的解决scheme。 渲染时间与仿真时间分开的主要思想之一。 所以例如我有50ms的插值时间(因为我的服务器更新速率是20Hz)。 所以,在客户端我的模拟时间是1000ms,渲染时间是950ms。 但我有一些devise问题…当用户按下一个键(例如施放法术)时,合乎逻辑的select是在渲染时间(950毫秒)触发它,但这是不可能的,因为我的模拟已经在1000毫秒。 我认为解决scheme可能是使用模拟时间来触发input(并使用“滞后补偿”,所以如果施法时间为100ms,则用户在渲染时间为950ms时投射,在1000ms时开始仿真作为50%的铸造法术)。 但是我不确定,这是一个很好的解决scheme吗? 第二个问题是关于发送数据包。 所以如果我的第一个问题的解决scheme是好的,那么我将从模拟发送最新的数据包(并且在发送数据包时不要担心渲染时间)。 是好还是应该使用渲染时间发送数据包(即,当模拟时间是1000ms,我从950ms发送到服务器数据包)? 第三个问题是关于接收数据包。 当模拟时间为1000ms时收到数据包时,是否应该将数据包保存为1000ms或950ms? 在阀门联网模式(我使用的就是我所说的),当服务器在服务器时间250ms接收到信息“开始施放拼写”时,它由rtt / 2和客户端插值时间补偿…所以我不知道阀门客户端处理input,看起来像他们在渲染时处理它,我不明白。 无论如何,因为我想用我的解决scheme来处理input,我认为我不应该补偿服务器上的插值,是的? 或者,也许我应该补偿服务器也由客户端插值时间? 我希望你能帮我解决我的三个问题。 提前致谢!

如何在HLSL中的float3和float2之间进行转换?

我想把一些3D计算卸载到GPU上,而不会提高我对DX10的要求。 具体来说,我在64x64x64 3D块中生成密度,很适合512×512 2D纹理。 我想能够将我的float2纹理坐标转换为float3值,所以我可以抵消它们,将其转换回float2 ,对我的随机纹理执行查找,然后手动插入结果。 这对于CPU端的整数值很容易做到,但是GPU的纹理坐标都是浮点数。 是否有捷径可寻? 还是有办法让像素着色器3.0使用类似于3D纹理的东西,所以我可以利用自动插值? 另一个需要注意的是,我在XNA中为我的渲染目标(每个通道需要更好的分辨率)使用Vector4图像格式,所以我被限制在点采样。

如何在实体插值中处理不稳定的游戏状态

我正在为一个教育目的的在线快速多人游戏原型。 我使用服务器权威的客户端 – 服务器模型。 我已经实现了基于客户端预测,它工作正常。 现在我正在实体插值,我正在使用一个简单的algorithm: interpolationTime = currentTime – INTERP_BACK_TIME //for my game 0.1s for INTERP_BACK_TIME state1, state2 = getTwoInterpolationStates(interpolationTime) //get two states to interpolate between length = state2.Time – state1.Time t = 0.0 if (length > 0.0001) t = (interpolationTime – state1.Time) / length entityPos = state.pos entityPos.lerp(state2.pos, t) 如果服务器只发送正确的状态,这个algorithm工作正常,这不是我的服务器的情况,让我解释为什么: 客户端发送我所谓的Actions来通知服务器他正在做什么。 例如,如果客户端按右键,它会发送一个新的动作到服务器,像MoveAction(1, 0) […]

插入从服务器接收的Entitiypositions

我想要国际米兰,或者也许推断在客户端的gameentities的位置。 这些职位是从服务器收到的。 服务器模糊的更新使得难以实现。 游戏是一个html5 mmo tbs(基于turnbased的策略)游戏。 这意味着你有一个巨大的地图,有很多玩家的基地和坦克,等等。 单位在网格上移动 以下是服务器的工作原理: Node.js服务器,所以没有真正的multithreading 权威服务器(物理计算在这里) 物理循环15ms /更新循环45ms 物理循环每200ms计算新位置* 更新客户端只有当一些变化(所以没有心跳或任何其他) 更新包含path和当前位置 TCP用于更新客户端 (*粗略地说,因为有些单位更快,而且如果开车是对角线的话,毕达哥拉斯定理被使用 – >〜283ms) 这意味着服务器大约每200毫秒提供一次更新。 但由于物理和更新循环的相移,以及滞后的实际更新时间是这样的: 3314, 239, 206, 177, 186, 2136, 218, 210, 204, 189, 221, 194注意3314, 2136当单元长时间未接收到更新时,引起较大的数字3314, 2136 。 据我所知,数字的畸变是由更新循环的45ms引起的。 所以最坏的情况是200 +/- 45毫秒(不考虑滞后) 到目前为止,我尝试了什么 我目前正在使用插值,但运动是非常波涛汹涌。 我想这是因为不确定的更新时间,也许是因为单位的当前位置被覆盖,这与我的插值混乱。 我正在计算每个单位的插值分别。 客户端渲染周期大约每50ms进行一次 以下代码全部在客户端上。 这是更新发生时的代码: updatePosition : function(unit,x,y){ unit.position.x = x; unit.position.y […]

二维物理库的多人在C ++

我试图创建一个多人function的自上而下的射手。 到目前为止,我使用Box2D进行物理仿真。 最近几天,我在客户端和服务器之间同步移动,而不使用box2d。 我现在觉得Box2d对于我相当简单的需求可能太复杂了(玩家是唯一移动的身体,剩下的场景由静态的多边形组成),在线阅读之后,似乎Box2D并不是通过networking同步物理的最佳select。 特别是在考虑实现客户端预测和实体插值的时候,我必须手动修正值并在其他值之间进行插值,所以我觉得box2d可能更像是一个问题,然后是一个帮助。 正如我注意到我的物理模拟不太复杂(只是多边形 – 多边形相交和光线投射),所以我正在考虑自己实现物理,所以我完全控制它。 也许这里有人已经使用box2d和networking或可以指向我另一个图书馆? 也许我错了,box2d是networking二维物理的最佳解决scheme? :d 我自己实现物理的想法呢?

实体插值(丢包?)

我在networking游戏上工作了一段时间。 我知道client-side prediction和lag compensation (shooting)但我不确定实体插值客户端。 我从服务器发送10fps的更新/同步数据包,并从当前位置插入到新接收的位置。 插值需要100ms(因为10fps)才能达到目标位置,但是如果新位置迟到或者2-3个数据包丢失,该怎么办? 将不存在目标位置,同步(客户端)实体将空闲,直到新的位置数据包,但实体不断向前移动服务器端。 基本上,我不知道在这种情况下做什么。

计算t值以与Hermite插值一起使用

我正在开发一个使用Photon进行联网的Unity FPS。 光子提供的插值是非常基本的,所以我决定使用Hermite样条展开自己的插值。 它工作良好,明显好于提供的插值。 但是,我想知道selectt值的正确方法是什么。 在一个完美的世界里,它应该增加deltaTime * timeBetweenPositionUpdates。 然而,这是行不通的,因为即使tickRate被设置为10,例如,有时客户端在9.5,然后在10.2,等等。 这意味着我们不能有一个恒定的t值增长率,因为它会落后或移动太快,我们将用完缓冲帧。 我想要做的是发送帧更新之间的时间,并使用它进行插值。 但是,这也不是完美的想象力和接收客户很快就会落后很多。 我现在所做的是在t值上使用一个乘数,这样如果缓冲区中有更多的帧比我们想要的多,那么它将加速插值,如果缓冲区中的数量less于我们想要的那么它会减慢插值。 这工作相当好,但我相信这是一个黑客。 有没有更好的方法,或者有一个正确的方法来做到这一点?