mirror of
https://github.com/MirrorNetworking/Mirror.git
synced 2024-11-18 11:00:32 +00:00
perf: Reduce enum bandwidth (#794)
enums are serialized according to their size. if enum extend byte, they use 1 byte if enum extend short, they use 2 bytes if enum extend int, they are varinted if enum extend long, they are varinted So on average, most enums will take 1 byte. Previously they always required 4 bytes
This commit is contained in:
parent
f00c8e5e62
commit
97e9ac2483
@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using Mono.Cecil;
|
||||
|
||||
namespace Mirror.Weaver
|
||||
@ -40,6 +41,16 @@ public static bool IsDerivedFrom(this TypeDefinition td, TypeReference baseClass
|
||||
return false;
|
||||
}
|
||||
|
||||
public static TypeReference GetEnumUnderlyingType(this TypeDefinition td)
|
||||
{
|
||||
foreach (FieldDefinition field in td.Fields)
|
||||
{
|
||||
if (!field.IsStatic)
|
||||
return field.FieldType;
|
||||
}
|
||||
throw new ArgumentException($"Invalid enum {td.FullName}");
|
||||
}
|
||||
|
||||
public static bool ImplementsInterface(this TypeDefinition td, TypeReference baseInterface)
|
||||
{
|
||||
TypeDefinition typedef = td;
|
||||
|
@ -96,7 +96,7 @@ public static MethodReference GetReadFunc(TypeReference variable, int recursionC
|
||||
}
|
||||
else if (td.IsEnum)
|
||||
{
|
||||
return Weaver.NetworkReaderReadInt32;
|
||||
return GetReadFunc(td.GetEnumUnderlyingType(), recursionCount);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -83,9 +83,6 @@ class Weaver
|
||||
public static TypeReference CmdDelegateReference;
|
||||
public static MethodReference CmdDelegateConstructor;
|
||||
|
||||
public static MethodReference NetworkReaderReadInt32;
|
||||
|
||||
public static MethodReference NetworkWriterWriteInt32;
|
||||
public static MethodReference NetworkWriterWriteInt16;
|
||||
|
||||
public static MethodReference NetworkServerGetActive;
|
||||
@ -307,9 +304,6 @@ static void SetupTargetTypes()
|
||||
NetworkServerGetLocalClientActive = Resolvers.ResolveMethod(NetworkServerType, CurrentAssembly, "get_localClientActive");
|
||||
NetworkClientGetActive = Resolvers.ResolveMethod(NetworkClientType, CurrentAssembly, "get_active");
|
||||
|
||||
NetworkReaderReadInt32 = Resolvers.ResolveMethod(NetworkReaderType, CurrentAssembly, "ReadInt32");
|
||||
|
||||
NetworkWriterWriteInt32 = Resolvers.ResolveMethodWithArg(NetworkWriterType, CurrentAssembly, "Write", int32Type);
|
||||
NetworkWriterWriteInt16 = Resolvers.ResolveMethodWithArg(NetworkWriterType, CurrentAssembly, "Write", int16Type);
|
||||
|
||||
NetworkReaderReadPackedUInt32 = Resolvers.ResolveMethod(NetworkReaderType, CurrentAssembly, "ReadPackedUInt32");
|
||||
|
@ -90,7 +90,7 @@ public static MethodReference GetWriteFunc(TypeReference variable, int recursion
|
||||
}
|
||||
else if (variable.Resolve().IsEnum)
|
||||
{
|
||||
return Weaver.NetworkWriterWriteInt32;
|
||||
return GetWriteFunc(variable.Resolve().GetEnumUnderlyingType(), recursionCount);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user