Skip to content

refactor: move RpcMethodId serialization from ILPP to Core #910

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 17, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -522,32 +522,32 @@ private bool ImportReferences(ModuleDefinition moduleDefinition)

private void ProcessNetworkBehaviour(TypeDefinition typeDefinition, string[] assemblyDefines)
{
var rpcHandlers = new List<(uint RpcHash, MethodDefinition RpcHandler)>();
var rpcNames = new List<(uint RpcHash, string RpcName)>();
var rpcHandlers = new List<(uint RpcMethodId, MethodDefinition RpcHandler)>();
var rpcNames = new List<(uint RpcMethodId, string RpcMethodName)>();

bool isEditorOrDevelopment = assemblyDefines.Contains("UNITY_EDITOR") || assemblyDefines.Contains("DEVELOPMENT_BUILD");

foreach (var methodDefinition in typeDefinition.Methods)
{
var rpcAttribute = CheckAndGetRPCAttribute(methodDefinition);
var rpcAttribute = CheckAndGetRpcAttribute(methodDefinition);
if (rpcAttribute == null)
{
continue;
}

var methodDefHash = methodDefinition.Hash();
if (methodDefHash == 0)
var rpcMethodId = methodDefinition.Hash();
if (rpcMethodId == 0)
{
continue;
}

InjectWriteAndCallBlocks(methodDefinition, rpcAttribute, methodDefHash);
InjectWriteAndCallBlocks(methodDefinition, rpcAttribute, rpcMethodId);

rpcHandlers.Add((methodDefHash, GenerateStaticHandler(methodDefinition, rpcAttribute)));
rpcHandlers.Add((rpcMethodId, GenerateStaticHandler(methodDefinition, rpcAttribute)));

if (isEditorOrDevelopment)
{
rpcNames.Add((methodDefHash, methodDefinition.Name));
rpcNames.Add((rpcMethodId, methodDefinition.Name));
}
}

Expand All @@ -570,25 +570,25 @@ private void ProcessNetworkBehaviour(TypeDefinition typeDefinition, string[] ass
var instructions = new List<Instruction>();
var processor = staticCtorMethodDef.Body.GetILProcessor();

foreach (var (rpcHash, rpcHandler) in rpcHandlers)
foreach (var (rpcMethodId, rpcHandler) in rpcHandlers)
{
typeDefinition.Methods.Add(rpcHandler);

// NetworkManager.__rpc_func_table.Add(RpcHash, HandleFunc);
// NetworkManager.__rpc_func_table.Add(RpcMethodId, HandleFunc);
instructions.Add(processor.Create(OpCodes.Ldsfld, m_NetworkManager_rpc_func_table_FieldRef));
instructions.Add(processor.Create(OpCodes.Ldc_I4, unchecked((int)rpcHash)));
instructions.Add(processor.Create(OpCodes.Ldc_I4, unchecked((int)rpcMethodId)));
instructions.Add(processor.Create(OpCodes.Ldnull));
instructions.Add(processor.Create(OpCodes.Ldftn, rpcHandler));
instructions.Add(processor.Create(OpCodes.Newobj, m_NetworkHandlerDelegateCtor_MethodRef));
instructions.Add(processor.Create(OpCodes.Call, m_NetworkManager_rpc_func_table_Add_MethodRef));
}

foreach (var (rpcHash, rpcName) in rpcNames)
foreach (var (rpcMethodId, rpcMethodName) in rpcNames)
{
// NetworkManager.__rpc_name_table.Add(RpcHash, RpcName);
// NetworkManager.__rpc_name_table.Add(RpcMethodId, RpcMethodName);
instructions.Add(processor.Create(OpCodes.Ldsfld, m_NetworkManager_rpc_name_table_FieldRef));
instructions.Add(processor.Create(OpCodes.Ldc_I4, unchecked((int)rpcHash)));
instructions.Add(processor.Create(OpCodes.Ldstr, rpcName));
instructions.Add(processor.Create(OpCodes.Ldc_I4, unchecked((int)rpcMethodId)));
instructions.Add(processor.Create(OpCodes.Ldstr, rpcMethodName));
instructions.Add(processor.Create(OpCodes.Call, m_NetworkManager_rpc_name_table_Add_MethodRef));
}

Expand All @@ -597,7 +597,7 @@ private void ProcessNetworkBehaviour(TypeDefinition typeDefinition, string[] ass
}
}

private CustomAttribute CheckAndGetRPCAttribute(MethodDefinition methodDefinition)
private CustomAttribute CheckAndGetRpcAttribute(MethodDefinition methodDefinition)
{
CustomAttribute rpcAttribute = null;
bool isServerRpc = false;
Expand Down Expand Up @@ -693,7 +693,7 @@ private CustomAttribute CheckAndGetRPCAttribute(MethodDefinition methodDefinitio
return rpcAttribute;
}

private void InjectWriteAndCallBlocks(MethodDefinition methodDefinition, CustomAttribute rpcAttribute, uint methodDefHash)
private void InjectWriteAndCallBlocks(MethodDefinition methodDefinition, CustomAttribute rpcAttribute, uint rpcMethodId)
{
var typeSystem = methodDefinition.Module.TypeSystem;
var instructions = new List<Instruction>();
Expand Down Expand Up @@ -727,15 +727,11 @@ private void InjectWriteAndCallBlocks(MethodDefinition methodDefinition, CustomA
// NetworkSerializer serializer;
methodDefinition.Body.Variables.Add(new VariableDefinition(m_NetworkSerializer_TypeRef));
int serializerLocIdx = methodDefinition.Body.Variables.Count - 1;
// uint methodHash;
methodDefinition.Body.Variables.Add(new VariableDefinition(typeSystem.UInt32));
int methodHashLocIdx = methodDefinition.Body.Variables.Count - 1;
// XXXRpcParams
if (!hasRpcParams)
{
methodDefinition.Body.Variables.Add(new VariableDefinition(isServerRpc ? m_ServerRpcParams_TypeRef : m_ClientRpcParams_TypeRef));
}

int rpcParamsIdx = !hasRpcParams ? methodDefinition.Body.Variables.Count - 1 : -1;

{
Expand Down Expand Up @@ -784,8 +780,8 @@ private void InjectWriteAndCallBlocks(MethodDefinition methodDefinition, CustomA

instructions.Add(beginInstr);

// var serializer = BeginSendServerRpc(serverRpcParams, rpcDelivery) -> ServerRpc
// var serializer = BeginSendClientRpc(clientRpcParams, rpcDelivery) -> ClientRpc
// var serializer = BeginSendServerRpc(rpcMethodId, serverRpcParams, rpcDelivery) -> ServerRpc
// var serializer = BeginSendClientRpc(rpcMethodId, clientRpcParams, rpcDelivery) -> ClientRpc
if (isServerRpc)
{
// ServerRpc
Expand Down Expand Up @@ -826,9 +822,12 @@ private void InjectWriteAndCallBlocks(MethodDefinition methodDefinition, CustomA
instructions.Add(roLastInstr);
}

// var serializer = BeginSendServerRpc(serverRpcParams, rpcDelivery);
// var serializer = BeginSendServerRpc(rpcMethodId, serverRpcParams, rpcDelivery);
instructions.Add(processor.Create(OpCodes.Ldarg_0));

// rpcMethodId
instructions.Add(processor.Create(OpCodes.Ldc_I4, unchecked((int)rpcMethodId)));

// rpcParams
instructions.Add(hasRpcParams ? processor.Create(OpCodes.Ldarg, paramCount) : processor.Create(OpCodes.Ldloc, rpcParamsIdx));

Expand All @@ -842,9 +841,12 @@ private void InjectWriteAndCallBlocks(MethodDefinition methodDefinition, CustomA
else
{
// ClientRpc
// var serializer = BeginSendClientRpc(clientRpcParams, rpcDelivery);
// var serializer = BeginSendClientRpc(rpcMethodId, clientRpcParams, rpcDelivery);
instructions.Add(processor.Create(OpCodes.Ldarg_0));

// rpcMethodId
instructions.Add(processor.Create(OpCodes.Ldc_I4, unchecked((int)rpcMethodId)));

// rpcParams
instructions.Add(hasRpcParams ? processor.Create(OpCodes.Ldarg, paramCount) : processor.Create(OpCodes.Ldloc, rpcParamsIdx));

Expand All @@ -860,14 +862,6 @@ private void InjectWriteAndCallBlocks(MethodDefinition methodDefinition, CustomA
instructions.Add(processor.Create(OpCodes.Ldloc, serializerLocIdx));
instructions.Add(processor.Create(OpCodes.Brfalse, endInstr));

// methodHash = methodDefHash
instructions.Add(processor.Create(OpCodes.Ldc_I4, unchecked((int)methodDefHash)));
instructions.Add(processor.Create(OpCodes.Stloc, methodHashLocIdx));
// serializer.Serialize(ref methodHash); // NetworkMethodId
instructions.Add(processor.Create(OpCodes.Ldloc, serializerLocIdx));
instructions.Add(processor.Create(OpCodes.Ldloca, methodHashLocIdx));
instructions.Add(processor.Create(OpCodes.Callvirt, m_NetworkSerializer_SerializeUint_MethodRef));

// write method parameters into stream
for (int paramIndex = 0; paramIndex < paramCount; ++paramIndex)
{
Expand Down Expand Up @@ -1645,17 +1639,20 @@ private void InjectWriteAndCallBlocks(MethodDefinition methodDefinition, CustomA

instructions.Add(endInstr);

// EndSendServerRpc(serializer, serverRpcParams, rpcDelivery) -> ServerRpc
// EndSendClientRpc(serializer, clientRpcParams, rpcDelivery) -> ClientRpc
// EndSendServerRpc(serializer, rpcMethodId, serverRpcParams, rpcDelivery) -> ServerRpc
// EndSendClientRpc(serializer, rpcMethodId, clientRpcParams, rpcDelivery) -> ClientRpc
if (isServerRpc)
{
// ServerRpc
// EndSendServerRpc(serializer, serverRpcParams, rpcDelivery);
// EndSendServerRpc(serializer, rpcMethodId, serverRpcParams, rpcDelivery);
instructions.Add(processor.Create(OpCodes.Ldarg_0));

// serializer
instructions.Add(processor.Create(OpCodes.Ldloc, serializerLocIdx));

// rpcMethodId
instructions.Add(processor.Create(OpCodes.Ldc_I4, unchecked((int)rpcMethodId)));

if (hasRpcParams)
{
// rpcParams
Expand All @@ -1676,12 +1673,15 @@ private void InjectWriteAndCallBlocks(MethodDefinition methodDefinition, CustomA
else
{
// ClientRpc
// EndSendClientRpc(serializer, clientRpcParams, rpcDelivery);
// EndSendClientRpc(serializer, rpcMethodId, clientRpcParams, rpcDelivery);
instructions.Add(processor.Create(OpCodes.Ldarg_0));

// serializer
instructions.Add(processor.Create(OpCodes.Ldloc, serializerLocIdx));

// rpcMethodId
instructions.Add(processor.Create(OpCodes.Ldc_I4, unchecked((int)rpcMethodId)));

if (hasRpcParams)
{
// rpcParams
Expand Down
10 changes: 6 additions & 4 deletions com.unity.multiplayer.mlapi/Runtime/Core/NetworkBehaviour.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ internal enum __RpcExecStage

#pragma warning disable IDE1006 // disable naming rule violation check
// RuntimeAccessModifiersILPP will make this `protected`
internal NetworkSerializer __beginSendServerRpc(ServerRpcParams serverRpcParams, RpcDelivery rpcDelivery)
internal NetworkSerializer __beginSendServerRpc(uint rpcMethodId, ServerRpcParams serverRpcParams, RpcDelivery rpcDelivery)
#pragma warning restore IDE1006 // restore naming rule violation check
{
PooledNetworkWriter writer;
Expand Down Expand Up @@ -73,14 +73,15 @@ internal NetworkSerializer __beginSendServerRpc(ServerRpcParams serverRpcParams,

writer.WriteUInt64Packed(NetworkObjectId); // NetworkObjectId
writer.WriteUInt16Packed(NetworkBehaviourId); // NetworkBehaviourId
writer.WriteUInt32Packed(rpcMethodId); // NetworkRpcMethodId
writer.WriteByte((byte)serverRpcParams.Send.UpdateStage); // NetworkUpdateStage

return writer.Serializer;
}

#pragma warning disable IDE1006 // disable naming rule violation check
// RuntimeAccessModifiersILPP will make this `protected`
internal void __endSendServerRpc(NetworkSerializer serializer, ServerRpcParams serverRpcParams, RpcDelivery rpcDelivery)
internal void __endSendServerRpc(NetworkSerializer serializer, uint rpcMethodId, ServerRpcParams serverRpcParams, RpcDelivery rpcDelivery)
#pragma warning restore IDE1006 // restore naming rule violation check
{
if (serializer == null)
Expand All @@ -101,7 +102,7 @@ internal void __endSendServerRpc(NetworkSerializer serializer, ServerRpcParams s

#pragma warning disable IDE1006 // disable naming rule violation check
// RuntimeAccessModifiersILPP will make this `protected`
internal NetworkSerializer __beginSendClientRpc(ClientRpcParams clientRpcParams, RpcDelivery rpcDelivery)
internal NetworkSerializer __beginSendClientRpc(uint rpcMethodId, ClientRpcParams clientRpcParams, RpcDelivery rpcDelivery)
#pragma warning restore IDE1006 // restore naming rule violation check
{
PooledNetworkWriter writer;
Expand Down Expand Up @@ -164,14 +165,15 @@ internal NetworkSerializer __beginSendClientRpc(ClientRpcParams clientRpcParams,

writer.WriteUInt64Packed(NetworkObjectId); // NetworkObjectId
writer.WriteUInt16Packed(NetworkBehaviourId); // NetworkBehaviourId
writer.WriteUInt32Packed(rpcMethodId); // NetworkRpcMethodId
writer.WriteByte((byte)clientRpcParams.Send.UpdateStage); // NetworkUpdateStage

return writer.Serializer;
}

#pragma warning disable IDE1006 // disable naming rule violation check
// RuntimeAccessModifiersILPP will make this `protected`
internal void __endSendClientRpc(NetworkSerializer serializer, ClientRpcParams clientRpcParams, RpcDelivery rpcDelivery)
internal void __endSendClientRpc(NetworkSerializer serializer, uint rpcMethodId, ClientRpcParams clientRpcParams, RpcDelivery rpcDelivery)
#pragma warning restore IDE1006 // restore naming rule violation check
{
if (serializer == null)
Expand Down
9 changes: 4 additions & 5 deletions com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -318,7 +318,7 @@ private void OnValidate()
}
}
}
}
}
}
#endif

Expand Down Expand Up @@ -1356,7 +1356,6 @@ private void ReceiveCallback(NetworkBuffer messageBuffer, RpcQueueContainer.Queu
}

/// <summary>
/// InvokeRPC
/// Called when an inbound queued RPC is invoked
/// </summary>
/// <param name="queueItem">frame queue item to invoke</param>
Expand All @@ -1367,10 +1366,10 @@ internal void InvokeRpc(RpcFrameQueueItem queueItem)
#endif
var networkObjectId = queueItem.NetworkReader.ReadUInt64Packed();
var networkBehaviourId = queueItem.NetworkReader.ReadUInt16Packed();
var networkRpcMethodId = queueItem.NetworkReader.ReadUInt32Packed();
var networkUpdateStage = queueItem.NetworkReader.ReadByteDirect();
var networkMethodId = queueItem.NetworkReader.ReadUInt32Packed();

if (__rpc_func_table.ContainsKey(networkMethodId))
if (__rpc_func_table.ContainsKey(networkRpcMethodId))
{
if (!SpawnManager.SpawnedObjects.ContainsKey(networkObjectId))
{
Expand Down Expand Up @@ -1409,7 +1408,7 @@ internal void InvokeRpc(RpcFrameQueueItem queueItem)
break;
}

__rpc_func_table[networkMethodId](networkBehaviour, new NetworkSerializer(queueItem.NetworkReader), rpcParams);
__rpc_func_table[networkRpcMethodId](networkBehaviour, new NetworkSerializer(queueItem.NetworkReader), rpcParams);
}

#if DEVELOPMENT_BUILD || UNITY_EDITOR
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,7 @@ internal void AddQueueItemToInboundFrame(QueueItemType qItemType, float timeStam
{
var longValue = reader.ReadUInt64Packed(); // NetworkObjectId (temporary, we reset position just below)
var shortValue = reader.ReadUInt16Packed(); // NetworkBehaviourId (temporary, we reset position just below)
var intValue = reader.ReadUInt32Packed(); // NetworkRpcMethodId (temporary, we reset position just below)
updateStage = (NetworkUpdateStage)reader.ReadByteDirect();
}

Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading