Skip to content

Perf: Rpc overhead #3925

Open
Open
@miwarnec

Description

@miwarnec

Currently this is how RPCs are serialized and sent:

// server call:
RpcOnFire(42);

// RpcOnFire:
[ClientRpc]
void RpcOnFire(int value)
{
    NetworkWriterPooled writer = NetworkWriterPool.Get();                       // GET WRITER
    writer.WriteVarInt(value);                                                  // WRITE
    SendRPCInternal("RpcOnFire", -1182161215, writer, 0, includeOwner: true);
    NetworkWriterPool.Return(writer);
}

void SendRpcInternal()
{
    RpcMessage message = new RpcMessage
    {
        netId = netId,
        componentIndex = ComponentIndex,
        functionHash = (ushort)functionHashCode,
        payload = writer.ToArraySegment()                                       // ARRAYSEGMENT
    };

    using (NetworkWriterPooled serialized = NetworkWriterPool.Get())            // GET WRITER
    {
        // serialize once
        serialized.Write(message);                                              // WRITE
        // send to all observers
        foreach (NetworkConnectionToClient conn in netIdentity.observers.Values)
            conn.Send(message, channelId);
    }
}

Instead, we could do this:

WriteUInt(netId);
WriteByte(componentIndex)
WriteUShort(functionHash)
Write(serialized parameters) // weaver generated

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions