幀同步 皇室戰爭,物理幀 和渲染幀


物理幀和渲染幀分開,目的就是確保 邏輯的 同步性,ab兩個客戶端 pk,手機性能不一樣,雖然服務端同時發送,但不能因為a手機配置低,卡了,導致跟不上。

雖然 做了跳幀處理,但加速  不一定要讓渲染幀也加速,否則 手機 性能更不上,還是卡。所以必須讓 邏輯渲染分開。

邏輯幀 一秒 6--10次,渲染幀 一秒 60.目前安卓是這樣,蘋果可能是30.

如果把 人物角色放在 邏輯幀里,那么 動作看起來就不流暢,所以要放到 渲染幀里面,具體如下。

    void OnSetPK()
    {        
        //////////////////////////////////////////////////////////////////////////// 
        ////////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////// 
        int count = GModel.getInstance.list.Count;
        //添加  英雄
        for (int i = 0; i < count; i++)
        {
            hero hr = GModel.getInstance.list[i];
            hr.OnAddHero();//添加英雄 
        }
        //////////////////////////////////////////////////////////////////////////// 
        ////////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////// 
        int counts = GModel.getInstance.list.Count;// 
       //刪除 沒有血英雄
        for (int i = 0; i < counts; i++)
        {
            hero hr = GModel.getInstance.list[i];
            hr.OnDestroyHero();//刪除英雄
        }
        //////////////////////////////////////////////////////////////////////////// 
        ////////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////// 
        int countt = GModel.getInstance.list.Count;// 
        //處理邏輯英雄
        for (int i = 0; i < countt; i++)
        {
            hero hr = GModel.getInstance.list[i];
            hr.OnFrame();//處理英雄
        }

創建英雄  刪除英雄 英雄邏輯處理,必須是在 邏輯幀里面 統一管理。

先 查看  當前幀 有沒有需要 創建的,其次是血量不夠要刪除的,最后是 現有的 英雄邏輯處理。

 

在英雄對象 里面,要做一個 跟蹤。因為邏輯幀不流暢,放到update里面做,不知道下一步位置,那么就要用 跟蹤方式。

    void Update()
    {
        float newPositionX = Mathf.SmoothDamp(transform.position.x, vec.x, ref xVelocity, smoothTime);
        float newPositionY = Mathf.SmoothDamp(transform.position.y, vec.y, ref yVelocity, smoothTime);
        transform.position = new Vector3(newPositionX, newPositionY, 11);
    }

大概如上,這樣只要跟的緊,不會讓 玩家看出 有沒有碰到。

最后效果如圖,拖拽后,前面是    白色后面是彩色卡牌,白色卡牌 是邏輯幀,只要碰撞就可,現在顯示為了大家看清。

后面的彩色卡牌是 渲染幀里面執行。可以發現,白色 每次一大步,但看起來卡,彩色每次一小步但流暢。玩家到時 只看到彩色。但發生碰撞或邏輯,

程序都按白色卡牌來計算,他們 走的 很近,誤差忽略不計,也可以通過速度調整,讓更快的 移動能跟的 更近。這樣,就算手機卡,我可以關閉渲染幀,邏輯跳幀繼續執行,然后等跳幀結束,我再打開渲染幀,那時渲染幀 雖然離 邏輯幀 更遠,但他只執行 最后 目標,所以 很快就 看起來自然了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM