浏览代码

Removed Connection's own framenumber as redundant.
Removed unnecessary double Find() for a node's replication state.

Lasse Öörni 13 年之前
父节点
当前提交
a4a0458981
共有 4 个文件被更改,包括 37 次插入42 次删除
  1. 23 26
      Engine/Network/Connection.cpp
  2. 4 6
      Engine/Network/Connection.h
  3. 7 7
      Engine/Scene/Serializable.cpp
  4. 3 3
      Engine/Scene/Serializable.h

+ 23 - 26
Engine/Network/Connection.cpp

@@ -64,7 +64,6 @@ Connection::Connection(Context* context, bool isClient, kNet::SharedPtr<kNet::Me
     Object(context),
     connection_(connection),
     position_(Vector3::ZERO),
-    frameNumber_(0),
     isClient_(isClient),
     connectPending_(false),
     sceneLoaded_(false),
@@ -216,7 +215,7 @@ void Connection::Disconnect(int waitMSec)
     connection_->Disconnect(waitMSec);
 }
 
-void Connection::SendServerUpdate(unsigned serverFrameNumber)
+void Connection::SendServerUpdate(unsigned frameNumber)
 {
     if (!scene_ || !sceneLoaded_)
         return;
@@ -228,17 +227,17 @@ void Connection::SendServerUpdate(unsigned serverFrameNumber)
     // Check for new or changed nodes
     // Start from the root node (scene) so that the scene-wide components get sent first
     processedNodes_.Clear();
-    ProcessNode(serverFrameNumber, scene_);
+    ProcessNode(frameNumber, scene_);
     
     // Then go through the rest of the nodes
     for (Map<unsigned, Node*>::ConstIterator i = nodes.Begin(); i != nodes.End() && i->first_ < FIRST_LOCAL_ID; ++i)
-        ProcessNode(serverFrameNumber, i->second_);
+        ProcessNode(frameNumber, i->second_);
     
     // Check for removed nodes
     for (HashMap<unsigned, NodeReplicationState>::Iterator i = sceneState_.Begin(); i != sceneState_.End();)
     {
         HashMap<unsigned, NodeReplicationState>::Iterator current = i++;
-        if (current->second_.frameNumber_ != frameNumber_)
+        if (current->second_.frameNumber_ != frameNumber)
         {
             msg_.Clear();
             msg_.WriteNetID(current->first_);
@@ -250,8 +249,6 @@ void Connection::SendServerUpdate(unsigned serverFrameNumber)
             sceneState_.Erase(current);
         }
     }
-    
-    ++frameNumber_;
 }
 
 void Connection::SendClientUpdate()
@@ -1006,7 +1003,7 @@ void Connection::HandleAsyncLoadFinished(StringHash eventType, VariantMap& event
     SendMessage(MSG_SCENELOADED, true, true, msg_, NET_HIGH_PRIORITY);
 }
 
-void Connection::ProcessNode(unsigned serverFrameNumber, Node* node)
+void Connection::ProcessNode(unsigned frameNumber, Node* node)
 {
     if (!node || processedNodes_.Contains(node))
         return;
@@ -1017,26 +1014,27 @@ void Connection::ProcessNode(unsigned serverFrameNumber, Node* node)
     PODVector<Node*> dependencyNodes;
     node->GetDependencyNodes(dependencyNodes);
     for (PODVector<Node*>::ConstIterator i = dependencyNodes.Begin(); i != dependencyNodes.End(); ++i)
-        ProcessNode(serverFrameNumber, *i);
+        ProcessNode(frameNumber, *i);
     
     // Check if the client's replication state already has this node
-    if (sceneState_.Contains(node->GetID()))
-        ProcessExistingNode(serverFrameNumber, node);
+    HashMap<unsigned, NodeReplicationState>::Iterator i = sceneState_.Find(node->GetID());
+    if (i != sceneState_.End())
+        ProcessExistingNode(frameNumber, node, i->second_);
     else
-        ProcessNewNode(serverFrameNumber, node);
+        ProcessNewNode(frameNumber, node);
 }
 
-void Connection::ProcessNewNode(unsigned serverFrameNumber, Node* node)
+void Connection::ProcessNewNode(unsigned frameNumber, Node* node)
 {
     msg_.Clear();
     msg_.WriteNetID(node->GetID());
     
     NodeReplicationState& nodeState = sceneState_[node->GetID()];
     nodeState.priorityAcc_ = 0.0f;
-    nodeState.frameNumber_ = frameNumber_;
+    nodeState.frameNumber_ = frameNumber;
     
     // Write node's attributes
-    node->WriteInitialDeltaUpdate(serverFrameNumber, msg_, deltaUpdateBits_, nodeState.attributes_);
+    node->WriteInitialDeltaUpdate(frameNumber, msg_, deltaUpdateBits_, nodeState.attributes_);
     
     // Write node's user variables
     const VariantMap& vars = node->GetVars();
@@ -1059,21 +1057,20 @@ void Connection::ProcessNewNode(unsigned serverFrameNumber, Node* node)
             continue;
         
         ComponentReplicationState& componentState = nodeState.components_[component->GetID()];
-        componentState.frameNumber_ = frameNumber_;
+        componentState.frameNumber_ = frameNumber;
         componentState.type_ = component->GetType();
         
         msg_.WriteShortStringHash(component->GetType());
         msg_.WriteNetID(component->GetID());
-        component->WriteInitialDeltaUpdate(serverFrameNumber, msg_, deltaUpdateBits_, componentState.attributes_);
+        component->WriteInitialDeltaUpdate(frameNumber, msg_, deltaUpdateBits_, componentState.attributes_);
     }
     
     SendMessage(MSG_CREATENODE, true, true, msg_, NET_HIGH_PRIORITY);
 }
 
-void Connection::ProcessExistingNode(unsigned serverFrameNumber, Node* node)
+void Connection::ProcessExistingNode(unsigned frameNumber, Node* node, NodeReplicationState& nodeState)
 {
-    NodeReplicationState& nodeState = sceneState_[node->GetID()];
-    nodeState.frameNumber_ = frameNumber_;
+    nodeState.frameNumber_ = frameNumber;
     
     // Check from the interest management priority component, if exists, whether should update
     NetworkPriority* priority = node->GetComponent<NetworkPriority>();
@@ -1086,7 +1083,7 @@ void Connection::ProcessExistingNode(unsigned serverFrameNumber, Node* node)
     
     // Check if attributes have changed
     bool deltaUpdate, latestData;
-    node->PrepareUpdates(serverFrameNumber, deltaUpdateBits_, nodeState.attributes_, deltaUpdate, latestData);
+    node->PrepareUpdates(frameNumber, deltaUpdateBits_, nodeState.attributes_, deltaUpdate, latestData);
     
     // Check if user variables have changed. Note: variable removal is not supported
     changedVars_.Clear();
@@ -1146,14 +1143,14 @@ void Connection::ProcessExistingNode(unsigned serverFrameNumber, Node* node)
         {
             // New component
             ComponentReplicationState& componentState = nodeState.components_[component->GetID()];
-            componentState.frameNumber_ = frameNumber_;
+            componentState.frameNumber_ = frameNumber;
             componentState.type_ = component->GetType();
             
             msg_.Clear();
             msg_.WriteNetID(node->GetID());
             msg_.WriteShortStringHash(component->GetType());
             msg_.WriteNetID(component->GetID());
-            component->WriteInitialDeltaUpdate(serverFrameNumber, msg_, deltaUpdateBits_, componentState.attributes_);
+            component->WriteInitialDeltaUpdate(frameNumber, msg_, deltaUpdateBits_, componentState.attributes_);
             
             SendMessage(MSG_CREATECOMPONENT, true, true, msg_, NET_HIGH_PRIORITY);
         }
@@ -1161,9 +1158,9 @@ void Connection::ProcessExistingNode(unsigned serverFrameNumber, Node* node)
         {
             // Existing component
             ComponentReplicationState& componentState = j->second_;
-            componentState.frameNumber_ = frameNumber_;
+            componentState.frameNumber_ = frameNumber;
             
-            component->PrepareUpdates(serverFrameNumber, deltaUpdateBits_, componentState.attributes_, deltaUpdate, latestData);
+            component->PrepareUpdates(frameNumber, deltaUpdateBits_, componentState.attributes_, deltaUpdate, latestData);
             
             // Send deltaupdate message if necessary
             if (deltaUpdate)
@@ -1192,7 +1189,7 @@ void Connection::ProcessExistingNode(unsigned serverFrameNumber, Node* node)
     for (HashMap<unsigned, ComponentReplicationState>::Iterator i = nodeState.components_.Begin(); i != nodeState.components_.End();)
     {
         HashMap<unsigned, ComponentReplicationState>::Iterator current = i++;
-        if (current->second_.frameNumber_ != frameNumber_)
+        if (current->second_.frameNumber_ != frameNumber)
         {
             msg_.Clear();
             msg_.WriteNetID(current->first_);

+ 4 - 6
Engine/Network/Connection.h

@@ -124,7 +124,7 @@ public:
     /// Disconnect. If wait time is non-zero, will block while waiting for disconnect to finish.
     void Disconnect(int waitMSec = 0);
     /// Send scene update messages. Called by Network.
-    void SendServerUpdate(unsigned serverFrameNumber);
+    void SendServerUpdate(unsigned frameNumber);
     /// Send latest controls from the client. Called by Network.
     void SendClientUpdate();
     /// Send queued remote events. Called by Network.
@@ -194,11 +194,11 @@ private:
     /// Handle scene loaded event.
     void HandleAsyncLoadFinished(StringHash eventType, VariantMap& eventData);
     /// Process a node for sending a network update. Recurses to process depended on node(s) first.
-    void ProcessNode(unsigned serverFrameNumber, Node* node);
+    void ProcessNode(unsigned frameNumber, Node* node);
     /// Process a node that the client had not yet received.
-    void ProcessNewNode(unsigned serverFrameNumber, Node* node);
+    void ProcessNewNode(unsigned frameNumber, Node* node);
     /// Process a node that the client has already received.
-    void ProcessExistingNode(unsigned serverFrameNumber, Node* node);
+    void ProcessExistingNode(unsigned frameNumber, Node* node, NodeReplicationState& nodeState);
     /// Initiate a package download.
     void RequestPackage(const String& name, unsigned fileSize, unsigned checksum);
     /// Send an error reply for a package download.
@@ -238,8 +238,6 @@ private:
     String sceneFileName_;
     /// Statistics timer.
     Timer statsTimer_;
-    /// Update frame number.
-    unsigned frameNumber_;
     /// Client connection flag.
     bool isClient_;
     /// Connection pending flag.

+ 7 - 7
Engine/Scene/Serializable.cpp

@@ -35,7 +35,7 @@ OBJECTTYPESTATIC(Serializable);
 
 Serializable::Serializable(Context* context) :
     Object(context),
-    lastServerFrameNumber_(0),
+    lastFrameNumber_(0),
     loading_(false)
 {
 }
@@ -420,7 +420,7 @@ bool Serializable::SetAttribute(const String& name, const Variant& value)
     return false;
 }
 
-void Serializable::WriteInitialDeltaUpdate(unsigned serverFrameNumber, Serializer& dest, PODVector<unsigned char>& deltaUpdateBits,
+void Serializable::WriteInitialDeltaUpdate(unsigned frameNumber, Serializer& dest, PODVector<unsigned char>& deltaUpdateBits,
     Vector<Variant>& replicationState)
 {
     const Vector<AttributeInfo>* attributes = GetNetworkAttributes();
@@ -429,7 +429,7 @@ void Serializable::WriteInitialDeltaUpdate(unsigned serverFrameNumber, Serialize
     unsigned numAttributes = attributes->Size();
     
     // Get current attribute values from the component if necessary
-    if (serverFrameNumber != lastServerFrameNumber_ || serverAttributes_.Empty())
+    if (frameNumber != lastFrameNumber_ || serverAttributes_.Empty())
     {
         serverAttributes_.Resize(numAttributes);
         for (unsigned i = 0; i < numAttributes; ++i)
@@ -437,7 +437,7 @@ void Serializable::WriteInitialDeltaUpdate(unsigned serverFrameNumber, Serialize
             const AttributeInfo& attr = attributes->At(i);
             OnGetAttribute(attr, serverAttributes_[i]);
         }
-        lastServerFrameNumber_ = serverFrameNumber;
+        lastFrameNumber_ = frameNumber;
     }
     
     replicationState.Resize(numAttributes);
@@ -464,7 +464,7 @@ void Serializable::WriteInitialDeltaUpdate(unsigned serverFrameNumber, Serialize
     }
 }
 
-void Serializable::PrepareUpdates(unsigned serverFrameNumber, PODVector<unsigned char>& deltaUpdateBits,
+void Serializable::PrepareUpdates(unsigned frameNumber, PODVector<unsigned char>& deltaUpdateBits,
     Vector<Variant>& replicationState, bool& deltaUpdate, bool& latestData)
 {
     deltaUpdate = false;
@@ -476,14 +476,14 @@ void Serializable::PrepareUpdates(unsigned serverFrameNumber, PODVector<unsigned
     unsigned numAttributes = attributes->Size();
     
     // Get current attribute values from the component if necessary
-    if (serverFrameNumber != lastServerFrameNumber_)
+    if (frameNumber != lastFrameNumber_)
     {
         for (unsigned i = 0; i < numAttributes; ++i)
         {
             const AttributeInfo& attr = attributes->At(i);
             OnGetAttribute(attr, serverAttributes_[i]);
         }
-        lastServerFrameNumber_ = serverFrameNumber;
+        lastFrameNumber_ = frameNumber;
     }
     
     deltaUpdateBits.Resize((numAttributes + 7) >> 3);

+ 3 - 3
Engine/Scene/Serializable.h

@@ -63,9 +63,9 @@ public:
     /// %Set attribute by name. Return true if successfully set.
     bool SetAttribute(const String& name, const Variant& value);
     /// Write initial delta network update (compared to default attribute values) and prepare the last sent state.
-    void WriteInitialDeltaUpdate(unsigned serverFrameNumber, Serializer& dest, PODVector<unsigned char>& deltaUpdateBits, Vector<Variant>& replicationState);
+    void WriteInitialDeltaUpdate(unsigned frameNumber, Serializer& dest, PODVector<unsigned char>& deltaUpdateBits, Vector<Variant>& replicationState);
     /// Prepare delta and latest data network updates. Needs a previously prepared last sent state from WriteInitialDeltaUpdate().
-    void PrepareUpdates(unsigned serverFrameNumber, PODVector<unsigned char>& deltaUpdateBits, Vector<Variant>& replicationState, bool& deltaUpdate, bool& latestData);
+    void PrepareUpdates(unsigned frameNumber, PODVector<unsigned char>& deltaUpdateBits, Vector<Variant>& replicationState, bool& deltaUpdate, bool& latestData);
     /// Write a delta network update prepared with PrepareUpdates().
     void WriteDeltaUpdate(Serializer& dest, PODVector<unsigned char>& deltaUpdateBits, Vector<Variant>& replicationState);
     /// Write a latestdata network update prepared with PrepareUpdates().
@@ -94,7 +94,7 @@ protected:
     /// Server-side attributes for sending updates. Only updated once per network frame, not per user.
     Vector<Variant> serverAttributes_;
     /// Last network frame number.
-    unsigned lastServerFrameNumber_;
+    unsigned lastFrameNumber_;
     /// Is loading flag.
     bool loading_;
 };