using System; using System.Collections.Generic; using NUnit.Framework; using UnityEngine; using NetworkCompression; namespace NetcodeTests { [TestFixture] public class DeltaTests { [Test] public void Delta_FloatCompressedNoBaseline_Raw() { Delta_FloatCompressedNoBaseline(); } [Test] public void Delta_FloatCompressed_Raw() { Delta_FloatCompressed(); } [Test] public void Delta_FloatCompressedNoDrift_Raw() { Delta_FloatCompressedNoDrift(); } [Test] public void Delta_Vector3Compressed_Raw() { Delta_Vector3Compressed(); } [Test] public void Delta_RandomBaseline_Raw() { Delta_RandomBaseline(); } [Test] public void Delta_FloatCompressedNoBaseline_Huffman() { Delta_FloatCompressedNoBaseline(); } [Test] public void Delta_FloatCompressed_Huffman() { Delta_FloatCompressed(); } [Test] public void Delta_FloatCompressedNoDrift_Huffman() { Delta_FloatCompressedNoDrift(); } [Test] public void Delta_Vector3Compressed_Huffman() { Delta_Vector3Compressed(); } [Test] public void Delta_RandomBaseline_Huffman() { Delta_RandomBaseline(); } [Test] public void Delta_FloatCompressedNoBaseline_Rans() { Delta_FloatCompressedNoBaseline(); } [Test] public void Delta_FloatCompressed_Rans() { Delta_FloatCompressed(); } [Test] public void Delta_FloatCompressedNoDrift_Rans() { Delta_FloatCompressedNoDrift(); } [Test] public void Delta_Vector3Compressed_Rans() { Delta_Vector3Compressed(); } [Test] public void Delta_RandomBaseline_Rans() { Delta_RandomBaseline(); } public void Delta_FloatCompressedNoBaseline() where TInputStream : NetworkCompression.IInputStream, new() where TOutputStream : NetworkCompression.IOutputStream, new() { var schema = new NetworkSchema(0); schema.AddField( new NetworkSchema.FieldInfo() { name = "field_0", fieldType = NetworkSchema.FieldType.Float, bits = 32, delta = true, precision = 3 }); var values = new List() { 0.123f }; TestDelta(schema, values, null); } public void Delta_FloatCompressed() where TInputStream : NetworkCompression.IInputStream, new() where TOutputStream : NetworkCompression.IOutputStream, new() { var schema = new NetworkSchema(0); schema.AddField(new NetworkSchema.FieldInfo() { name = "field_0", fieldType = NetworkSchema.FieldType.Float, bits = 32, delta = true, precision = 3 }); var values = new List() { 0.637160838f }; var baseline = new List() { 0.538469732f }; TestDelta(schema, values, baseline); } public void Delta_FloatCompressedNoDrift() where TInputStream : NetworkCompression.IInputStream, new() where TOutputStream : NetworkCompression.IOutputStream, new() { var schema = new NetworkSchema(0); schema.AddField(new NetworkSchema.FieldInfo() { name = "field_0", fieldType = NetworkSchema.FieldType.Float, bits = 32, delta = true, precision = 3 }); var values = new List(1); var baseline = new List(1); values.Add(0.0f); baseline.Add(0.0f); for (int i = 0; i < 1024; ++i) { values[0] = (float)Math.Sin(i / 1024.0f * Math.PI); TestDelta(schema, values, baseline); baseline[0] = values[0]; } } public void Delta_Vector3Compressed() where TInputStream : NetworkCompression.IInputStream, new() where TOutputStream : NetworkCompression.IOutputStream, new() { var schema = new NetworkSchema(0); schema.AddField(new NetworkSchema.FieldInfo() { name = "field_0", fieldType = NetworkSchema.FieldType.Vector3, bits = 32, delta = true, precision = 3 }); var values = new List() { new Vector3() { x = 0.07870922f, y = 0.0479902327f, z = 0.16897355f } }; var baseline = new List() { new Vector3() { x = -122.123f, y = 112.32112f, z = 0.0235f } }; TestDelta(schema, values, baseline); } public void Delta_RandomBaseline() where TInputStream : NetworkCompression.IInputStream, new() where TOutputStream : NetworkCompression.IOutputStream, new() { var random = new System.Random(12091); for (int i = 0; i < 1024; ++i) { var schema = NetworkTestUtils.GenerateRandomSchema(64, random.Next()); var values = NetworkTestUtils.GenerateRandomValues(schema, random.Next()); var baselineValues = NetworkTestUtils.GenerateRandomValues(schema, random.Next()); TestDelta(schema, values, baselineValues); } } static void TestDelta(NetworkSchema schema, List values, List baselineValues) where TInputStream : NetworkCompression.IInputStream, new() where TOutputStream : NetworkCompression.IOutputStream, new() { var inputBuffer = new byte[1024 * 64]; var baselineBuffer = new byte[1024 * 64]; var deltaBuffer = new byte[1024 * 64]; var outputBuffer = new byte[1024 * 64]; NetworkTestUtils.WriteValues(values, inputBuffer, schema); if (baselineValues != null) NetworkTestUtils.WriteValues(baselineValues, baselineBuffer, schema); else baselineBuffer = new byte[1024 * 64]; var outputStream = new TOutputStream(); outputStream.Initialize(NetworkCompressionModel.DefaultModel, deltaBuffer, 0, null); uint hash = 0; DeltaWriter.Write(ref outputStream, schema, inputBuffer, baselineBuffer, zeroFieldsChanged, 0, ref hash); outputStream.Flush(); var inputStream = new TInputStream(); inputStream.Initialize(NetworkCompressionModel.DefaultModel, deltaBuffer, 0); hash = 0; DeltaReader.Read(ref inputStream, schema, outputBuffer, baselineBuffer, zeroFieldsChanged, 0, ref hash); NetworkTestUtils.ReadAndAssertValues(values, outputBuffer, schema); } static byte[] zeroFieldsChanged = new byte[(NetworkConfig.maxFieldsPerSchema + 7) / 8]; } }