精华内容
下载资源
问答
  • 一种生成中间技术,异步时间扭曲(Asynchronous Timewarp) 翻译: https://www.oculus.com/blog/asynchronous-timewarp/  异步时间扭曲(Asynchronous Timewarp 时间扭曲,即调整时

    http://www.myexception.cn/other/1883027.html

    一种生成中间帧技术,异步时间扭曲(Asynchronous Timewarp)

    翻译: https://www.oculus.com/blog/asynchronous-timewarp/


       异步时间扭曲(Asynchronous Timewarp 时间扭曲,即调整时长)调查

     

    关于作者:迈克尔·安东诺夫他是Oculus的首席软件工程师,领导SDK团队,在来Oculus之前,他是ScaleformCTO,在那里他领导硬件加速Flash矢量图形引擎项目,这个引擎被用到上百个视频游戏中,在他的职业生涯里,他主要关注复杂的多线程体系结构,计算机图形学,编程语言设计领域。

     

    导言: 异步时间扭曲(Asynchronous Timewarp简称ATW)是一种生成中间帧的技术,当游戏不能保持足够帧率的时候,ATW能产生中间帧,从而有效减少游戏画面的抖动,但是,ATW不是灵丹妙药,有一定局限性(局限性在后面介绍),开发人员也应该意识到。

     

    简介: 近一年来,围绕着ATW这项技术已经有了许多令人兴奋的进展,ATW技术让虚拟现实设备保持较低帧率运行看到了希望,在虚拟现实穿戴设备中应用ATW,人为地填充中间帧,即使在帧率下降的情况下,也不会使渲染质量有显著的下降。 

     

    Gear VR(三星的一款虚拟现实穿戴设备)中,ATW是其重要组成部分,并积累了宝贵的经验, 但是很不幸,经验表明,在PC机上ATW通过位置跟踪方法来解决虚拟现实系统抖动问题是有限的和有技术挑战的,就像Oculus Rift虚拟现实眼镜)一样。在一些情况下,在虚拟现实中应用ATW后的效果和由跳帧引起的抖动效果一样糟糕。 

     

    在这篇博客中,我们分析了这些限制和导致特殊困难的原因,您将看到,ATW有时是有用的,但是还不能让虚拟现实引擎满帧运行,没有达到完美体验的程度。

     

    时间扭曲(Timewarp),异步时间扭曲(Asynchronous Timewarp),和抖动(Judder)的概念:

     

    时间扭曲是一种图像帧修正的技术,在使用虚拟现实眼睛设备时,由于头部运动过快,而造场景渲染的延迟,即头已经转过去了,但是图像还没有渲染出来,或者渲染的是上一帧的图像, 时间扭曲它通过扭曲一副被送往显示器之前图像,来解决这个延迟问题。 最基础的时间扭曲是基于方向的扭曲,这种只纠正了头部的转动变化姿势这种扭曲对于2D图像是有优势的,它合并一副变形图像不需要花费太多系统资源。对于复杂的场景,它可以用较少的计算生成一个新的图像帧。

     

    异步时间扭曲是指在一个线程(称为ATW线程)中进行处理,这个线程和渲染线程平行运行(异步),在每次同步之前,ATW线程根据渲染线程的最后一帧生成一个新的帧。 

     

    抖动和其具体细节在迈克尔·亚伯拉什的一篇文章中有详细介绍(参见我翻译的Ramblings in Value Time.

     

    在虚拟现实设备中,为了正确在虚拟世界里呈现一个人们的感知,必须要在显示器上的定时更新图像,然而,如果渲染时间太长,一帧就会丢失了,产生的结果就是抖动,这是由于新的一帧图像还没有被渲染出来,显示器显示了上一帧的图像,如果一帧图像被两次渲染就会产生下面结果,如图:


    Timewarp5

    这里,眼睛转向左侧,这时图像又被渲染一次,图像落在视网膜的不同部分,导致双影抖动。 

    当然,双影并不是唯一的结果,如果同样的帧显示三次,就会产生三重影,以此类推。 

     

    基于方向的时间扭曲可以解决上午位置重影抖动问题,如果游戏渲染帧没有和头部运动达成同步, 时间扭曲可以介入并产生一个图像替代还没有被渲染出来的帧。 自从最后一帧被渲染,通过扭曲最后一帧来反馈头部运动, 所以相比原始的帧加入ATW显示会减少抖动,如果不加ATW不知道会发生什么事情。 

     

    在某些情况下,简单的渲染扭曲处理可以工作的很好,这种技术已经在Gear VR 中实现了,当游戏不能满足帧率的时候ATW就会自动填充帧,这使得帧很平滑,但有许多细不太明显的小瑕疵,因为 GearVR 缺乏位置跟踪,并且避开了近场对象。下面讨论的许多瑕疵应该怎样减少或避免。

     

    这也就是说,为什么说相比ATWGear VR而言,ATWPC是更有意义和更有挑战性的,让我从Oculus Rift所支持的位置跟踪开始探讨。 

     

    位置抖动(Positional Judder): 

    位置抖动是最明显的用基于方向的时间扭曲带来瑕疵之一,在使用虚拟现实设备时,当头部移动了, 如果在ATW产生图像帧时只考虑了旋转分量,那么任何头部平移分量都将被忽略了。这就意味着当你的头部从一边移动到另一边时,甚至是旋转你的头并且你的转动眼睛,你讲看见离你很近的物体会有多个图像的抖动,这种效果是非常明显的,在临近场空间中,比如下面的这个潜艇截图。 

    timewarp1

    近场对象多重抖动的图像示例。 

     

    那么,这种影响有多严重? 

    这个颤抖的程度取决于玩家的运动方式,如果你保持你的头部相对静止并且只看风景,这种颤动将并不显著,可以忽略不计。

     

    注意:上述现象在Gear VR 中是非常常见的, 它没有包含位置跟踪, 然而,头部模型产生虚拟的旋转,所以当用Gear VR 在半速率玩游戏的时候, 你仍然可以观察到近场物体的抖动。 

     

    如果看远处物体, 头部运动不太可能引起明显抖动。 在这种情况下。ATW可以使你自由的看中远处场景,并且没有明显的抖动。 

     

    换句话说, 如果你离场景非常的近,当你头部移动的时候,位置抖动将会相当明显,就像没有ATW一样,这种抖动也会出现在当你近距离看带纹理的地面的时候,这个场景离你非常近并没有产生中间帧, 由此产生的感觉是一个让人望而生畏,不稳定的世界, 让人非常迷茫和不舒服。 

     

    位置扭曲(Positional Timewarp):

    解决位置颤抖的一个可能的方法是实现全位置扭曲,它应用平移和旋转两个分量来修正原始帧,位置扭曲,位置扭曲需要考虑原始帧的深度信息,由不同的量替代图像的一部分。 然而,这样产生的中间帧会使物体边缘不闭合,由于没有原始帧中的数据,会导致中间帧某些区域不能被覆盖。 

    此外,位置扭曲代价更高, 不容易处理半透明,处理反走样比较麻烦。位置扭曲并不能解决下面要讨论的情形。 

     

    运动的物体和动画:

    使用ATW时,动画或者移动的物体引起另外一个瑕疵, 因为一个新的图像是只是根据原始图像生成的,原始图像上并没有物体的运动信息, 对于所有ATW产生的中间帧都好像是被冻结了一样,这个伪影表现为这些移动的物体,即抖动的多幅图像。 

    Timewarp2

    场景中移动物体产生的抖动效果。 

     

    这个伪影的影响取决于场景中物体数量投影面积,运动速度,如果数量或大小的物体很小或不快多个图像可能不是特别明显然而,当移动物体或动画覆盖屏幕很大一部分,那将令人不安的。 

     

    此外,帧率比,即游戏帧率和显示设备刷新率的比值会对运动的抖动效果造成影响,根据我们的经验,ATW应该允许在一个固定的帧率区间内,例如,对于90赫兹的刷新率,我们应该在45赫兹区间使用ATW, 这将导致图像增加一倍,但在视网膜的双图像的相对位置将保持稳定渲染在一个中间帧率,比如65赫兹,这将导致在视网膜上的图像数目和位置不断变化,这是一个糟糕的中间帧。

     

    镜面反射: 

    计算镜面反射需考虑眼睛的方向, 或摄像机的方向, 由此生成一个图片。 

     Timewarp3Timewarp4

     

    由于眼睛或头部运动,镜面反射不再是正确的,这可能导致镜面反射抖动。

     

    像镜面高光和反射依赖于眼睛位置一样,还有许多其他依赖于眼睛位置的着色技巧也有类似的问题, 例如,视差贴图和浮雕纹理映射将有类似的效果。 

     

    实现:  

    实现ATW是有挑战性的,主要有两个原因: 

    1: 它需要GPU硬件支持合理的抢占粒度。

    2: 它要求操作系统和驱动程序支持使GPU抢占。 

    让我们从抢占粒度开始,在90赫兹,帧之间的间隔大约是11ms(1/90),这意味着为了使ATW有机生成一帧,它必须能够抢占渲染线程并且运行时间少于11ms,然而11ms实际上不够好,如果ATW在一帧时间区间内任意随机点开始运行,那么起潜伏期(执行和帧扫描之间的时间)也将随机, 我们需要确保我们不跳跃任何游戏渲染的帧。 

     

    我们真的期望ATW运行一直非常的短,短到在视频卡产生新的一帧之前结束,刚好有足够的时间来完成中间帧的生成,缺少自定义的同步ATW中断例程,我们可以获得高优先级抢占粒度和调度, 在最长2ms或更少的时间内。

     

    原来,对现在的图形卡和驱动实现来说,2ms抢占是一个艰巨的任务,虽然许多GPU支持有限的形式的抢占,但执行存在显著差异。 

     

    1: 一些显卡实现厂商和驱动程序允许抢占任一批处理或回执调用粒度,虽然有帮助,但不是十分完美(举一个极端的例子,一个复杂的并包含很多绘制指令着色器可以很容易在10ms完成)。

    2: 其他显卡实现厂商和驱动程序允许抢占计算着色器, 但需要特定扩展来支持。 

     

    如果抢占操作不是很快,则ATW将无法抢在画面同步之前生成中间帧。  这样,最后一帧将会再显示,将导致抖动,这意味着一个正确的实现应该能够抢占和恢复任意渲染操作,和管线状态。 理论上讲,甚至三角抢占(triangle-granularity) 不够好,因为我们不知道一个复杂着色器执行将花多长时间。 我们正与GPU制造商来实现更好的抢占,但是在这之前确实要因为这个问题花费一定时间。

     

    另外一方面是操作系统对抢占的支持,在Windows8之前,Windiows显示驱动模型(WDDM)支持使用“批处理队列”粒度的有限抢占,对于内奸的图形驱动程序,很不幸,图形驱动程序趋向于大批量渲染效率, 导致支持ATW太粗糙。  

     

    对于Windows8,改善了WDDM1.2支持更细的抢占粒度,然而,这些抢占模式不被图形驱动程序普遍支持,渲染管线将在Windows 10 或 DirectX12中得到显著提升。 这为开发人员提供了较低级别的渲染控制,这是一个好消息, 但直到Windows10变为主流之前,我们还是没有标准的方式来支持渲染抢占, 造成的结果是,ATW需要特定显卡驱动的扩展。

     

     

    ATW是有用的,但不是万能的。 

    一旦我们普遍实现了GPU渲染管线管理和任务抢占, ATW可能成为另一种工具来帮助开发人员提高性能和减少虚拟现实的抖动, 然而,由于我们这里列出的挑战的问题,ATW不是万能的, VR的应用本身最好是维持较高的帧率,以提供最好的渲染质量。 最坏的情况,ATW生成的中间帧也可以导致用户有不舒服的感受,换句话说,ATW无法根本解决这种不舒服。

     

    根据生成中间帧的复杂性来说, ATW很显然表明, 甚至是位置时间扭曲, ATW不会成为一个完美的通用的解决方案,这意味着只有方向ATW和位置ATW还算是可以的, 填充帧时偶尔会有跳跃。 为了产生一个舒适,令人信服的虚拟现实,开发人员仍然需要保持帧率在90赫兹。 

     

    试图支持传统显示器和VR双模式将会面临很大性能困难,这种巨大的性能要求是对引擎的伸缩性的考验,对于开发人员遇到的这种情况, ATW可能看起来很有吸引力, 如果达到90赫兹的频率,将使VR具有很好的舒适性,这是VR存在的真正魅力。 

    展开全文
  •  异步时间扭曲(Asynchronous Timewarp 时间扭曲,即调整时长)调查   关于作者:迈克尔·安东诺夫,他是Oculus的首席软件工程师,领导SDK团队,在来Oculus之前,他是Scaleform的CTO,在那里他领导硬件加速Flash...

    翻译: https://www.oculus.com/blog/asynchronous-timewarp/


       异步时间扭曲(Asynchronous Timewarp 时间扭曲,即调整时长)调查

     

    关于作者:迈克尔·安东诺夫他是Oculus的首席软件工程师,领导SDK团队,在来Oculus之前,他是ScaleformCTO,在那里他领导硬件加速Flash矢量图形引擎项目,这个引擎被用到上百个视频游戏中,在他的职业生涯里,他主要关注复杂的多线程体系结构,计算机图形学,编程语言设计领域。

     

    导言: 异步时间扭曲(Asynchronous Timewarp简称ATW)是一种生成中间帧的技术,当游戏不能保持足够帧率的时候,ATW能产生中间帧,从而有效减少游戏画面的抖动,但是,ATW不是灵丹妙药,有一定局限性(局限性在后面介绍),开发人员也应该意识到。

     

    简介: 近一年来,围绕着ATW这项技术已经有了许多令人兴奋的进展,ATW技术让虚拟现实设备保持较低帧率运行看到了希望,在虚拟现实穿戴设备中应用ATW,人为地填充中间帧,即使在帧率下降的情况下,也不会使渲染质量有显著的下降。 

     

    Gear VR(三星的一款虚拟现实穿戴设备)中,ATW是其重要组成部分,并积累了宝贵的经验, 但是很不幸,经验表明,在PC机上ATW通过位置跟踪方法来解决虚拟现实系统抖动问题是有限的和有技术挑战的,就像Oculus Rift虚拟现实眼镜)一样。在一些情况下,在虚拟现实中应用ATW后的效果和由跳帧引起的抖动效果一样糟糕。 

     

    在这篇博客中,我们分析了这些限制和导致特殊困难的原因,您将看到,ATW有时是有用的,但是还不能让虚拟现实引擎满帧运行,没有达到完美体验的程度。

     

    时间扭曲(Timewarp),异步时间扭曲(Asynchronous Timewarp),和抖动(Judder)的概念:

     

    时间扭曲是一种图像帧修正的技术,在使用虚拟现实眼睛设备时,由于头部运动过快,而造场景渲染的延迟,即头已经转过去了,但是图像还没有渲染出来,或者渲染的是上一帧的图像, 时间扭曲它通过扭曲一副被送往显示器之前图像,来解决这个延迟问题。 最基础的时间扭曲是基于方向的扭曲,这种只纠正了头部的转动变化姿势这种扭曲对于2D图像是有优势的,它合并一副变形图像不需要花费太多系统资源。对于复杂的场景,它可以用较少的计算生成一个新的图像帧。

     

    异步时间扭曲是指在一个线程(称为ATW线程)中进行处理,这个线程和渲染线程平行运行(异步),在每次同步之前,ATW线程根据渲染线程的最后一帧生成一个新的帧。 

     

    抖动和其具体细节在迈克尔·亚伯拉什的一篇文章中有详细介绍(参见我翻译的Ramblings in Value Time.

     

    在虚拟现实设备中,为了正确在虚拟世界里呈现一个人们的感知,必须要在显示器上的定时更新图像,然而,如果渲染时间太长,一帧就会丢失了,产生的结果就是抖动,这是由于新的一帧图像还没有被渲染出来,显示器显示了上一帧的图像,如果一帧图像被两次渲染就会产生下面结果,如图:


    Timewarp5

    这里,眼睛转向左侧,这时图像又被渲染一次,图像落在视网膜的不同部分,导致双影抖动。 

    当然,双影并不是唯一的结果,如果同样的帧显示三次,就会产生三重影,以此类推。 

     

    基于方向的时间扭曲可以解决上午位置重影抖动问题,如果游戏渲染帧没有和头部运动达成同步, 时间扭曲可以介入并产生一个图像替代还没有被渲染出来的帧。 自从最后一帧被渲染,通过扭曲最后一帧来反馈头部运动, 所以相比原始的帧加入ATW显示会减少抖动,如果不加ATW不知道会发生什么事情。 

     

    在某些情况下,简单的渲染扭曲处理可以工作的很好,这种技术已经在Gear VR 中实现了,当游戏不能满足帧率的时候ATW就会自动填充帧,这使得帧很平滑,但有许多细不太明显的小瑕疵,因为 GearVR 缺乏位置跟踪,并且避开了近场对象。下面讨论的许多瑕疵应该怎样减少或避免。

     

    这也就是说,为什么说相比ATWGear VR而言,ATWPC是更有意义和更有挑战性的,让我从Oculus Rift所支持的位置跟踪开始探讨。 

     

    位置抖动(Positional Judder): 

    位置抖动是最明显的用基于方向的时间扭曲带来瑕疵之一,在使用虚拟现实设备时,当头部移动了, 如果在ATW产生图像帧时只考虑了旋转分量,那么任何头部平移分量都将被忽略了。这就意味着当你的头部从一边移动到另一边时,甚至是旋转你的头并且你的转动眼睛,你讲看见离你很近的物体会有多个图像的抖动,这种效果是非常明显的,在临近场空间中,比如下面的这个潜艇截图。 

    timewarp1

    近场对象多重抖动的图像示例。 

     

    那么,这种影响有多严重? 

    这个颤抖的程度取决于玩家的运动方式,如果你保持你的头部相对静止并且只看风景,这种颤动将并不显著,可以忽略不计。

     

    注意:上述现象在Gear VR 中是非常常见的, 它没有包含位置跟踪, 然而,头部模型产生虚拟的旋转,所以当用Gear VR 在半速率玩游戏的时候, 你仍然可以观察到近场物体的抖动。 

     

    如果看远处物体, 头部运动不太可能引起明显抖动。 在这种情况下。ATW可以使你自由的看中远处场景,并且没有明显的抖动。 

     

    换句话说, 如果你离场景非常的近,当你头部移动的时候,位置抖动将会相当明显,就像没有ATW一样,这种抖动也会出现在当你近距离看带纹理的地面的时候,这个场景离你非常近并没有产生中间帧, 由此产生的感觉是一个让人望而生畏,不稳定的世界, 让人非常迷茫和不舒服。 

     

    位置扭曲(Positional Timewarp):

    解决位置颤抖的一个可能的方法是实现全位置扭曲,它应用平移和旋转两个分量来修正原始帧,位置扭曲,位置扭曲需要考虑原始帧的深度信息,由不同的量替代图像的一部分。 然而,这样产生的中间帧会使物体边缘不闭合,由于没有原始帧中的数据,会导致中间帧某些区域不能被覆盖。 

    此外,位置扭曲代价更高, 不容易处理半透明,处理反走样比较麻烦。位置扭曲并不能解决下面要讨论的情形。 

     

    运动的物体和动画:

    使用ATW时,动画或者移动的物体引起另外一个瑕疵, 因为一个新的图像是只是根据原始图像生成的,原始图像上并没有物体的运动信息, 对于所有ATW产生的中间帧都好像是被冻结了一样,这个伪影表现为这些移动的物体,即抖动的多幅图像。 

    Timewarp2

    场景中移动物体产生的抖动效果。 

     

    这个伪影的影响取决于场景中物体数量投影面积,运动速度,如果数量或大小的物体很小或不快多个图像可能不是特别明显然而,当移动物体或动画覆盖屏幕很大一部分,那将令人不安的。 

     

    此外,帧率比,即游戏帧率和显示设备刷新率的比值会对运动的抖动效果造成影响,根据我们的经验,ATW应该允许在一个固定的帧率区间内,例如,对于90赫兹的刷新率,我们应该在45赫兹区间使用ATW, 这将导致图像增加一倍,但在视网膜的双图像的相对位置将保持稳定渲染在一个中间帧率,比如65赫兹,这将导致在视网膜上的图像数目和位置不断变化,这是一个糟糕的中间帧。

     

    镜面反射: 

    计算镜面反射需考虑眼睛的方向, 或摄像机的方向, 由此生成一个图片。 

     Timewarp3Timewarp4

     

    由于眼睛或头部运动,镜面反射不再是正确的,这可能导致镜面反射抖动。

     

    像镜面高光和反射依赖于眼睛位置一样,还有许多其他依赖于眼睛位置的着色技巧也有类似的问题, 例如,视差贴图和浮雕纹理映射将有类似的效果。 

     

    实现:  

    实现ATW是有挑战性的,主要有两个原因: 

    1: 它需要GPU硬件支持合理的抢占粒度。

    2: 它要求操作系统和驱动程序支持使GPU抢占。 

    让我们从抢占粒度开始,在90赫兹,帧之间的间隔大约是11ms(1/90),这意味着为了使ATW有机生成一帧,它必须能够抢占渲染线程并且运行时间少于11ms,然而11ms实际上不够好,如果ATW在一帧时间区间内任意随机点开始运行,那么起潜伏期(执行和帧扫描之间的时间)也将随机, 我们需要确保我们不跳跃任何游戏渲染的帧。 

     

    我们真的期望ATW运行一直非常的短,短到在视频卡产生新的一帧之前结束,刚好有足够的时间来完成中间帧的生成,缺少自定义的同步ATW中断例程,我们可以获得高优先级抢占粒度和调度, 在最长2ms或更少的时间内。

     

    原来,对现在的图形卡和驱动实现来说,2ms抢占是一个艰巨的任务,虽然许多GPU支持有限的形式的抢占,但执行存在显著差异。 

     

    1: 一些显卡实现厂商和驱动程序允许抢占任一批处理或回执调用粒度,虽然有帮助,但不是十分完美(举一个极端的例子,一个复杂的并包含很多绘制指令着色器可以很容易在10ms完成)。

    2: 其他显卡实现厂商和驱动程序允许抢占计算着色器, 但需要特定扩展来支持。 

     

    如果抢占操作不是很快,则ATW将无法抢在画面同步之前生成中间帧。  这样,最后一帧将会再显示,将导致抖动,这意味着一个正确的实现应该能够抢占和恢复任意渲染操作,和管线状态。 理论上讲,甚至三角抢占(triangle-granularity) 不够好,因为我们不知道一个复杂着色器执行将花多长时间。 我们正与GPU制造商来实现更好的抢占,但是在这之前确实要因为这个问题花费一定时间。

     

    另外一方面是操作系统对抢占的支持,在Windows8之前,Windiows显示驱动模型(WDDM)支持使用“批处理队列”粒度的有限抢占,对于内奸的图形驱动程序,很不幸,图形驱动程序趋向于大批量渲染效率, 导致支持ATW太粗糙。  

     

    对于Windows8,改善了WDDM1.2支持更细的抢占粒度,然而,这些抢占模式不被图形驱动程序普遍支持,渲染管线将在Windows 10 或 DirectX12中得到显著提升。 这为开发人员提供了较低级别的渲染控制,这是一个好消息, 但直到Windows10变为主流之前,我们还是没有标准的方式来支持渲染抢占, 造成的结果是,ATW需要特定显卡驱动的扩展。

     

     

    ATW是有用的,但不是万能的。 

    一旦我们普遍实现了GPU渲染管线管理和任务抢占, ATW可能成为另一种工具来帮助开发人员提高性能和减少虚拟现实的抖动, 然而,由于我们这里列出的挑战的问题,ATW不是万能的, VR的应用本身最好是维持较高的帧率,以提供最好的渲染质量。 最坏的情况,ATW生成的中间帧也可以导致用户有不舒服的感受,换句话说,ATW无法根本解决这种不舒服。

     

    根据生成中间帧的复杂性来说, ATW很显然表明, 甚至是位置时间扭曲, ATW不会成为一个完美的通用的解决方案,这意味着只有方向ATW和位置ATW还算是可以的, 填充帧时偶尔会有跳跃。 为了产生一个舒适,令人信服的虚拟现实,开发人员仍然需要保持帧率在90赫兹。 

     

    试图支持传统显示器和VR双模式将会面临很大性能困难,这种巨大的性能要求是对引擎的伸缩性的考验,对于开发人员遇到的这种情况, ATW可能看起来很有吸引力, 如果达到90赫兹的频率,将使VR具有很好的舒适性,这是VR存在的真正魅力。 

      

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     


    展开全文
  • 服务器是知道具体逻辑的,所以如果两边客户端计算的某些变量出现一致的时候,就会出现同步的情况,随着时间的推进,一个小小的同步也会造成滚雪球效应,最后的结果可能就南辕北辙了。 所以为什么会出现...

    解决不同步问题首先考虑什么是不同步的问题,为什么会出现不同步的情况。

    那么什么是不同步的问题呢?帧同步是由客户端计算,发送命令给服务器,服务器转发命令达到两边客户端显示一致。服务器是不知道具体逻辑的,所以如果两边客户端计算的某些变量出现不一致的时候,就会出现不同步的情况,随着时间的推进,一个小小的不同步也会造成滚雪球效应,最后的结果可能就南辕北辙了。

    所以为什么会出现不同步的情况,也很好解释了,两边客户端无法保证输入的一致性,计算的一致性,就无法保证唯一的输出。

    首先,一个战斗系统的可玩性很大的一点是战斗的伤害具有随机性,幅度会在一定范围内随机显示,然后还有几率出现暴击;而帧同步的特性就是要消灭这样的随机性,两边客户端在同一时间计算出来的伤害一定是一个数字。那么如何控制这个随机性呢?通过服务器在帧同步开始的时候下发同一个随机数种子,通过自定义的随机数算法保证这个数字看上去是随机的,但是实际上是必然的。

    其次是计算过程中的精度损失,最为关键的就是浮点数导致的精度损失,在不同的硬件环境下,相同的浮点数可能会造成不同的运算结果,虽然这个结果在这一帧内影响有限,但是由于滚雪球效应,最终的战斗结果可能就会出现非常明显的不同步问题了。对于这个问题,采用定点数去代替浮点数做计算,使用一个万分比的参数去转换定点数和浮点数,这样就能避免规避掉浮点数的问题。

    然后是逻辑顺序执行不一致,这个一般是由于使用到了一些插件,而这些插件的Update并不能由帧同步去控制,导致两边客户端可能执行某个计算片段的时间并不是在同一逻辑帧,所以解决这个问题的方案就是,不要使用这些插件,尽量去使用开源插件或者自己写,保证Update函数掌控在自己的逻辑中,去避免出现不同步的问题。例如物理系统、动画系统、AI等这些插件,就尽量去使用自己写的,保证一致性。

    然后是网络接收数据的先后顺序不一致的不同步问题,通常的帧同步为了保证网络的流程,会丢弃掉成熟的TCP,采用UDP去自行实现可靠的网络收发,但是如果一旦不考虑清楚网络的复杂性,就会出现网络波动的情况下,后发的消息可能会比先发的消息先发送到接收端,如果这时候接收端不进行处理的话,就会出现接收端先处理后一条消息,再处理前一条消息的情况,这样输入的顺序不一致,也是会造成最终的不同步的。解决方法也很简单,对每一个发出的消息做一个自增的编号,根据编号的连续性确定消息的顺序,就算先收到后面的消息,也可以等待前面的消息收到之后进行顺序传入游戏逻辑中。

    总结来说,就是保证客户端的输入一致,计算一致,就能解决帧同步的不同步问题。

    最后,一个优秀的帧同步系统,首先应该尽量去避免不同步的问题,其次就是在出现不同步问题的时候,能快速查找出问题的根源,然后去解决问题。

     

    2019年9月10日新增

    最近半年一直在做帧同步战斗这块,对于解决不同步问题又有了一些新的感悟,因为项目人员变多,上一个项目在小公司,做战斗就一两个,非常好控制,现在换到了腾讯,战斗差不多十个人在做,几乎每天都能遇到各种各样的不同步问题,在这里做一个阶段性的总结。

    首先是之前说的随机数种子,项目demo阶段为了快速开发,多人协作,表现层有时候会调用到不少逻辑API,而这些逻辑API里面可能会调用到随机数生成算法,这样就可能造成A客户端随机数调用了3次,B客户端调用了4次,最后真正逻辑去调用的时候,两边生成的随机数就不一致了。我们称之为随机数污染,解决方法就是讲表现层和逻辑层彻底分离,表现层不回调逻辑层任何代码,当需要用到逻辑层的接口的时候,一定要注意这个接口只是提供const返回,而不修改任何逻辑层数据。

    然后还有一个是在逻辑层杜绝Dictionary的使用,Dictionary内存放的数据是无序的,如果需要遍历的话,就会造成AB客户端遍历的顺序不一致,最后导致不同步,如果想要使用字典的话,需要自行实现一个确定顺序的。同样的情况还出现在List.Sort上,Sort的原理是通过快排去实现有序排列的,而快排是不稳定的,所以也需要自行实现排序算法。

    还有一点出现在断线重连追帧重回,断线重连的时候为了快速重连,一般都是通过快照的方式实现的,比如每隔1000帧上传一份客户端的快照,但是随着客户端的逻辑修改,快照很多时候都会漏数据,这时候就需要有一个强大的框架去实现快照功能,避免开发的时候因为需求变动导致断线重连不同步的bug。

    同样是快照,还会造成另外一些问题,有些程序在代码中会使用一些静态变量,而快照不是从第0帧开始计算的,这时候这些静态变量的值可能就没有正确的计算,导致最后重连回来不同步。比如说我在某个类里面定义了一个静态变量count,这个变量的含义就是在游戏中调用了函数function多少次,而A客户端没有断线重连,正常执行下去,count=10,而B客户端通过快照重回,count=5,这时候两个客户端就不一致了。

    还有一点是数据、代码版本一致,一定要在进入战斗之前确定好进入帧同步战斗的所有客户端数据、代码版本完全一致。

    最后非常值得注意的一点是,表现层的报错千万不能影响到逻辑层,最好的方法就是表现层update和逻辑层的update分离,先执行完逻辑层的update再执行表现层的update。

     

    10月19日补充

    今天出现了一种不同步,由于我们新开发的功能没有做好表现层和逻辑层分离,逻辑层直接调用了表现层的接口,然后A手机切后台回来,执行了一些逻辑,导致调用进去表现层抛出异常了,B手机无此异常,此时AB逻辑层不同步。这个问题由于表现层和逻辑层没有彻底分离导致的,解决方法就是逻辑层不直接调用表现层的数据,而是通过Command的方式去通知表现层,表现层通过表现层单独的Update去轮询Command,然后去处理。

     

    2020年3月7日补充

    今天在断线重连的时候出现了另外一种不同步,原因如下

    AB两个容器中同时引用到C这个对象,为了保证断线重连的时候同步,我们会把C这个对象传到后台,当重连的时候还原回去,结果发现反序列化出来了两个C分别存在于A容器和B容器中,这时候正常玩家是修改一个C就能同时影响两个容器的数值,而断线重连的玩家修改一个C只能影响A容器或者B容器的数值。

    解决方法是存储一致性,不要两个容器同时引用同一个对象

    展开全文
  • MSTP多区域生成树协议

    万次阅读 多人点赞 2018-05-22 13:20:44
    802.1s中定义的生成树协议,通过生成多个生成树,来解决以太网环路问题。 目的: 在以太网中部署MSTP协议后可实现如下功能: 形成多棵无环路的树,解决广播风暴并实现冗余备份。 多棵生成树在VLAN间实现负载...

    MSTP简介

    多生成树协议MSTP(Multiple Spanning Tree Protocol)是IEEE
    802.1s中定义的生成树协议,通过生成多个生成树,来解决以太网环路问题。

    目的:

    在以太网中部署MSTP协议后可实现如下功能:

    • 形成多棵无环路的树,解决广播风暴并实现冗余备份。
    • 多棵生成树在VLAN间实现负载均衡,不同VLAN的流量按照不同的路径转发。

    MSTP原理描述

    STP/RSTP的缺陷:

    RSTP在STP基础上进行了改进,实现了网络拓扑快速收敛。但RSTP和STP还存在同一个缺陷:由于局域网内所有的VLAN共享一棵生成树,因此无法在VLAN间实现数据流量的负载均衡,链路被阻塞后将不承载任何流量,还有可能造成部分VLAN的报文无法转发。

    MSTP对STP和RSTP的改进:

    • 为了弥补STP和RSTP的缺陷,IEEE于2002年发布的802.1S标准定义了MSTP。MSTP兼容STP和RSTP,既可以快速收敛,又提供了数据转发的多个冗余路径,在数据转发过程中实现VLAN数据的负载均衡。
    • MSTP把一个交换网络划分成多个域,每个域内形成多棵生成树,生成树之间彼此独立。每棵生成树叫做一个多生成树实例MSTI(Multiple Spanning Tree Instance),每个域叫做一个MST域(MST Region:Multiple Spanning Tree Region)。
    • 所谓生成树实例就是多个VLAN的一个集合。通过将多个VLAN捆绑到一个实例,可以节省通信开销和资源占用率。MSTP各个实例拓扑的计算相互独立,在这些实例上可以实现负载均衡。可以把多个相同拓扑结构的VLAN映射到一个实例里,这些VLAN在端口上的转发状态取决于端口在对应MSTP实例的状态。

    MSTP基本概念:

    • MST域(MST Region)

      ​ 都启动了MSTP。

      • 具有相同的域名。
      • 具有相同的VLAN到生成树实例映射配置。
      • 具有相同的MSTP修订级别配置。

      一个局域网可以存在多个MST域,各MST域之间在物理上直接或间接相连。用户可以通过MSTP配置命令把多台交换设备划分在同一个MST域内。

    • VLAN映射表:

    VLAN映射表是MST域的属性,它描述了VLAN和MSTI之间的映射关系。

    • CST

    公共生成树CST(Common Spanning Tree)是连接交换网络内所有MST域的一棵生成树。

    如果把每个MST域看作是一个节点,CST就是这些节点通过STP或RSTP协议计算生成的一棵生成树。

    • IST

      内部生成树IST(Internal Spanning Tree)是各MST域内的一棵生成树。

      IST是一个特殊的MSTI,MSTI的ID为0,通常称为MSTI0。

      IST是CIST在MST域中的一个片段。

    • SST

    运行STP或RSTP的交换设备只能属于一个生成树。

    MST域中只有一个交换设备,这个交换设备构成单生成树。

    • CIST

      公共和内部生成树CIST(Common and Internal Spanning Tree)是通过STP或RSTP协议计算生成的,连接一个交换网络内所有交换设备的单生成树。

    • 域根

      域根(Regional Root)分为IST域根和MSTI域根。

      一个MST域内可以生成多棵生成树,每棵生成树都称为一个MSTI。MSTI域根是每个多生成树实例的树根。

    • 总根

      总根是CIST(Common and Internal Spanning Tree)的根桥。

    • 主桥

      主桥(Master Bridge)也就是IST Master,它是域内距离总根最近的交换设备。

    • 端口角色

      根端口、指定端口、Alternate端口、Backup端口和边缘端口的作用同RSTP协议中定义。

      除边缘端口外,其他端口角色都参与MSTP的计算过程。

      同一端口在不同的生成树实例中可以担任不同的角色。

    端口角色:

    端口角色说明
    根端口在非根桥上,离根桥最近的端口是本交换设备的根端口。根交换设备没有根端口。根端口负责向树根方向转发数据。
    指定端口对一台交换设备而言,它的指定端口是向下游交换设备转发BPDU报文的端口。
    Alternate端口从配置BPDU报文发送角度来看,Alternate端口就是由于学习到其它网桥发送的配置BPDU报文而阻塞的端口。 从用户流量角度来看,Alternate端口提供了从指定桥到根的另一条可切换路径,作为根端口的备份端口。
    Backup端口从配置BPDU报文发送角度来看,Backup端口就是由于学习到自己发送的配置BPDU报文而阻塞的端口。 从用户流量角度来看,Backup端口作为指定端口的备份,提供了另外一条从根节点到叶节点的备份通路。
    Master端口1、 Master端口是MST域和总根相连的所有路径中最短路径上的端口,它是交换设备上连接MST域到总根的端口。 2、 Master端口是域中的报文去往总根的必经之路。 3、 Master端口是特殊域边缘端口,Master端口在CIST上的角色是Root Port,在其它各实例上的角色都是Master端口。
    域边缘端口域边缘端口是指位于MST域的边缘并连接其它MST域或SST的端口。
    边缘端口1、如果指定端口位于整个域的边缘,不再与任何交换设备连接,这种端口叫做边缘端口。2、 边缘端口一般与用户终端设备直接连接。 3、 端口使能MSTP功能后,会默认启用边缘端口自动探测功能,当端口在(2 × Hello Timer + 1)秒的时间内收不到BPDU报文,自动将端口设置为边缘端口,否则设置为非边缘端口。

    端口状态:

    MSTP定义的端口状态与RSTP协议中定义相同。

    注:根端口、Master端口、指定端口和域边缘端口支持Forwarding、Learning和Discarding状态,Alternate端口和Backup端口仅支持Discarding状态。

    MSTP报文:

    MSTP使用多生成树桥协议数据单元MST BPDU(Multiple Spanning Tree Bridge Protocol Data Unit)作为生成树计算的依据。MST BPDU报文用来计算生成树的拓扑、维护网络拓扑以及传达拓扑变化记录。

    STP中定义的配置BPDU、RSTP中定义的RST BPDU、MSTP中定义的MST BPDU及TCN BPDU差异对比如下:

    四种BPDU差异比较:

    版本类型名称
    00x00配置BPDU
    00x80TCN BPDU
    20x02RST BPDU
    30x02MST BPDU

    MSTP帧格式:

    这里写图片描述

    图:MSTP帧格式

    无论是域内的MST BPDU还是域间的,前35个字节和RST BPDU相同。

    从第36个字节开始是MSTP专有字段。最后的MSTI配置信息字段由若干MSTI配置信息组连缀而成。

    MSTP 报文字段解释:

    字段说明
    Protocol Identifier协议标识符。
    Protocol Version Identifier协议版本标识符,STP为0,RSTP为2,MSTP为3。
    BPDU TypeBPDU类型,MSTP为0x02。0x00:STP的Configuration BPDU0x80:STP的TCN BPDU(Topology Change Notification BPDU)0x02:RST BPDU(Rapid Spanning-Tree BPDU)或者MST BPDU(Multiple Spanning-Tree BPDU)
    CIST FlagsCIST标志字段。
    CIST Root IdentifierCIST的总根交换机ID。
    CIST External Path CostCIST外部路径开销指从本交换机所属的MST域到CIST根交换机的累计路径开销。CIST外部路径开销根据链路带宽计算。
    CIST Regional Root IdentifierCIST的域根交换机ID,即IST Master的ID。 如果总根在这个域内,那么域根交换机ID就是总根交换机ID。
    CIST Port Identifier本端口在IST中的指定端口ID。
    Message AgeBPDU报文的生存期。
    Max AgeBPDU报文的最大生存期,超时则认为到根交换机的链路故障。
    Hello TimeHello定时器,缺省为2秒。
    Forward DelayForward Delay定时器,缺省为15秒。
    Version 1 LengthVersion1 BPDU的长度,值固定为0。
    Version 3 LengthVersion3 BPDU的长度。
    MST Configuration IdentifierMST配置标识,表示MST域的标签信息,包含4个字段:Configuration Identifier Format Selector:固定为0。Configuration Name:“域名”,32字节长字符串。Revision Level:2字节非负整数。Configuration Digest:利用HMAC-MD5算法将域中VLAN和实例的映射关系加密成16字节的摘要。只有MST Configuration Identifier中的四个字段完全相同的,并且互联的交换机,才属于同一个域。
    CIST Internal Root Path CostCIST内部路径开销指从本端口到IST Master交换机的累计路径开销。CIST内部路径开销根据链路带宽计算。
    CIST Bridge IdentifierCIST的指定交换机ID。
    CIST Remaining HopsBPDU报文在CIST中的剩余跳数。
    MSTI Configuration Messages (may be absent)MSTI配置信息。每个MSTI的配置信息占16 bytes,如果有n个MSTI就占用n×16bytes。单个MSTI Configuration Messages的字段说明如下:MSTI Flags:MSTI标志。MSTI Regional Root Identifier:MSTI域根交换机ID。MSTI Internal Root Path Cost:MSTI内部路径开销指从本端口到MSTI域根交换机的累计路径开销。MSTI内部路径开销根据链路带宽计算。MSTI Bridge Priority:本交换机在MSTI中的指定交换机的优先级。MSTI Port Priority:本交换机在MSTI中的指定端口的优先级。MSTI Remaining Hops:BPDU报文在MSTI中的剩余跳数。

    MSTP报文抓包示例:

    这里写图片描述

    图:MST BPDU包示例

    MSTP报文格式可配置:

    目前MSTP的BPDU报文存在两种格式:

    • dot1s:IEEE802.1s规定的报文格式。
    • legacy:私有协议报文格式。

    如果端口收发报文格式为默认支持dot1s或者legacy,这样就存在一个缺点:需要人工识别对端的BPDU报文格式,然后手工配置命令来决定支持哪种格式。人工识别报文格式比较困难,且一旦配置错误,就有可能导致MSTP计算错误,出现环路。

    华为技术有限公司采用的端口收发MSTP报文格式可配置(stp compliance)功能,能够实现对BPDU报文格式的自适应:

    • auto
    • dot1s
    • legacy

    这样报文收发不但支持dot1s和legacy格式,还能通过auto方式根据收到的BPDU报文格式自动切换端口支持的BPDU报文格式,使报文格式与对端匹配。在自适应的情况下,端口初始支持dot1s格式,收到报文后,格式则和收到的报文格式保持一致。

    每个Hello Time时间内端口最多能发送BPDU的报文数可配置:

    Hello Time用于生成树协议定时发送配置消息维护生成树的稳定。如果交换设备在一段时间内没有收到BPDU报文,则会由于消息超时而对生成树进行重新计算。

    当交换设备成为根交换设备时,该交换设备会按照该设置值为时间间隔发送BPDU报文。非根交换设备采用根交换设备所设置的Hello Time时间值。

    华为技术有限公司数据通信设备提供的每个Hello Time时间内端口最多能够发送的BPDU报文个数可配置(Max Transmitted BPDU Number in Hello Time is Configurable)功能,可以设定当前端口在Hello Time时间内配置BPDU的最大发送数目。

    用户配置的数值越大,表示每Hello Time时间内发送的报文数越多。适当的设置该值可以限制端口每Hello Time时间内能发送的BPDU数目,防止在网络拓扑动荡时,BPDU占用过多的带宽资源。

    MSTP拓扑计算:

    MSTP可以将整个二层网络划分为多个MST域,各个域之间通过计算生成CST。域内则通过计算生成多棵生成树,每棵生成树都被称为是一个多生成树实例。其中实例0被称为IST,其他的多生成树实例为MSTI。MSTP同STP一样,使用配置消息进行生成树的计算,只是配置消息中携带的是设备上MSTP的配置信息。

    优先级向量:

    MSTI和CIST都是根据优先级向量来计算的,这些优先级向量信息都包含在MST BPDU中。各交换设备互相交换MST BPDU来生成MSTI和CIST。

    • 优先级向量简介

      • 参与CIST计算的优先级向量为:

        { 根交换设备ID,外部路径开销,域根ID,内部路径开销,指定交换设备ID,指定端口ID,接收端口ID }

      • 参与MSTI计算的优先级向量为:

        { 域根ID,内部路径开销,指定交换设备ID,指定端口ID,接收端口ID }

      括号中的向量的优先级从左到右依次递减。

    向量说明:

    向量名说明
    根交换设备ID根交换设备ID用于选择CIST中的根交换设备。根交换设备ID = Priority(16bits) + MAC(48bits)。其中Priority为MSTI0的优先级。
    外部路径开销(ERPC)从CIST的域根到达总根的路径开销。MST域内所有交换设备上保存的外部路径开销相同。若CIST根交换设备在域中,则域内所有交换设备上保存的外部路径开销为0。
    域根ID域根ID用于选择MSTI中的域根。域根ID = Priority(16bits) + MAC(48bits)。其中Priority为MSTI0的优先级。
    内部路径开销(IRPC)本桥到达域根的路径开销。域边缘端口保存的内部路径开销大于非域边缘端口保存的内部路径开销。
    指定交换设备IDCIST或MSTI实例的指定交换设备是本桥通往域根的最邻近的上游桥。如果本桥就是总根或域根,则指定交换设备为自己。
    指定端口ID指定交换设备上同本设备上根端口相连的端口。Port ID = Priority(4位) + 端口号(12位)。端口优先级必须是16的整数倍。
    接收端口ID接收到BPDU报文的端口。Port ID = Priority(4位) + 端口号(12位)。端口优先级必须是16的整数倍。
    • 比较原则

      同一向量比较,值最小的向量具有最高优先级。

      优先级向量比较原则如下。

      1. 首先,比较根交换设备ID。
      2. 如果根交换设备ID相同,再比较外部路径开销。
      3. 如果外部路径开销相同,再比较域根ID。
      4. 如果域根ID仍然相同,再比较内部路径开销。
      5. 如果内部路径仍然相同,再比较指定交换设备ID。
      6. 如果指定交换设备ID仍然相同,再比较指定端口ID。
      7. 如果指定端口ID还相同,再比较接收端口ID。

      如果端口接收到的BPDU内包含的配置消息优于端口上保存的配置消息,则端口上原来保存的配置消息被新收到的配置消息替代。端口同时更新交换设备保存的全局配置消息。反之,新收到的BPDU被丢弃。

    CIST中端口角色的选举:

    1、比价CIST的总根ID,越小越优。
    2、比较CIST到达总根的ERPC,越小越优。
    3、比较CIST域根的BID,越小越优。
    4、比较CIST到达域根的IPRC,越小越优。
    5、比较CIST中BPDU报文发送者的BID,越小越优。
    6、比较CIST中BPDU报文发送者的PID,越小越优。
    7、比较CIST中BPDU报文接收者的PID,越小越优。

    CIST的计算:

    经过比较配置消息后,在整个网络中选择一个优先级最高的交换设备作为CIST的树根。在每个MST域内MSTP通过计算生成IST;同时MSTP将每个MST域作为单台交换设备对待,通过计算在MST域间生成CST。CST和IST构成了整个交换设备网络的CIST。

    MSTI的计算:

    在MST域内,MSTP根据VLAN和生成树实例的映射关系,针对不同的VLAN生成不同的生成树实例。每棵生成树独立进行计算,计算过程与STP计算生成树的过程类似。

    MSTI的特点:

    • 每个MSTI独立计算自己的生成树,互不干扰。

    • 每个MSTI的生成树计算方法与STP基本相同。

    • 每个MSTI的生成树可以有不同的根,不同的拓扑。

    • 每个MSTI在自己的生成树内发送BPDU。

    • 每个MSTI的拓扑通过命令配置决定。

    • 每个端口在不同MSTI上的生成树参数可以不同。

    • 每个端口在不同MSTI上的角色、状态可以不同。

    • 在MST域内,沿着其对应的MSTI转发。

    • 在MST域间,沿着CST转发。

    MSTP对拓扑变化的处理:

    MSTP拓扑变化处理与RSTP拓扑变化处理过程类似。

    在RSTP中检测拓扑是否发生变化只有一个标准:一个非边缘端口迁移到Forwarding状态。

    • 为本交换设备的所有非边缘指定端口启动一个TC While Timer,该计时器值是Hello Time的两倍。

      在这个时间内,清空所有端口上学习到的MAC地址。

      同时,由非边缘端口向外发送RST BPDU,其中TC置位。一旦TC While Timer超时,则停止发送RST BPDU。

    • 其他交换设备接收到RST BPDU后,清空所有端口学习到MAC地址,除了收到RST BPDU的端口。然后也为自己所有的非边缘指定端口和根端口启动TC While Timer,重复上述过程。

    如此,网络中就会产生RST BPDU的泛洪。

    MSTP快速收敛机制:

    MSTP支持普通方式和增强方式两种P/A(Proposal/Agreement)机制:

    • 普通方式

      MSTP支持普通方式的P/A机制实现与RSTP支持的P/A机制实现相同。

    • 增强方式

    这里写图片描述

    图:增加方式的P/A机制

    在MSTP中,P/A机制工作过程如下:

    • 上游设备发送Proposal报文,请求进行快速迁移。下游设备接收到后,把与上游设备相连的端口设置为根端口,并阻塞所有非边缘端口。
    • 上游设备继续发送Agreement报文。下游设备接收到后,根端口转为Forwarding状态。
    • 下游设备回应Agreement报文。上游设备接收到后,把与下游设备相连的端口设置为指定端口,指定端口进入Forwarding状态。

    缺省情况下,华为数据通信设备使用增强的快速迁移机制。如果华为数据通信设备和其他制造商的设备进行互通,而其他制造商的设备P/A机制使用普通的快速迁移机制,此时,可在华为数据通信设备上通过设置P/A机制为普通的快速迁移机制,从而实现华为数据通信设备和其他制造商的设备进行互通。

    MSTP多进程:

    MSTP多进程是基于MSTP协议的增强性技术。此技术可将二层交换设备上的端口绑定到不同的进程中,并以进程为单位进行MSTP协议计算,不在同一个进程内的端口不参与此进程中的MSTP协议计算,从而实现各个进程内的生成树计算相互独立,互不影响。

    MSTP多进程机制并不只限于MSTP协议,RSTP和STP协议同样适用。

    优势:

    通过部署MSTP多进程可实现如下:

    • 极大地提升了在不同组网条件下生成树协议的可部署性。

      为了保证运行不同类型生成树协议的网络可靠运行,可将不同类型的生成树协议划分到不同的进程中,不同进程对应的网络进行独立的生成树协议计算。

    • 增强了组网的可靠性,对于大量的二层接入设备,可减少单台设备故障对整个网络的冲击。

      通过进程隔离不同的拓扑计算,即某台设备故障只影响其所在的进程对应的拓扑,不会影响其他进程拓扑计算。

    • 网络扩容时,可减少网络管理者维护量,从而提升了用户运维管理的方便性。

      当网络扩容时,只需要划分新的进程与原有网络对接,不需要调整原有网络的MSTP进程配置。如果是某个进程中进行了设备扩容,此时也只需要针对扩容的进程进行修改,而不需要调整其他进程中的配置。

    • 实现二层端口分割管理

      每个MSTP进程可以管理设备上的部分端口,即设备的二层端口资源被多个MSTP进程分割管理,每个MSTP进程上均可运行标准的MSTP。

    MSTP配置

    配置MSTP基本功能:

    配置MSTP的工作模式:

    stp mode mstp //配置交换设备的MSTP模式
    

    因为STP和MSTP不能互相识别报文,而MSTP和RSTP可以互相识别报文,所以若工作在MSTP工作模式下,交换设备会设置所有和运行STP的交换设备直接相连的端口工作在STP模式下,其他端口工作在MSTP模式下,实现运行不同生成树协议的设备之间的互通。

    配置MST域并激活:

    当两台交换设备的以下配置都相同时,这两台交换设备属于同一个MST域。

    • MST域的域名。
    • 多生成树实例和VLAN的映射关系。
    • MST域的修订级别。
    stp region-configuration //进入MST域视图
    region-name name //配置MST域的域名
    instance 1 vlan 2 to 3 //配置多生成树的实例与VLAN映射关系
    vlan-mapping modulo modulo //配置多生成树实例和VLAN按照缺省算法自动分配映射关系。缺省情况下,MST域内所有的VLAN都映射到生成树实例0。
    revision-level level //配置MST域的MSTP修订级别
    //缺省情况下,MST域的MSTP修订级别为0。
    //MSTP是标准协议,各厂商设备的MSTP修订级别一般都默认为0。如果某厂商的设备不为0,为保持MST域内计算,在部署MSTP时,需要将各设备的MSTP修订级别修改为一致。
    active region-configuration //激活MST域的配置
    

    配置根桥和备份根桥:

    stp instance 0 root primary //配置当前设备为根桥设备。 
    stp instance 0 root secondary//配置当前交换设备为备份根桥设备。 
    

    配置交换设备在指定实例中的优先级;

    stp instance 0 priority 32768 
    //配置交换设备在指定生成树实例中的优先级。 
    

    配置端口在指定生成树实例中的路径开销:

    stp pathcost-standard { dot1d-1998 | dot1t | legacy }
    //配置端口路径开销计算方法。 缺省情况下,路径开销的计算方法为IEEE 802.1t(dot1t)标准方法。
    
    //同一网络内所有交换设备的端口路径开销应使用相同的计算方法。
    
    stp instacne 0 cost cost //设置当前端口在指定生成树实例中的路径开销值。 
    
    • 配置端口路径开销计算方法为legacy时,参数cost取值范围是1~200000。

    • 配置端口路径开销计算方法为dot1d-1998时,参数cost取值范围是1~65535。

    • 配置端口路径开销计算方法为dot1t时,参数cost取值范围是1~200000000。

    配置端口在指定生成树实例中的优先级:

    stp instance 0 port priority 128
      //配置端口在指定生成树实例中的优先级。
    

    缺省情况下,端口的优先级数值为128。

    优先级数值的取值范围是0~240,步长为16。

    配置端口收发MSTP下一的报文格式:

    MSTP协议报文存在两种格式,一种为dot1s,即IEEE802.1s规定的报文格式,另一种为legacy,是一种私有报文格式。

    配置时,可以指定报文的格式,也可以配置MSTP协议报文格式自适应的功能,即根据收到的MSTP协议报文格式自动切换端口支持的MSTP协议报文格式,使报文格式与对端匹配。

    stp compliance { auto | dot1s legacy } 配置端口协议报文格式。

    stp config-digest-snoop //使能端口上配置摘要监听功能。

    MSTP配置举例:

    如下图,按要求配置各个区域。防止出现环路。

    配置文件:

    SW1:SW2和3与SW1类似。

    <SW1>dis current-configuration 
    #
    sysname SW1
    #
    vlan batch 2 to 20
    #
    stp instance 0 root primary
    stp instance 1 root primary
    stp instance 2 root secondary
    #
    stp region-configuration
     region-name HCNA
     revision-level 1
     instance 1 vlan 1 to 10
     instance 2 vlan 11 to 20
     active region-configuration
    #
    interface GigabitEthernet0/0/1
     port link-type trunk
     port trunk allow-pass vlan 2 to 20
    #
    interface GigabitEthernet0/0/2
     port link-type trunk
     port trunk allow-pass vlan 2 to 20
    #
    

    SW4:SW5和6配置和SW4配置类似:

    <SW4>dis current-configuration 
    #
    sysname SW4
    #
    vlan batch 2 to 20
    #
    stp instance 1 root primary
    stp instance 2 root secondary
    #
    stp region-configuration
     region-name HCNP
     revision-level 2
     instance 1 vlan 1 to 10
     instance 2 vlan 11 to 20
     active region-configuration
    #
    interface GigabitEthernet0/0/1
     port link-type trunk
     port trunk allow-pass vlan 2 to 20
    #
    interface GigabitEthernet0/0/2
     port link-type trunk
     port trunk allow-pass vlan 2 to 20
    #
    interface GigabitEthernet0/0/3
     port link-type trunk
     port trunk allow-pass vlan 2 to 20
    #
    

    SW7:8,9的配置和7的配置类似:

    [SW7]dis current-configuration 
    #
    sysname SW7
    #
    vlan batch 2 to 20
    #
    stp instance 1 root primary
    stp instance 2 root secondary
    #
    stp region-configuration
     region-name HCIE
     instance 1 vlan 1 to 10
     instance 2 vlan 11 to 20
     active region-configuration
    #
    interface GigabitEthernet0/0/1
     port link-type trunk
     port trunk allow-pass vlan 2 to 20
    #
    interface GigabitEthernet0/0/2
     port link-type trunk
     port trunk allow-pass vlan 2 to 20
    #
    interface GigabitEthernet0/0/3
     port link-type trunk
     port trunk allow-pass vlan 2 to 20
    #
    

    查看MSTP状态:

    这里写图片描述

    图:SW4各端口在不同示例下的状态

    参考文档:华为HedEx文档


    展开全文
  • 生成树协议 — STP

    万次阅读 多人点赞 2018-07-04 11:05:48
    4.1.1 实验目的(1)理解生成树...生成树协议STP网络设计通常采用冗余方法提高网络的健壮性、稳定性。常见的冗余方式有:链路冗余和设备冗余。如图4-1所示。该三层结构的网络中,核心层、分布层和接入层均采用了链路...
  • 生成树 Spanning tree

    千次阅读 2019-05-02 15:13:48
    3.数据的重复拷贝 解决方案:逻辑性阻塞某个接口(down掉,可以备份)------做生成树 一、STP:spanning tree生成树(交换机之间对比比较信息BPDU,低的接口就阻塞 ) 生成树协议用于实现二层的线路冗余,在...
  • unity 实现同步

    万次阅读 多人点赞 2019-02-09 17:14:18
    此框架为有同步需求的游戏做一个简单的示例,实现了一个精简的框架,本文着重讲解同步游戏开发过程中需要注意的各种要点,伴随框架自带了一个小的塔防sample作为演示. 目录: 哪些游戏需要使用同步 如何实现一个...
  • 解析以太网V2MAC的格式

    万次阅读 2018-06-08 10:59:30
    从Ethernet物理层电路设计的角度,接受Manchester编码信号的电路是锁相技术,锁相电路从开始接收到进入稳定状态的时间大约为12b。设置前导码与前定界符的目的是保证接收电路在目的地址字段到达前进入稳定...
  • 新手必看:生成对抗网络的初学者入门指导   https://www.cnblogs.com/DicksonJYL/p/9698877.html     本文为 AI 研习社编译的技术博客,原标题 A Beginner's Guide to Generative Adversarial Networks ...
  • 生成树原来这么简单

    千次阅读 多人点赞 2020-07-14 12:33:08
    生成树原来这么简单 文章目录生成树原来这么简单前言摘要什么是生成树?生成树的作用?一、STP1.1 背景1.2 STP增强特性1.2.1 portfast 端口加速1.2.2 backbonefast 骨干加速1.2.3 uplinkfast 上行链路加速1.2.4 BPDU...
  • 作者:蔡小帅 ... 虽然电影24FPS也不如60FPS的流畅,但是24FPS不会让人觉得卡,甚至12FPS都不会让人觉得卡,而24FPS的游戏能让人很明显的感受到卡,12FPS就是幻灯片...第一个原因就是由两者图像生成原理不同造成的。
  • 网络游戏之同步物理模拟

    千次阅读 2017-07-25 19:36:09
    笔者介绍:姜雪伟,IT公司技术合伙人,IT...CSDN视频网址:http://edu.csdn.net/lecturer/144 本篇博客我们将用网络中的同步技术进行物理模拟,同步是通过仅发送控制该系统的输入而不是该系统的状态将系统从一
  • 视频关键提取

    万次阅读 2015-04-29 23:51:34
    引子:最近在帮老师做项目,涉及到视频和图形图像处理这方面的内容。我觉得作为一个程序猿,仅仅着眼于小的...当时卡在视频关键提取这一块好长时间,也没人指导我自己该怎么做,谁让我们程序猿自学能力要强呢? 网
  • 流畅度游戏60,视频24的原因

    千次阅读 2018-01-12 18:44:39
    流畅度游戏60,视频24的原因  虽然电影24FPS也不如60FPS的流畅,但是24FPS不会让人觉得卡,甚至12FPS都不会让人觉得卡,而24FPS的游戏能让人... 电影虽然只有24FPS,但是每一都包含了一段时间的信息,而游戏则
  • 2017/12/12 更新 解决训练收敛的问题。更新在最后面部分。1、DCGAN的简单总结稳定的深度卷积GAN 架构指南: 所有的pooling层使用步幅卷积(判别网络)和微步幅度卷积(生成网络)进行替换。 在生成网络和判别网络上使用...
  • 生成树协议STP、RSTP和MSTP原理的理解

    万次阅读 多人点赞 2018-12-20 22:15:17
    在组网中,很可能会...生成树协议(STP、RSTP、MSTP)就可以实现这样的功能。 STP(802.1D,SpanningTreeProtocol,生成树协议) 基本思想 将网络的拓扑修剪为树形拓扑,拓扑图形状与一棵树相似,这样就不会...
  • STP生成树总结

    千次阅读 2019-07-16 17:06:29
    因为交换网中可能会产生环路,产生环路会带来问题1:局域网广播风暴问题2:重复发送数据问题3:不稳定的cam表,导致网络异常,所以使用STP。 产生环路后,到底对网络有什么影响? 影响1:让网络变慢,出现环路后...
  • 语音生成

    千次阅读 2017-12-19 18:55:13
     短时自相关函数的定义为 其中k是时间的延迟量,N为长,短时自相关函数具有以下重要性质。若当原信号具有周期性,那么它的自相关函数也具有周期性,并且周期性与原信号的周期相同。且在K等于周期整数倍时会出现...
  • 生成树协议STP和快速生成树协议RSTP的配置及原理

    万次阅读 多人点赞 2017-10-02 18:20:35
    生成树协议STP和快速生成树协议RSTP: ...缺点是:产生交换环路,会导致广播风暴、多复制、MAC地址表抖动。因此生成树协议是为了提供冗余链路,解决环路问题(作用)。 生成树协议的原理:使冗余端
  • 同步相关

    千次阅读 2017-09-21 17:34:30
    请教同步问题 您好!跟您请教几个问题:1.同步预判玩家输
  • 游戏同步方案——同步

    千次阅读 2020-06-27 17:22:26
    游戏同步方案——同步同步(Lockstep)和状态同步(State Synchronization)状态同步同步合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表...
  • 用python一键生成动画(上)

    千次阅读 2020-05-17 09:24:07
    简介 这种动画类型,我觉得可以叫做配音配画的小说。 微型小说:多余的话 第一篇文章,介绍一下设计过程的...同时一个作品的形成过程中进行反复调试是难免的,针对中间结果进行调试可以节约时间。 基本流程 第零
  • 生成树协议(spanning tree protocol)

    千次阅读 2018-07-26 14:50:52
    生成树协议(spanning tree protocol) 工作在二层里面(数据链路层) 二层交换机   理解一下重点: STP的工作原理 ... MAC地址表不稳定(震荡) 解决的方法就是:生成树协议STP 树是没有环的。 ...
  • 生成树协议——STP 详解(day 5)

    千次阅读 2020-06-05 18:47:30
    环路问题1.1 广播风暴1.2 MAC地址表翻转1.3 多复制2. STP 作用2.1 作用2.2 基本术语2.2.1 桥(Bridge)2.2.2 桥MAC地址2.2.3 桥 ID(BID)2.2.4 端口 ID(PID)3. STP 树的生成3.1 选举根桥3.2 确定根端口3.2.1...
  • 作者丨武广学校丨合肥工业大学硕士生研究方向丨图像生成谈到数据的生成,很多人都会想到利用生成对抗网络(GAN)去实现,这对于图像和视频这种较易于编码表示的数据是合适的。然而...
  • Sequence to Sequence – Video to Text,从视频到文本句子的端对端模型),该任务可以分解为两个子任务,一个是如何理解视频/多模态,并融合以得到更好的视觉表示,另一个是视频描述生成,如何得到质量高,甚至...
  • 通过渲染间隔累计定时器,每执行渲染回调,当累计时间达到逻辑间隔时间执行逻辑回调。 当逻辑计数大于前当关键数时,锁定定时器不再执行任何逻辑,等待服务器下发下一个关键的所有事件。否则在关键立...
  • 深度卷积生成对抗网络--DCGAN

    万次阅读 2017-07-29 21:45:23
    深度卷积生成对抗网络
  • 此框架专为有同步需求的游戏打造,实现了一个最精简的框架,这几篇文章我会详细讲解同步游戏的制作要点,伴随框架自带了一个小的塔防demo作为演示. 什么情况下需要使用同步 同步原理 服务器校验 如何做平台...
  • GAN生成对抗网络综述

    千次阅读 2019-08-30 20:33:17
    使用上面第一个公式作为loss时:在判别器达到最优的时候,等价于最小化生成分布与真实分布之间的JS散度,由于随机生成分布很难与真实分布有可忽略的重叠以及JS散度的突变特性,使得生成器面临梯度消失的问题 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,814
精华内容 9,925
热门标签
关键字:

帧生成时间不稳定