Ticket #1846: 0001-Don-t-reinterpolate-if-the-position-of-a-component-d.patch

File 0001-Don-t-reinterpolate-if-the-position-of-a-component-d.patch, 4.3 KB (added by sbte, 11 years ago)

Sim interpolation speedup patch

  • source/simulation2/components/CCmpPosition.cpp

    From 6265be4dbcd84e3f1db3b7f748c945b0924dbc76 Mon Sep 17 00:00:00 2001
    From: "Sven (Sbte)" <svenb.linux@gmail.com>
    Date: Sun, 24 Feb 2013 15:59:54 +0100
    Subject: Don't reinterpolate if the position of a component does not change
    
    ---
     source/simulation2/components/CCmpPosition.cpp          | 5 +++++
     source/simulation2/components/CCmpVisualActor.cpp       | 5 +++++
     source/simulation2/components/ICmpPosition.cpp          | 1 +
     source/simulation2/components/ICmpPosition.h            | 2 ++
     source/simulation2/components/tests/test_RangeManager.h | 1 +
     source/simulation2/system/ComponentManager.cpp          | 1 +
     6 files changed, 15 insertions(+)
    
    diff --git a/source/simulation2/components/CCmpPosition.cpp b/source/simulation2/components/CCmpPosition.cpp
    index 80c72d9..04f2e09 100644
    a b public:  
    459459        }
    460460    }
    461461
     462    virtual bool GetReinterpolate()
     463    {
     464        return (m_LastX != m_X && m_LastZ != m_Z);
     465    }
     466
    462467private:
    463468    void AdvertisePositionChanges()
    464469    {
  • source/simulation2/components/CCmpVisualActor.cpp

    diff --git a/source/simulation2/components/CCmpVisualActor.cpp b/source/simulation2/components/CCmpVisualActor.cpp
    index 376ddbb..d5fb6cd 100644
    a b void CCmpVisualActor::Interpolate(float frameTime, float frameOffset)  
    728728    CmpPtr<ICmpPosition> cmpPosition(GetSimContext(), GetEntityId());
    729729    if (!cmpPosition || !cmpPosition->IsInWorld())
    730730        return;
     731    else if (!cmpPosition->GetReinterpolate() && m_PreviouslyRendered)
     732    {
     733        m_Unit->UpdateModel(frameTime);
     734        return;
     735    }
    731736    else if (!m_PreviouslyRendered)
    732737    {
    733738        UpdateVisibility();
  • source/simulation2/components/ICmpPosition.cpp

    diff --git a/source/simulation2/components/ICmpPosition.cpp b/source/simulation2/components/ICmpPosition.cpp
    index 9aaeecc..4b73667 100644
    a b DEFINE_INTERFACE_METHOD_1("TurnTo", void, ICmpPosition, TurnTo, entity_angle_t)  
    3838DEFINE_INTERFACE_METHOD_1("SetYRotation", void, ICmpPosition, SetYRotation, entity_angle_t)
    3939DEFINE_INTERFACE_METHOD_2("SetXZRotation", void, ICmpPosition, SetXZRotation, entity_angle_t, entity_angle_t)
    4040DEFINE_INTERFACE_METHOD_0("GetRotation", CFixedVector3D, ICmpPosition, GetRotation)
     41DEFINE_INTERFACE_METHOD_0("GetReinterpolate", bool, ICmpPosition, GetReinterpolate)
    4142// Excluded: GetInterpolatedTransform (not safe for scripts)
    4243END_INTERFACE_WRAPPER(Position)
  • source/simulation2/components/ICmpPosition.h

    diff --git a/source/simulation2/components/ICmpPosition.h b/source/simulation2/components/ICmpPosition.h
    index 3e454ce..39c9a0e 100644
    a b public:  
    168168     */
    169169    virtual CMatrix3D GetInterpolatedTransform(float frameOffset, bool forceFloating) = 0;
    170170
     171    virtual bool GetReinterpolate() = 0;
     172
    171173    DECLARE_INTERFACE_TYPE(Position)
    172174};
    173175
  • source/simulation2/components/tests/test_RangeManager.h

    diff --git a/source/simulation2/components/tests/test_RangeManager.h b/source/simulation2/components/tests/test_RangeManager.h
    index cf2ee71..f8328dc 100644
    a b public:  
    5959    virtual fixed GetDistanceTravelled() { return fixed::Zero(); }
    6060    virtual void GetInterpolatedPosition2D(float UNUSED(frameOffset), float& x, float& z, float& rotY) { x = z = rotY = 0; }
    6161    virtual CMatrix3D GetInterpolatedTransform(float UNUSED(frameOffset), bool UNUSED(forceFloating)) { return CMatrix3D(); }
     62    virtual bool GetReinterpolate() { return true; }
    6263};
    6364
    6465class TestCmpRangeManager : public CxxTest::TestSuite
  • source/simulation2/system/ComponentManager.cpp

    diff --git a/source/simulation2/system/ComponentManager.cpp b/source/simulation2/system/ComponentManager.cpp
    index 2105d37..f0aca7b 100644
    a b void CComponentManager::PostMessage(entity_id_t ent, const CMessage& msg) const  
    813813
    814814void CComponentManager::BroadcastMessage(const CMessage& msg) const
    815815{
     816    PROFILE("BroadcastMessage");
    816817    // Send the message to components of all entities that subscribed locally to this message
    817818    std::map<MessageTypeId, std::vector<ComponentTypeId> >::const_iterator it;
    818819    it = m_LocalMessageSubscriptions.find(msg.GetType());