帧同步总结

照着助教大哥给的demo重写了半个多月的帧同步,觉得收获还是蛮大的,学了一些设计模式和接口的巧妙设计。虽然是照着写的,坑趟的也不少。记录下自己的收获把。

帧同步:

        由服务器发来的帧作为驱动,来使逻辑跑起来,同时显示是由u3d自带的update驱动,为了使逻辑与显示尽量平滑,这里都用时间作为计算标准。

    本质:对于每个客户端,相同的输入有相同的输出。


一丶人物相关:

      1.驱动的逻辑:

       手动的将显示,逻辑分离出来。

       显示由U3D的update驱动(传入时间来用作计算),逻辑由服务器的Frame帧来作为驱动,这个帧也是有固定帧数的,所以也可以用时间来算位移,尽量使显示位置和逻辑位置保持一致,使显示平滑。

       2.旋转:

        这个当时我自己做demo的时候做的感觉就很不好,这次旋转是直接由y轴来决定旋转,并由lerp插值使其平滑(或者控制旋转速度)

        3.动作切换:

        这次的动作全部是按照帧的方式来算,计算这个动作需要跑多少帧,去查动画有多少帧,手动写入配置中。

        4.监听按键:

        人物继承OnMove(自己实现)的接收移动的信息。每个人物都有uid,当服务器发来时,调用每个接口的移动.(uid由开始时分配)

二丶帧的概念:

        所有与逻辑相关的计算,都要与帧做联系,这里的联系只是驱动,而非拿帧的个数来作为计算标准,而是以每帧固定的时间来作为计算标准。

三丶网络:(   这个部分是收获最大的。)

        客户端部分:

          1.有一个在socket之上封装了一层的TcpClient类,它的官网解释是为了方便时刻控制网络连接状态。

比如 BeginConnect,与        EndConnect(iar); 可以控制当前连接到的状态。是开始状态还是已经建立好连接状态。

当然这之后。

          2.protobuf   : (虽然我之前写了不少。这里还是记录下。这坑趟的死去活来)

            1)客户端protobuf和服务器的protobuf 引入的dll必须相同。否则在一些复杂的关系类型上会有解析错的时候。

            2) 在反序列化的时候,如果用数字,要开辟同字节大小的数字,否则会解析错。 若用memoryStream解析,将所有字节写入之后,要把stream.position Set为0。

            3)这里自己还测了测map 和list等实现,记录在上面几篇了,这里就不写了。

         3.protocol的设计方式:可以设计为decorator模式(这里阿里曾经问过我,当时就很尬尬,这次写了下,感觉还好。)

        服务器部分:(我是C#实现的)

        1.定时器: 尝试了下各种定时器,但是由于我们游戏要精确的毫秒级别,定时器时间差的太大,所以老老实实的用了New Thread   + Sleep (这个坑测的死去活来。导致了客户端部分 显示与逻辑不平滑,显示总会被逻辑拉回来)

附上git:      https://github.com/ycb577114589/u3dFrameBase


        这个部分是收获最大的。

猜你喜欢

转载自blog.csdn.net/qq_33951440/article/details/80662651
今日推荐