Class to compare memory values of variables in a current state to a prior state Results of the comparisons will be written to a bitStream, such that only changed variables get written
Can be used with ReplicaManager3 to Serialize a Replica3 per-variable, rather than comparing the entire object against itself
Usage:
BR> 1. Call BeginUnreliableAckedSerialize(), BeginUniqueSerialize(), or BeginIdenticalSerialize(). In the case of Replica3, this would be in the Serialize() call
2. For each variable of the type in step 1, call Serialize(). The same variables must be serialized every tick()
3. Call EndSerialize()
4. Repeat step 1 for each of the other categories of how to send varaibles.
More...
Classes |
| struct | ChangedVariablesList |
| struct | DeserializationContext |
| struct | RemoteSystemVariableHistory |
| struct | SerializationContext |
Public Member Functions |
| void | AddRemoteSystemVariableHistory (RakNetGUID guid) |
| void | BeginDeserialize (DeserializationContext *context, BitStream *_bitStream) |
| | Call when you receive the BitStream written by SerializeVariable(), before calling DeserializeVariable()
|
| void | BeginIdenticalSerialize (SerializationContext *context, bool _isFirstSerializeToThisSystem, BitStream *_bitStream) |
| | Call before doing one or more SerializeVariable calls for data that is sent with the same value to every remote system (such as health, position, etc.) This is the most common type of serialization, and also the most efficient Disadvantages: A copy of every variable still needs to be held, although only once Advantages: After the first serialization, the last serialized bitStream will be used for subsequent sends.
|
| void | BeginUniqueSerialize (SerializationContext *context, RakNetGUID _guid, BitStream *_bitStream) |
| | Call before doing one or more SerializeVariable calls for data that may be sent differently to every remote system (such as an invisibility flag that only teammates can see) The last value of each variable will be saved per remote system. Unlike BeginUnreliableAckedSerialize(), send receipts are not necessary Disadvantages: Every variable for every remote system is copied internally. Very memory and CPU intensive for multiple connections. Advantages: When data is sent differently depending on the recipient, this system can make things easier to use and is as efficient as it can be.
|
| void | BeginUnreliableAckedSerialize (SerializationContext *context, RakNetGUID _guid, BitStream *_bitStream, uint32_t _sendReceipt) |
| | Call before doing one or more SerializeVariable calls when the data will be sent UNRELIABLE_WITH_ACK_RECEIPT The last value of each variable will be saved per remote system. Additionally, a history of _sendReceipts is stored to determine what to resend on packetloss. When variables are lost, they will be flagged dirty and always resent to the system that lost it Disadvantages: Every variable for every remote system is copied internally, in addition to a history list of what variables changed for which _sendReceipt. Very memory and CPU intensive for multiple connections. Advantages: When data needs to be resent by RakNet, RakNet can only resend the value it currently has. This allows the application to control the resend, sending the most recent value of the variable. The end result is that bandwidth is used more efficiently because old data is never sent.
|
| template<class VarType > |
| bool | DeserializeVariable (DeserializationContext *context, VarType &variable) |
| void | EndDeserialize (DeserializationContext *context) |
| void | EndSerialize (SerializationContext *context) |
| | Call after BeginUnreliableAckedSerialize(), BeginUniqueSerialize(), or BeginIdenticalSerialize(), then after calling SerializeVariable() one or more times.
|
| void | OnMessageReceipt (RakNetGUID guid, uint32_t receiptId, bool messageArrived) |
| void | OnPreSerializeTick (void) |
| void | RemoveRemoteSystemVariableHistory (RakNetGUID guid) |
| template<class VarType > |
| void | SerializeVariable (SerializationContext *context, const VarType &variable) |
| | VariableDeltaSerializer () |
| | ~VariableDeltaSerializer () |
Protected Member Functions |
| ChangedVariablesList * | AllocChangedVariablesList (void) |
| void | DirtyAndFreeVarsAssociatedWithReceipt (RakNetGUID guid, uint32_t receiptId) |
| void | FreeChangedVariablesList (ChangedVariablesList *changedVariables) |
| void | FreeVarsAssociatedWithReceipt (RakNetGUID guid, uint32_t receiptId) |
| unsigned int | GetRemoteSystemHistoryListIndex (RakNetGUID guid) |
| RemoteSystemVariableHistory * | GetRemoteSystemVariableHistory (RakNetGUID guid) |
| unsigned int | GetVarsWrittenPerRemoteSystemListIndex (RakNetGUID guid) |
| void | RemoveRemoteSystemVariableHistory (void) |
| RemoteSystemVariableHistory * | StartVariableHistoryWrite (RakNetGUID guid) |
| void | StoreChangedVariablesList (RemoteSystemVariableHistory *variableHistory, ChangedVariablesList *changedVariables, uint32_t sendReceipt) |
Static Protected Member Functions |
| static int | UpdatedVariablesListPtrComp (const uint32_t &key, ChangedVariablesList *const &data) |
Protected Attributes |
| bool | didComparisonThisTick |
| RakNet::BitStream | identicalSerializationBs |
DataStructures::List
< RemoteSystemVariableHistory * > | remoteSystemVariableHistoryList |
DataStructures::MemoryPool
< ChangedVariablesList > | updatedVariablesMemoryPool |
On the receiver:
1. Call BeginDeserialize(). In the case of Replica3, this would be in the Deserialize() call 2. Call DeserializeVariable() for each variable, in the same order as was Serialized() 3. Call EndSerialize()
- See also:
- The ReplicaManager3 sample
Definition at line 30 of file VariableDeltaSerializer.h.
| void RakNet::VariableDeltaSerializer::OnMessageReceipt |
( |
RakNetGUID |
guid, |
|
|
uint32_t |
receiptId, |
|
|
bool |
messageArrived |
|
) |
| |
Call when getting ID_SND_RECEIPT_LOSS or ID_SND_RECEIPT_ACKED for a particular system Example:
uint32_t msgNumber; memcpy(&msgNumber, packet->data+1, 4); DataStructures::Multilist<ML_STACK, Replica3*> replicaListOut; replicaManager.GetReplicasCreatedByMe(replicaListOut); DataStructures::DefaultIndexType idx; for (idx=0; idx < replicaListOut.GetSize(); idx++) { ((SampleReplica*)replicaListOut[idx])->NotifyReplicaOfMessageDeliveryStatus(packet->guid,msgNumber, packet->data[0]==ID_SND_RECEIPT_ACKED); }
- Parameters:
-
| [in] | guid | Which system we are sending to |
| [in] | receiptId | Encoded in bytes 1-4 inclusive of ID_SND_RECEIPT_LOSS and ID_SND_RECEIPT_ACKED |
| [in] | messageArrived | True for ID_SND_RECEIPT_ACKED, false otherwise |
template<class VarType >
| void RakNet::VariableDeltaSerializer::SerializeVariable |
( |
SerializationContext * |
context, |
|
|
const VarType & |
variable |
|
) |
| [inline] |
Call to Serialize a variable Will write to the bitSteam passed to context true, variableValue if the variable has changed or has never been written. Otherwise will write false.
- Precondition:
- You have called BeginUnreliableAckedSerialize(), BeginUniqueSerialize(), or BeginIdenticalSerialize()
-
Will also require calling OnPreSerializeTick() if using BeginIdenticalSerialize()
- Note:
- Be sure to call EndSerialize() after finishing all serializations
- Parameters:
-
Definition at line 150 of file VariableDeltaSerializer.h.
References RakNet::VariableDeltaSerializer::SerializationContext::anyVariablesWritten, RakNet::VariableDeltaSerializer::ChangedVariablesList::bitField, RakNet::VariableDeltaSerializer::SerializationContext::bitStream, RakNet::VariableDeltaSerializer::ChangedVariablesList::bitWriteIndex, RakNet::VariableDeltaSerializer::SerializationContext::changedVariables, didComparisonThisTick, RakNet::VariableListDeltaTracker::IsPastEndOfList(), RakNet::VariableDeltaSerializer::SerializationContext::newSystemSend, RakNet::VariableDeltaSerializer::SerializationContext::serializationMode, UNRELIABLE_WITH_ACK_RECEIPT, RakNet::VariableDeltaSerializer::SerializationContext::variableHistory, RakNet::VariableDeltaSerializer::SerializationContext::variableHistoryIdentical, RakNet::VariableDeltaSerializer::RemoteSystemVariableHistory::variableListDeltaTracker, RakNet::BitStream::Write(), and RakNet::VariableListDeltaTracker::WriteVarToBitstream().
{
if (context->newSystemSend)
{
if (context->variableHistory->variableListDeltaTracker.IsPastEndOfList()==false)
{
context->bitStream->Write(true);
context->bitStream->Write(variable);
context->anyVariablesWritten=true;
}
else
{
context->variableHistory->variableListDeltaTracker.WriteVarToBitstream(variable, context->bitStream);
context->anyVariablesWritten=true;
}
}
else if (context->serializationMode==UNRELIABLE_WITH_ACK_RECEIPT)
{
context->anyVariablesWritten|=
context->variableHistory->variableListDeltaTracker.WriteVarToBitstream(variable, context->bitStream, context->changedVariables->bitField, context->changedVariables->bitWriteIndex++);
}
else
{
if (context->variableHistoryIdentical)
{
if (didComparisonThisTick==false)
context->anyVariablesWritten|=
context->variableHistory->variableListDeltaTracker.WriteVarToBitstream(variable, context->bitStream);
}
else
{
context->anyVariablesWritten|=
context->variableHistory->variableListDeltaTracker.WriteVarToBitstream(variable, context->bitStream);
}
}
}