Exemplo n.º 1
0
        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));
        }
Exemplo n.º 2
0
        void AddAsDeltaSnapshot()
        {
            DeltaSnapshot ds = new DeltaSnapshot(staticFields, dynamicFields);

            previousStates.Add(ds);

            if (previousStates.Count > maxDeltaSnapshots)
            {
                previousStates.RemoveAt(0);
            }

            currentDeltaId++;
        }
Exemplo n.º 3
0
        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();
            }
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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);
        }