ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

服务器客户端同步 之 关于跳帧问题

2019-08-21 11:57:39  阅读:203  来源: 互联网

标签:getInstance LogicalFrame Frame GameModel 服务器 跳帧 客户端


网上有很多同步方案, 我看了下,都比较麻烦,新人也看不懂,老人也不要看。于是我简单写了一下,方便大家快速上手。

做之前,服务端 必须是udp 通讯,这个我不多解释,我用的是lidgren 通讯框架,不知道的,可以看我过去的文章。

代码思路,服务器每秒 发一次,可以用线程做。

  public static void Confrontation()
        {
            while (true)
            {
                Thread.Sleep(1000);
                Output("目前" + Frame);
                List<NetConnection> all = s_server.Connections; // get copy
                //   all.Remove(msg.SenderConnection);
                if (all.Count > 0)
                {
                    NetOutgoingMessage om = s_server.CreateMessage();
                    JsonDatas message = new JsonDatas();
                    message.jsons["type"] = "5";
                    message.jsons["msg"] = Frame;
                    string json = JsonConvert.SerializeObject(message);
                    om.Write(json);
                    s_server.SendMessage(om, all, NetDeliveryMethod.ReliableOrdered, 0);
                }
                if (Frame%7==0)
                {
                    Frame += 2;
                }
                else
                {
                    Frame++;
                }
            }
        }

这个是 线程里面的方法,all是代表所有在线 用户 套接字端口。 数据是 json格式,方便客户端判断。Frame是 帧,每秒加1,最后我 Frame%7 是为了方便 跳帧测试,也就是说,到7倍数帧时候,我的帧 不是 加1,而是加2,让客户端 来判断,需要跳帧。

 

再看看客户端,因为客户端 在 updata里面是 一秒60帧,我把他变成 一秒10帧。类似

 if (GameModel.getInstance().Rate == 6)
        {
            GameModel.getInstance().Rate = 0;
}   GameModel.getInstance().Rate++;

然后,我把服务器发过来的 Frame乘以  10;对应起来;

客户端逻辑处理有三个方式,等待,正常运行,跳帧。

等待是因为 客户端执行完毕所有帧,服务端帧还没过来,这个时候需要等待,也可以做暂停。

跳帧是  通过判断 客户端帧 和 服务端帧 差 大于 10帧。 那么就 遍历,使得快速 让 客户端和服务端差距只有 10帧以内。

最后结果:  前面数据是  客户端当前帧,后面是 服务端帧

结尾等待是 我把服务器关了,客户端自然等待了。

最后代码:非常短

    void Update()
    {
        if (FrameBool && GameModel.getInstance().LogicalFrame > 0)
        {
            Frame = GameModel.getInstance().LogicalFrame;
            FrameBool = false;
        }
        if (FrameBool == false)
        {
            OnSetShaderFrame();
        }
    }

    //总负责 战斗 逻辑处理
    public void OnSetShaderFrame()
    {
        if (GameModel.getInstance().Rate == Rate)
        {
            GameModel.getInstance().Rate = 0;

            if (GameModel.getInstance().LogicalFrame == Frame)//帧相同,客户端等待
            {
                Debug.Log("-><color=#E88748>" + Frame + "客户端等待 " + GameModel.getInstance().LogicalFrame + "</color>");
            }
            else
            {
                Debug.Log("-><color=#90E848>" + Frame + "逻辑帧 " + GameModel.getInstance().LogicalFrame + "</color>");
                Frame++;//执行完毕 帧加一

                if (GameModel.getInstance().LogicalFrame - Frame > 7)//超过1秒 ,6帧 一秒
                {
                    for (int i = 0; i < (GameModel.getInstance().LogicalFrame - Frame); i++)//保留当前6帧,其他跳帧
                    {
                        Debug.Log("-><color=#E84848>" + Frame + "跳帧执行 " + GameModel.getInstance().LogicalFrame + "</color>");
                        Frame++;//执行完毕 帧加一
                    }
                }
            }

        }
        GameModel.getInstance().Rate++;
    }

祝大家好运!

标签:getInstance,LogicalFrame,Frame,GameModel,服务器,跳帧,客户端
来源: https://www.cnblogs.com/big-zhou/p/11387886.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有