Documentation

Networking

Π‘Π΅Ρ‚Π΅Π²ΠΎΠ΅ взаимодСйствиС Π² Wudgine позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΈΠ³Ρ€Ρ‹ с синхронизированным ΠΈΠ³Ρ€ΠΎΠ²Ρ‹ΠΌ процСссом ΠΈ Π½ΠΈΠ·ΠΊΠΎΠΉ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ.

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² сСтСвоС взаимодСйствиС

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΈΠ³Ρ€ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠΉ ΠΈ эффСктивной сСтСвой инфраструктуры. Wudgine прСдоставляСт ΠΌΠΎΡ‰Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ инструмСнтов для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² сСтСвого взаимодСйствия, ΠΎΡ‚ простых ΠΏΠΎΡˆΠ°Π³ΠΎΠ²Ρ‹Ρ… ΠΈΠ³Ρ€ Π΄ΠΎ слоТных ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΌΠΈΡ€ΠΎΠ² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

АрхитСктура ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСр

Wudgine ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΊΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСр для ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΈΠ³Ρ€, Π³Π΄Π΅ сСрвСр являСтся Π°Π²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹ΠΌ источником состояния ΠΈΠ³Ρ€Ρ‹.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹

  • Π‘Π΅Ρ€Π²Π΅Ρ€ β€” Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΠ·Π΅Π», ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ состояниСм ΠΈΠ³Ρ€Ρ‹
  • ΠšΠ»ΠΈΠ΅Π½Ρ‚ β€” ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΊ сСрвСру ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ ΠΌΠΈΡ€
  • Π‘Π΅Ρ‚Π΅Π²ΠΎΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ β€” управляСт соСдинСниями ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ Π΄Π°Π½Π½Ρ‹Ρ…
  • БСриализация β€” ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ³Ρ€ΠΎΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Π΄Π°Π½Π½Ρ‹Π΅ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ сСрвСра

#include "Wudgine/Networking/Server.hpp"

// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ сСрвСра
Wudgine::Networking::Server server;

// Настройка ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²
server.SetMaxClients(16);
server.SetTickRate(60); // 60 ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ Π² сСкунду

// ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ событий
server.OnClientConnected([](Wudgine::Networking::ClientID clientID) {
    std::cout << "ΠšΠ»ΠΈΠ΅Π½Ρ‚ " << clientID << " ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΡΡ" << std::endl;
    
    // ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ состояния ΠΈΠ³Ρ€Ρ‹
    SendInitialGameState(clientID);
});

// Запуск сСрвСра
if (server.Start(27015)) {
    std::cout << "Π‘Π΅Ρ€Π²Π΅Ρ€ Π·Π°ΠΏΡƒΡ‰Π΅Π½ Π½Π° ΠΏΠΎΡ€Ρ‚Ρƒ 27015" << std::endl;
}

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°

#include "Wudgine/Networking/Client.hpp"

// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°
Wudgine::Networking::Client client;

// ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ событий
client.OnConnected([]() {
    std::cout << "ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ сСрвСру установлСно" << std::endl;
});

// ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ сСрвСру
if (client.Connect("127.0.0.1", 27015)) {
    std::cout << "ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ сСрвСру..." << std::endl;
}

Бинхронизация состояния ΠΈΠ³Ρ€Ρ‹

Одна ΠΈΠ· ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΈΠ³Ρ€Π°Ρ… β€” синхронизация состояния ΠΈΠ³Ρ€Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ сСрвСром ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌΠΈ.

БСриализация ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ECS

// Π‘Π΅Ρ‚Π΅Π²ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для синхронизации
struct NetworkTransformComponent : public Wudgine::ECS::Component, 
                                  public Wudgine::Core::Serializable {
    Wudgine::Math::Vector3 position;
    Wudgine::Math::Quaternion rotation;
    Wudgine::Math::Vector3 scale;
    
    // ΠœΠ΅Ρ‚ΠΎΠ΄ сСриализации для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΏΠΎ сСти
    void Serialize(Wudgine::Core::ByteBuffer& buffer) const override {
        buffer.Write(position);
        buffer.Write(rotation);
        buffer.Write(scale);
    }
    
    // ΠœΠ΅Ρ‚ΠΎΠ΄ дСсСриализации для ΠΏΡ€ΠΈΠ΅ΠΌΠ° ΠΏΠΎ сСти
    void Deserialize(Wudgine::Core::ByteBuffer& buffer) override {
        buffer.Read(position);
        buffer.Read(rotation);
        buffer.Read(scale);
    }
};

ΠŸΡ€Π΅Π΄ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΠΈ интСрполяция

Для обСспСчСния ΠΏΠ»Π°Π²Π½ΠΎΠ³ΠΎ ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ³ΠΎ процСсса ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ сСтСвых Π·Π°Π΄Π΅Ρ€ΠΆΠ΅ΠΊ Wudgine прСдоставляСт ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ прСдсказания ΠΈ интСрполяции.

ΠŸΡ€Π΅Π΄ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°

// БистСма прСдсказания двиТСния
class MovementPredictionSystem : public Wudgine::ECS::System {
public:
    void Update(float deltaTime) override {
        auto view = GetWorld()->GetRegistry().view<NetworkTransformComponent, InputComponent>();
        
        view.each([deltaTime](auto entity, NetworkTransformComponent& transform, InputComponent& input) {
            // ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ локального Π²Π²ΠΎΠ΄Π° Π΄ΠΎ получСния подтвСрТдСния ΠΎΡ‚ сСрвСра
            if (input.moveForward) {
                transform.position += transform.rotation * Wudgine::Math::Vector3::Forward() * MOVE_SPEED * deltaTime;
            }
            
            // Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ прСдсказанного состояния
            m_PredictedStates[entity].push_back({transform, GetWorld()->GetTime()});
        });
    }
};

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π·Π°Π΄Π΅Ρ€ΠΆΠ΅ΠΊ ΠΈ ΠΏΠΎΡ‚Π΅Ρ€ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²

Wudgine прСдоставляСт ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сСтСвых ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΈ ΠΏΠΎΡ‚Π΅Ρ€ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ².

НадСТная доставка

// ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠ³ΠΎ сообщСния
void SendReliableMessage(Wudgine::Networking::ClientID clientID, const GameEvent& event) {
    Wudgine::Core::ByteBuffer buffer;
    
    // БСриализация события
    buffer.Write(static_cast<uint8_t>(event.type));
    event.Serialize(buffer);
    
    // ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° с Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠ΅ΠΉ доставки
    m_Server.SendReliable(clientID, buffer);
}

ΠœΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСрвСрной части

Для создания ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΈΠ³Ρ€ Wudgine прСдоставляСт инструмСнты для распрСдСлСния Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ.

Π—ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠΈΡ€Π°

// ΠœΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ Π·ΠΎΠ½
class ZoneManager {
public:
    // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π·ΠΎΠ½
    void Initialize(const Wudgine::Math::Vector2& worldSize, const Wudgine::Math::Vector2& zoneSize) {
        m_WorldSize = worldSize;
        m_ZoneSize = zoneSize;
        
        // ВычислСниС количСства Π·ΠΎΠ½
        int zonesX = static_cast<int>(std::ceil(worldSize.x / zoneSize.x));
        int zonesY = static_cast<int>(std::ceil(worldSize.y / zoneSize.y));
        
        // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π·ΠΎΠ½
        m_Zones.resize(zonesX * zonesY);
    }
};

Π§Ρ‚ΠΎ дальшС?

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΈΠ³Ρ€ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ особого внимания ΠΊ бСзопасности. ВсСгда провСряйтС входящиС Π΄Π°Π½Π½Ρ‹Π΅ Π½Π° сСрвСрС ΠΈ Π½Π΅ довСряйтС Π΄Π°Π½Π½Ρ‹ΠΌ, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌ ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ².

Wudgine β€’ Β© 2025