Trang chủ / Blog / Multiplayer Networking Trong Game: Từ Cơ...
Programming 30/04/2026 12 phút đọc

Multiplayer Networking Trong Game: Từ Cơ Bản Đến Nâng Cao

Tìm hiểu networking trong game multiplayer từ cơ bản đến nâng cao - client-server, P2P, state sync, lag compensation, Photon, Mirror.

L
LamGame Game Developer & Writer

Multiplayer Networking Trong Game: Hướng Dẫn Toàn Diện Từ Cơ Bản Đến Nâng Cao

Multiplayer là một trong những tính năng phức tạp nhất trong game development, nhưng cũng là tính năng mang lại giá trị cao nhất cho người chơi. Từ các game casual như Among Us đến các game competitive như Valorant, networking là nền tảng quyết định trải nghiệm multiplayer. Bài viết này sẽ giúp bạn hiểu rõ các khái niệm cốt lõi và lựa chọn giải pháp phù hợp cho dự án game của mình. Tham khảo thêm các dự án multiplayer mẫu tại kho source game LamGame.

1. Kiến Trúc Mạng: Client-Server vs Peer-to-Peer

Client-Server là kiến trúc phổ biến nhất trong game multiplayer hiện đại. Trong mô hình này, một server trung tâm (authoritative server) quản lý toàn bộ game state. Client gửi input đến server, server xử lý logic, cập nhật state, và gửi kết quả về cho tất cả client. Ưu điểm lớn nhất của client-server là khả năng chống gian lận vì server kiểm soát mọi thứ. Nhược điểm là chi phí vận hành server và latency phụ thuộc vào khoảng cách giữa client và server.

Có hai biến thể chính của client-server: Dedicated ServerListen Server. Dedicated server chạy trên máy chủ riêng, không có player nào chơi trực tiếp trên đó - đây là lựa chọn tốt nhất cho competitive game. Listen server là khi một player đồng thời đóng vai trò server - phù hợp cho co-op game hoặc game casual với số lượng player nhỏ.

Peer-to-Peer (P2P) là kiến trúc mà các client kết nối trực tiếp với nhau mà không cần server trung tâm. P2P giảm chi phí infrastructure nhưng khó chống gian lận và gặp vấn đề NAT traversal. P2P phù hợp cho game turn-based, fighting game 1v1, hoặc game LAN party. Nhiều game hiện đại sử dụng hybrid approach: P2P cho data transfer nhưng có một relay server để hỗ trợ NAT traversal và matchmaking.

2. State Synchronization

Đồng bộ game state giữa server và client là thách thức cốt lõi của multiplayer networking. Có hai phương pháp chính:

Snapshot Interpolation: Server gửi toàn bộ game state (snapshot) đến client theo interval cố định (thường 20-60 lần/giây). Client nhận snapshot và interpolate giữa hai snapshot gần nhất để tạo chuyển động mượt mà. Phương pháp này đơn giản, dễ implement, và hoạt động tốt cho hầu hết game types. Nhược điểm là bandwidth usage cao khi có nhiều entity và client luôn hiển thị state cũ hơn server một khoảng thời gian bằng interpolation delay.

State Delta Compression: Thay vì gửi toàn bộ snapshot, server chỉ gửi những thay đổi (delta) so với snapshot trước đó. Điều này giảm đáng kể bandwidth usage, đặc biệt trong game có nhiều entity nhưng chỉ một phần nhỏ thay đổi mỗi frame. Kỹ thuật này phức tạp hơn vì cần xử lý packet loss - nếu một delta packet bị mất, client không thể reconstruct state chính xác. Giải pháp là sử dụng acknowledgment system và gửi delta so với snapshot cuối cùng mà client đã xác nhận nhận được.

3. Lag Compensation Và Client-Side Prediction

Latency (độ trễ mạng) là vấn đề không thể tránh khỏi trong multiplayer game. Với latency trung bình 50-100ms, nếu không có lag compensation, player sẽ cảm thấy game phản hồi chậm và không chính xác. Có ba kỹ thuật chính để xử lý lag:

Client-Side Prediction: Client không đợi server xác nhận mà tự simulate kết quả của input ngay lập tức. Khi nhận được response từ server, client so sánh predicted state với authoritative state. Nếu khớp, mọi thứ ổn. Nếu không khớp, client phải reconcile bằng cách rollback về server state và re-simulate tất cả input chưa được server xác nhận. Đây là kỹ thuật quan trọng nhất cho responsive gameplay.

// Pseudo-code cho Client-Side Prediction
public class NetworkPlayer
{
    private Queue<InputData> pendingInputs = new Queue<InputData>();
    private uint lastAcknowledgedInput;

    void ProcessLocalInput(InputData input)
    {
        // 1. Gửi input đến server
        SendToServer(input);
        // 2. Lưu input vào pending queue
        pendingInputs.Enqueue(input);
        // 3. Apply input ngay lập tức (prediction)
        ApplyInput(input);
    }

    void OnServerStateReceived(ServerState state)
    {
        // 1. Set position về server authoritative state
        transform.position = state.position;
        lastAcknowledgedInput = state.lastProcessedInput;
        // 2. Xóa các input đã được server xử lý
        while (pendingInputs.Count > 0
            && pendingInputs.Peek().sequence <= lastAcknowledgedInput)
            pendingInputs.Dequeue();
        // 3. Re-apply pending inputs (reconciliation)
        foreach (var input in pendingInputs)
            ApplyInput(input);
    }
}

Server Reconciliation: Là phần bổ sung của client-side prediction. Khi server gửi authoritative state về, client rollback và re-simulate để đảm bảo consistency. Quá trình này phải diễn ra trong một frame để player không nhận thấy.

Entity Interpolation: Đối với các entity khác (other players, NPCs), client không predict mà interpolate giữa hai server state gần nhất. Điều này tạo ra chuyển động mượt mà nhưng có nghĩa là bạn luôn nhìn thấy other players ở vị trí trong quá khứ. Interpolation delay thường là 100-200ms, tùy thuộc vào server tick rate.

4. So Sánh Các Networking Solution Phổ Biến

Trong hệ sinh thái Unity, có nhiều networking solution khác nhau, mỗi cái phù hợp với use case riêng:

Photon (PUN 2 / Fusion): Giải pháp thương mại phổ biến nhất cho Unity multiplayer. Photon cung cấp cloud infrastructure sẵn có, matchmaking, và relay server. PUN 2 (Photon Unity Networking) dễ sử dụng, phù hợp cho game casual và mid-core. Photon Fusion là thế hệ mới hơn, hỗ trợ cả client-hosted và dedicated server mode với tick-based simulation. Photon có free tier cho 20 CCU (concurrent users) và pricing theo CCU cho các tier cao hơn.

Mirror: Fork mã nguồn mở từ UNet (Unity deprecated networking). Mirror là lựa chọn tuyệt vời cho game cần dedicated server hoặc listen server. Hỗ trợ nhiều transport layer (KCP, Telepathy, WebSocket) và có API đơn giản với SyncVar, Command, ClientRpc. Mirror hoàn toàn miễn phí và có cộng đồng active trên Discord. Phù hợp cho MMO, survival game, hoặc bất kỳ game nào cần authoritative server.

Netcode for GameObjects (NGO): Giải pháp networking chính thức từ Unity. NGO tích hợp tốt với Unity ecosystem và được Unity hỗ trợ dài hạn. Hỗ trợ cả client-hosted và dedicated server thông qua Unity Game Server Hosting (Multiplay). Tuy nhiên, NGO vẫn đang trong quá trình phát triển và có ít tính năng hơn so với Photon hoặc Mirror.

Tiêu chí Photon Fusion Mirror NGO
Giá Free 20 CCU, trả phí theo CCU Miễn phí (MIT) Miễn phí
Server model Cloud hosted / Self-hosted Self-hosted Cloud / Self-hosted
Độ khó Trung bình Trung bình Trung bình - Khó
Phù hợp Casual, mid-core, competitive MMO, survival, co-op Mọi thể loại
Cộng đồng Lớn, documentation tốt Active, Discord support Đang phát triển

5. Bandwidth Optimization

Bandwidth là tài nguyên quý giá, đặc biệt trên mobile network. Các kỹ thuật tối ưu bandwidth bao gồm: Quantization - giảm precision của float values, ví dụ position chỉ cần 2 decimal places thay vì full float precision. Bit packing - pack nhiều giá trị nhỏ vào ít bytes hơn, ví dụ health (0-100) chỉ cần 7 bits thay vì 32 bits. Interest management - chỉ gửi data về các entity trong phạm vi quan sát của player, không gửi toàn bộ world state. Priority system - entity gần player được update thường xuyên hơn entity ở xa.

6. Xử Lý Disconnect Và Reconnect

Mất kết nối là điều không thể tránh khỏi, đặc biệt trên mobile. Game cần xử lý gracefully khi player disconnect: lưu player state trên server, cho phép reconnect trong khoảng thời gian nhất định, và thông báo cho các player khác. Implement heartbeat system để phát hiện disconnect sớm - client gửi ping packet định kỳ, nếu server không nhận được trong timeout period thì đánh dấu player là disconnected.

7. Security Trong Multiplayer Game

Chống gian lận là thách thức lớn trong multiplayer game. Nguyên tắc vàng là never trust the client - mọi game logic quan trọng phải chạy trên server. Client chỉ gửi input, không gửi kết quả. Server validate mọi action: kiểm tra tốc độ di chuyển có hợp lệ không, damage có đúng không, cooldown có được respect không. Sử dụng server-side hit detection cho shooting game thay vì tin tưởng client report. Encrypt network traffic để ngăn packet sniffing và tampering.

Multiplayer networking là một lĩnh vực rộng lớn và phức tạp, nhưng với các foundation đúng đắn, bạn có thể xây dựng trải nghiệm multiplayer tuyệt vời. Hãy bắt đầu với một giải pháp đơn giản như Photon PUN cho prototype, sau đó migrate sang giải pháp phức tạp hơn khi cần. Nếu bạn quan tâm đến vị trí network programmer trong ngành game, hãy xem các cơ hội việc làm game tại LamGame.

Bài viết hữu ích?
Chia sẻ:
FB X TG
L

LamGame

Game Developer & Technical Writer tại LamGame.vn. Chia sẻ kiến thức về game development, Unity, AI tools cho cộng đồng developer Việt Nam.

Đọc thêm bài viết hay

Khám phá kiến thức game dev, tips & tricks từ cộng đồng

← Về trang Blog