private void RollBackEntityIfNeed(GameContext context, GameContext serverContext, IMatcher <GameEntity> matcher,
                                      TakeKeyMethod takeKeyMethod, RollBackMethod rollBackMethod)
    {
        var serverEntities = new List <GameEntity>(serverContext.GetEntities(matcher));
        var localEntities  = new List <GameEntity>(context.GetEntities(matcher));

        foreach (var serverEntity in serverEntities)
        {
            if (serverEntity.isDestroyed)
            {
                continue;
            }

            bool FindPredicate(GameEntity x) => takeKeyMethod(x) == takeKeyMethod(serverEntity);

            var localEntity = localEntities.Find(FindPredicate);
            if (localEntity == null ||
                !CompareEntityUtility.Equals(localEntity, serverEntity, localBuffer, serverBuffer))
            {
                localEntity = rollBackMethod(_context, localEntity, serverEntity);
                if (localEntity.isMover)
                {
                    Debug.LogWarningFormat(
                        $"Mover校验失败,进行覆盖 ID: {localEntity.moverID.value} curTick: {_backGameContext.tick.CurrentTick}");
                }
                else if (localEntity.hasIce)
                {
                    Debug.LogWarningFormat(
                        $"Ice校验失败,进行覆盖 Owner:{localEntity.ice.Owner} curTick: {_backGameContext.tick.CurrentTick}");
                }
            }

            localEntity.isWasSynced = true;
        }
    }
    private bool SameEntices(IMatcher <GameEntity> matcher, TakeKeyMethod takeKeyMethod,
                             GameContext backGameContext, GameContext tmpGameContext)
    {
        var serverEntices = new List <GameEntity>(backGameContext.GetEntities(matcher));
        var localEntices  = new List <GameEntity>(tmpGameContext.GetEntities(matcher));

        foreach (var serverEntity in serverEntices)
        {
            if (serverEntity.isDestroyed)
            {
                continue;
            }

            bool FindPredicate(GameEntity x) => takeKeyMethod(x) == takeKeyMethod(serverEntity);

            var localEntity = localEntices.Find(FindPredicate);
            if (localEntity == null)
            {
                return(false);
            }

            if (!CompareEntityUtility.Equals(localEntity, serverEntity, localBuffer, serverBuffer))
            {
                return(false);
            }
        }

        return(true);
    }