ПроектыФорумСобираю команду

Мультиплеер (С++)

#0
18:03, 6 апр 2026

Нужен программист С++ (boost:asio, winsock2);
У нас уже есть готовая игра, но нет нормального мультиплеера.
Машинки лагают, особенно когда больше 3 игроков.

Запустить видео по клику - Как делать игрыЗапустить видео по клику - Как делать игры

Пример исходного кода (по синхронизации машин)

if (stream.isReading() && !(owner() && _net->isClient()) && !_player->GetFinished())
  {
    _dAlpha = 1.0f;
    
    D3DXVECTOR3 dPos = pos - car->GetPxActor().GetPos();    
    float dPosLength = D3DXVec3Length(&dPos);
    if (dPosLength > 4.0f)
    {
      car->SetPosSync(pos - car->GetGrActor().GetPos());
      car->GetPxActor().SetPos(pos);
    }
    else if (dPosLength > 0.1f)
      linVel += dPos * 2.0f * car->GetNxActor()->getMass();*/

    D3DXQUATERNION dRot;
    QuatRotation(dRot, car->GetGrActor().GetRot(), rot);
    D3DXVECTOR3 dRotAxis;
    float dRotAngle;
    D3DXQuaternionToAxisAngle(&dRot, &dRotAxis, &dRotAngle);
    if (abs(dRotAngle) > D3DX_PI/24)
    {
      car->GetPxActor().SetRot(rot);
      car->SetRotSync(dRot);
    }

    car->GetNxActor()->setLinearMomentum(NxVec3(linVel));
    car->GetNxActor()->setAngularMomentum(NxVec3(angVel));
    
    car->SetMoveCar((GameCar::MoveCarState)moveState);    
    car->SetSteerWheel((GameCar::SteerWheelState)steerState);
    car->SetSteerWheelAngle(steerWheelsAngle);
  }

Telegram: @aspect337
Discord: https://discord.gg/NRBGnjJrWg

#1
(Правка: 20:24) 20:20, 6 апр 2026

Насколько я понял - у вас проблема в том, что машина пытается ехать своим ходом, что приводит к жуткому рассинхрону между клиентами, т.к. двигать физикой один и тот же объект на разных устройствах тупиковый путь - они никогда не будут совпадать))

Нужна какая-то точка синхронизации.
Навскидку приходит такое решение, что игроки передают свой ввод, а все вычисления происходят в 1 месте. Это может быть один из игроков. Остальные должны получать пакетированный таймлайн движения всех машин.

#2
12:58, 9 апр 2026

По примеру кода понятно, что вычисление позиции происходит без таймера, или скорее всего с фиксированным таймером внутри некой tick, так как в расчете движение нет короктироваки на время с прошедшего тика... поэтому код мусор и нужно переписывать полностью (как же без этого), и сихронизировать таймер между клиентами и буфер команд чтобы каждый клиент смог вычислить положение сцены сам а не вычилсять отклонение ping и т.д., и делать это нужно в отдельном потоке так как я подозреваю что car в car->GetPxActor().GetPos() это объект редеринга, и коли нет ни одного лока - это всё один поток render.

ПроектыФорумСобираю команду