Optimize network transform replication

This commit is contained in:
Wojtek Figat
2024-10-15 11:24:10 +02:00
parent c202a639cf
commit ac832a0e81
3 changed files with 33 additions and 5 deletions

View File

@@ -157,6 +157,7 @@ void NetworkTransform::Serialize(NetworkStream* stream)
// Encode data
Data data;
Platform::MemoryClear(&data, sizeof(data));
data.LocalSpace = LocalSpace;
data.HasSequenceIndex = Mode == ReplicationModes::Prediction;
data.Components = Components;
@@ -195,8 +196,7 @@ void NetworkTransform::Serialize(NetworkStream* stream)
}
if (EnumHasAllFlags(data.Components, ReplicationComponents::Rotation))
{
const Float3 rotation = transform.Orientation.GetEuler();
stream->Write(rotation);
stream->Write(transform.Orientation);
}
else if (EnumHasAnyFlags(data.Components, ReplicationComponents::Rotation))
{
@@ -260,9 +260,7 @@ void NetworkTransform::Deserialize(NetworkStream* stream)
}
if (EnumHasAllFlags(data.Components, ReplicationComponents::Rotation))
{
Float3 rotation;
stream->Read(rotation);
transform.Orientation = Quaternion::Euler(rotation);
stream->Read(transform.Orientation);
}
else if (EnumHasAnyFlags(data.Components, ReplicationComponents::Rotation))
{

View File

@@ -3,6 +3,7 @@
#include "NetworkStream.h"
#include "INetworkSerializable.h"
#include "Engine/Core/Math/Quaternion.h"
#include "Engine/Core/Math/Transform.h"
// Quaternion quantized for optimized network data size.
struct NetworkQuaternion
@@ -151,6 +152,20 @@ void NetworkStream::Read(Quaternion& data)
NetworkQuaternion::Read(this, data);
}
void NetworkStream::Read(Transform& data)
{
struct NonQuantized
{
Vector3 Pos;
Float3 Scale;
};
NonQuantized nonQuantized;
ReadBytes(&nonQuantized, sizeof(nonQuantized));
NetworkQuaternion::Read(this, data.Orientation);
data.Translation = nonQuantized.Pos;
data.Scale = nonQuantized.Scale;
}
void NetworkStream::Write(INetworkSerializable& obj)
{
obj.Serialize(this);
@@ -166,6 +181,19 @@ void NetworkStream::Write(const Quaternion& data)
NetworkQuaternion::Write(this, data);
}
void NetworkStream::Write(const Transform& data)
{
struct NonQuantized
{
Vector3 Pos;
Float3 Scale;
};
// TODO: quantize transform (at least scale)
NonQuantized nonQuantized = { data.Translation, data.Scale };
WriteBytes(&nonQuantized, sizeof(nonQuantized));
NetworkQuaternion::Write(this, data.Orientation);
}
void NetworkStream::Flush()
{
// Nothing to do

View File

@@ -73,11 +73,13 @@ public:
void Read(INetworkSerializable& obj);
void Read(INetworkSerializable* obj);
void Read(Quaternion& data);
void Read(Transform& data);
using WriteStream::Write;
void Write(INetworkSerializable& obj);
void Write(INetworkSerializable* obj);
void Write(const Quaternion& data);
void Write(const Transform& data);
public:
// [Stream]