public int GetNextPacketLength(bool delta) { int len = 3; int itemMin = 0; int itemMax = Entry.DataType.Bools; int item = WritingCurrentItem; // bools // bools are always networked while (item >= itemMin && item < itemMax) { len += 1; item += 8; if (item > itemMax) { item = itemMax; } if (len >= EntryPacketSplitSize) { return(len); } } // bytes itemMin += Entry.DataType.Bools; itemMax += Entry.DataType.Bytes; if (Entry.DataType.Bytes > 0) { len++; } while (item >= itemMin && item < itemMax) { len += ((!delta && Bytes[item - itemMin] == Entry.Bytes[item - itemMin]) || (delta && !Stales[item]) ? 0 : 2); item += 1; if (len >= EntryPacketSplitSize) { return(len); } } // ushorts itemMin += Entry.DataType.Bytes; itemMax += Entry.DataType.UShorts; if (Entry.DataType.UShorts > 0) { len++; } while (item >= itemMin && item < itemMax) { len += ((!delta && UShorts[item - itemMin] == Entry.UShorts[item - itemMin]) || (delta && !Stales[item]) ? 0 : 3); item += 1; if (len >= EntryPacketSplitSize) { return(len); } } // ints itemMin += Entry.DataType.UShorts; itemMax += Entry.DataType.Ints; if (Entry.DataType.Ints > 0) { len++; } while (item >= itemMin && item < itemMax) { len += ((!delta && Ints[item - itemMin] == Entry.Ints[item - itemMin]) || (delta && !Stales[item]) ? 0 : 5); item += 1; if (len >= EntryPacketSplitSize) { return(len); } } // floats itemMin += Entry.DataType.Ints; itemMax += Entry.DataType.Floats; if (Entry.DataType.Floats > 0) { len++; } while (item >= itemMin && item < itemMax) { len += ((!delta && Floats[item - itemMin] == Entry.Floats[item - itemMin]) || (delta && !Stales[item]) ? 0 : 5); item += 1; if (len >= EntryPacketSplitSize) { return(len); } } // doubles itemMin += Entry.DataType.Floats; itemMax += Entry.DataType.Doubles; if (Entry.DataType.Doubles > 0) { len++; } while (item >= itemMin && item < itemMax) { len += ((!delta && Doubles[item - itemMin] == Entry.Doubles[item - itemMin]) || (delta && !Stales[item]) ? 0 : 9); item += 1; if (len >= EntryPacketSplitSize) { return(len); } } // strings itemMin += Entry.DataType.Doubles; itemMax += Entry.DataType.Strings; int sdepth = WritingStringDepth; int possibleLen = 0; if (Entry.DataType.Strings > 0) { len++; } while (item >= itemMin && item < itemMax) { if ((!delta && Strings[item - itemMin] == Entry.GetStringAtIndex(item - itemMin)) || (delta && !Stales[item])) { item += 1; continue; } possibleLen = 3 + StringLengths[item - itemMin] - sdepth; sdepth = 0; // if we're part way through a string, // apply that depth, but only to the first string we consider // need to handle splitting if (possibleLen + len > EntryPacketSplitSize) { return(EntryPacketSplitSize); } len += possibleLen; item += 1; if (len >= EntryPacketSplitSize) { return(len); } } return(len); }
public DynamicDataClone(DynamicDataEntry entry) { Entry = entry; if (entry != null) { Stales = new bool[entry.DataType.TotalCount]; if (entry.DataType.Bools > 0) { Bools = new bool[entry.DataType.Bools]; if (Bools.Length > 0) { PackedBoolSize = (8 + (Bools.Length - (Bools.Length % 8))) / 8; for (int i = 0; i < entry.DataType.Bools; i++) { Bools[i] = entry.Bools[i]; } } } if (entry.DataType.Bytes > 0) { Bytes = new byte[entry.DataType.Bytes]; for (int i = 0; i < entry.DataType.Bytes; i++) { Bytes[i] = entry.Bytes[i]; } } if (entry.DataType.UShorts > 0) { UShorts = new ushort[entry.DataType.UShorts]; for (int i = 0; i < entry.DataType.UShorts; i++) { UShorts[i] = entry.UShorts[i]; } } if (entry.DataType.Ints > 0) { Ints = new int[entry.DataType.Ints]; for (int i = 0; i < entry.DataType.Ints; i++) { Ints[i] = entry.Ints[i]; } } if (entry.DataType.Floats > 0) { Floats = new float[entry.DataType.Floats]; for (int i = 0; i < entry.DataType.Floats; i++) { Floats[i] = entry.Floats[i]; } } if (entry.DataType.Doubles > 0) { Doubles = new double[entry.DataType.Doubles]; for (int i = 0; i < entry.DataType.Doubles; i++) { Doubles[i] = entry.Doubles[i]; } } if (entry.DataType.Strings > 0) { Strings = new string[entry.DataType.Strings]; for (int i = 0; i < entry.DataType.Strings; i++) { Strings[i] = entry.GetStringAtIndex(i); } StringLengths = new int[entry.DataType.Strings]; } } }
// reuse a clone // we will try to reuse our arrays if possible public void LoadFromEntry(DynamicDataEntry entry) { Entry = entry; if (Stales == null || Stales.Length < entry.DataType.TotalCount) { Stales = new bool[entry.DataType.TotalCount]; } if (entry.DataType.Bools > 0) { if (Bools == null || Bools.Length < entry.DataType.Bools) { Bools = new bool[entry.DataType.Bools]; } if (Bools.Length > 0) { PackedBoolSize = (8 + (Bools.Length - (Bools.Length % 8))) / 8; for (int i = 0; i < entry.DataType.Bools; i++) { Bools[i] = entry.Bools[i]; } } } else { PackedBoolSize = 0; } if (entry.DataType.Bytes > 0) { if (Bytes == null || Bytes.Length < entry.DataType.Bytes) { Bytes = new byte[entry.DataType.Bytes]; } for (int i = 0; i < entry.DataType.Bytes; i++) { Bytes[i] = entry.Bytes[i]; } } if (entry.DataType.UShorts > 0) { if (UShorts == null || UShorts.Length < entry.DataType.UShorts) { UShorts = new ushort[entry.DataType.UShorts]; } for (int i = 0; i < entry.DataType.UShorts; i++) { UShorts[i] = entry.UShorts[i]; } } if (entry.DataType.Ints > 0) { if (Ints == null || Ints.Length < entry.DataType.Ints) { Ints = new int[entry.DataType.Ints]; } for (int i = 0; i < entry.DataType.Ints; i++) { Ints[i] = entry.Ints[i]; } } if (entry.DataType.Floats > 0) { if (Floats == null || Floats.Length < entry.DataType.Floats) { Floats = new float[entry.DataType.Floats]; } for (int i = 0; i < entry.DataType.Floats; i++) { Floats[i] = entry.Floats[i]; } } if (entry.DataType.Doubles > 0) { if (Doubles == null || Doubles.Length < entry.DataType.Doubles) { Doubles = new double[entry.DataType.Doubles]; } for (int i = 0; i < entry.DataType.Doubles; i++) { Doubles[i] = entry.Doubles[i]; } } if (entry.DataType.Strings > 0) { if (Strings == null || Strings.Length < entry.DataType.Strings) { Strings = new string[entry.DataType.Strings]; } for (int i = 0; i < entry.DataType.Strings; i++) { Strings[i] = entry.GetStringAtIndex(i); } if (StringLengths == null || StringLengths.Length < entry.DataType.Strings) { StringLengths = new int[entry.DataType.Strings]; } } }