bool SerializeStaticField(StaticSnapshotField field, NetBuffer buffer, DeltaSnapshot prev) { // Attempt to delta compress if (prev != null && !field.NeverCompress) { if (field.Type == SnapshotFieldType.Primitive) { // If the field in the last acknowledged snapshot is the same as // what were sending, skip it object prevField; if (prev.StaticFields.TryGetValue(field.Id, out prevField)) { if (field.Value.Equals(prevField)) { return(false); } } } else if (field.Type == SnapshotFieldType.Trigger) { // If the trigger was never activated, dont send. // Receiving end assumes that the trigger is zero when not received. Trigger ct = (Trigger)field.Value; if (ct.Iterations == 0) { return(false); } } } // Write field id buffer.Write(field.Id); return(SerializeField(field, buffer, prev)); }
void AddAsDeltaSnapshot() { DeltaSnapshot ds = new DeltaSnapshot(staticFields, dynamicFields); previousStates.Add(ds); if (previousStates.Count > maxDeltaSnapshots) { previousStates.RemoveAt(0); } currentDeltaId++; }
public virtual void Serialize(NetBuffer buffer) { DeltaSnapshot prev = GetLastValidSnapshot(); // Temporarily write each static field to get accurate count int writtenStaticFields = 0; NetBuffer tempStaticBuffer = new NetBuffer(); foreach (KeyValuePair <ushort, StaticSnapshotField> pair in staticFields) { if (SerializeStaticField(pair.Value, tempStaticBuffer, prev)) { writtenStaticFields++; } } // Temporarily write each dynamic field to get accurate count int writtenDynamicFields = 0; NetBuffer tempDynamicBuffer = new NetBuffer(); foreach (KeyValuePair <object, DynamicSnapshotField> pair in dynamicFields) { if (SerializeDynamicField(pair.Value, tempDynamicBuffer, prev)) { writtenDynamicFields++; } } // Write number of fields buffer.Write((ushort)writtenStaticFields); buffer.Write((ushort)writtenDynamicFields); // Write delta id buffer.Write(currentDeltaId); // Write fields buffer.WriteBytes(tempStaticBuffer.Data, 0, tempStaticBuffer.Length); buffer.WriteBytes(tempDynamicBuffer.Data, 0, tempDynamicBuffer.Length); // Add a copy of what we just wrote // to the delta states if (IsDeltaCompressing) { AddAsDeltaSnapshot(); } }
DeltaSnapshot GetLastValidSnapshot() { if (!IsDeltaCompressing) { return(null); } DeltaSnapshot snapshot = null; for (int i = previousStates.Count - 1; i >= 0; i--) { DeltaSnapshot ss = previousStates[i]; if (ss.IsAcknowledged) { snapshot = ss; break; } } return(snapshot); }
bool SerializeField(SnapshotField field, NetBuffer buffer, DeltaSnapshot prev) { // Write field type buffer.Write((byte)field.Type); // Write the field data if (field.Type == SnapshotFieldType.Primitive) { // Write primitive buffer.Write((byte)field.PrimitiveType); buffer.WriteDynamic(field.Value); } else if (field.Type == SnapshotFieldType.Trigger) { Trigger t = (Trigger)field.Value; // Write trigger buffer.Write(t.Iterations); // Reset trigger t.Iterations = 0; } else if (field.Type == SnapshotFieldType.Snapshot) { // Write nested snapshot Snapshot ns = (Snapshot)field.Value; ns.Serialize(buffer); } else if (field.Type == SnapshotFieldType.Custom) { // Write custom snapshot CustomSnapshot cs = (CustomSnapshot)field.Value; cs.Serialize(buffer); } return(true); }