腾讯 客户端二面

1. charachterMoveMent部分的同步源码看过吗?

UE引擎中的角色移动同步采用客户端预测 + 服务器权威的模式:

客户端:执行本地预测移动,提供即时反馈

服务器:作为权威,验证移动是否有效

核心同步流程

客户端输入处理
void UCharacterMovementComponent::TickComponent(float DeltaTime, ...)  
{  
    // 处理输入并生成移动数据  
    if (CharacterOwner->IsLocallyControlled())  
    {  
        // 创建移动数据  
        FSavedMove_Character* NewMove = CreateSavedMove();  
        NewMove->SetMoveFor(CharacterOwner, DeltaTime, Acceleration, *PendingMove);  
        
        // 发送到服务器  
        CallServerMove();  
    }  
}  
C++
服务器移动RPC
void UCharacterMovementComponent::ServerMove_Implementation(  
    float TimeStamp,  
    FVector_NetQuantize10 InAccel,  
    FVector_NetQuantize100 ClientLoc,  
    uint8 CompressedMoveFlags,  
    uint8 ClientRoll,  
    uint32 View,  
    UPrimitiveComponent* ClientMovementBase,  
    FName ClientBaseBoneName,  
    uint8 ClientMovementMode)  
{  
    // 验证移动  
    // 执行实际移动  
    // 纠正客户端(如有必要)  
}  

//需要纠正时
void UCharacterMovementComponent::ClientAdjustPosition_Implementation(  
    float TimeStamp,  
    FVector NewLocation,  
    FVector NewVelocity,  
    UPrimitiveComponent* NewBase,  
    FName NewBaseBoneName,  
    bool bHasBase,  
    bool bBaseRelativePosition,  
    uint8 ServerMovementMode)  
{  
    // 更新客户端位置至服务器权威位置  
}  
C++
关键技术细节
  1. 移动压缩与序列化(SerializeCompressedShort

  2. 客户端预测与重放(等待服务器响应时会维护一个移动队列

TArray<FSavedMovePtr> PendingMoves;  // 等待服务器确认的移动  

// 当收到服务器纠正时  
void UCharacterMovementComponent::ClientAdjustPosition_Implementation(...)  
{  
    // 应用服务器纠正  
    // 重新应用PendingMoves以平滑过渡  
    for (int32 i=0; i<PendingMoves.Num(); i++)  
    {  
        const FSavedMove_Character* Move = PendingMoves[i].Get();  
        MoveAutonomous(...); // 重新应用移动  
    }  
}  
C++

3.网络带宽优化

  • 量化向量(FVector_NetQuantize)

  • 移动标志压缩(CompressedMoveFlags)

  • 只发送变化的属性

  • 批量移动处理(ClientMoveResponsePackedBits)

实际应用示例

以玩家前进为例,整个同步流程是:

  1. 客户端按下W键,本地角色立即开始移动

  2. 客户端发送ServerMove RPC给服务器

  3. 服务器验证移动是否合法(如检查速度、碰撞等)

  4. 服务器更新自己维护的角色位置

  5. 如果客户端预测有误,服务器发送ClientAdjustPosition纠正客户端

2. 用GAS框架遇到过哪些问题?改动过哪些内容?

3. 客户端预测有了解过吗?

4. 讲下项目的DS服务器职责

5. 讲下RPC

6. UE的navigation怎么实现的?

7. 讲下A* 算法

8. AI是怎么设计的? 遇到过小怪围住转身朝向的问题吗?

9. 顿帧和击飞怎么实现的,是给一个力吗?

10. 看过Slate的源码实现吗?

11. 客户端发送的时候怎么知道这次发送一定会发过去?

12. 项目中有用到右值引用吗?

13. combo连击怎么做的?

文章作者: 周几
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 周几小屋
喜欢就支持一下吧