Don't use deque in Actor; it allocates too much. Store pointers; moving
pointers around is cheap enough.
This commit is contained in:
+18
-14
@@ -110,6 +110,7 @@ Actor::Actor()
|
|||||||
|
|
||||||
Actor::~Actor()
|
Actor::~Actor()
|
||||||
{
|
{
|
||||||
|
StopTweening();
|
||||||
UnsubcribeAndClearCommands();
|
UnsubcribeAndClearCommands();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -418,8 +419,8 @@ void Actor::UpdateTweening( float fDeltaTime )
|
|||||||
|
|
||||||
// update current tween state
|
// update current tween state
|
||||||
// earliest tween
|
// earliest tween
|
||||||
TweenState &TS = m_Tweens[0].state;
|
TweenState &TS = m_Tweens[0]->state;
|
||||||
TweenInfo &TI = m_Tweens[0].info;
|
TweenInfo &TI = m_Tweens[0]->info;
|
||||||
|
|
||||||
if( TI.m_fTimeLeftInTween == TI.m_fTweenTime ) // we are just beginning this tween
|
if( TI.m_fTimeLeftInTween == TI.m_fTweenTime ) // we are just beginning this tween
|
||||||
{
|
{
|
||||||
@@ -448,7 +449,8 @@ void Actor::UpdateTweening( float fDeltaTime )
|
|||||||
m_current.sCommandName = "";
|
m_current.sCommandName = "";
|
||||||
|
|
||||||
// delete the head tween
|
// delete the head tween
|
||||||
m_Tweens.pop_front();
|
delete m_Tweens.front();
|
||||||
|
m_Tweens.erase( m_Tweens.begin() );
|
||||||
}
|
}
|
||||||
else // in the middle of tweening. Recalcute the current position.
|
else // in the middle of tweening. Recalcute the current position.
|
||||||
{
|
{
|
||||||
@@ -563,16 +565,16 @@ void Actor::BeginTweening( float time, TweenType tt )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// add a new TweenState to the tail, and initialize it
|
// add a new TweenState to the tail, and initialize it
|
||||||
m_Tweens.resize( m_Tweens.size()+1 );
|
m_Tweens.push_back( new TweenStateAndInfo );
|
||||||
|
|
||||||
// latest
|
// latest
|
||||||
TweenState &TS = m_Tweens.back().state;
|
TweenState &TS = m_Tweens.back()->state;
|
||||||
TweenInfo &TI = m_Tweens.back().info;
|
TweenInfo &TI = m_Tweens.back()->info;
|
||||||
|
|
||||||
if( m_Tweens.size() >= 2 ) // if there was already a TS on the stack
|
if( m_Tweens.size() >= 2 ) // if there was already a TS on the stack
|
||||||
{
|
{
|
||||||
// initialize the new TS from the last TS in the list
|
// initialize the new TS from the last TS in the list
|
||||||
TS = m_Tweens[m_Tweens.size()-2].state;
|
TS = m_Tweens[m_Tweens.size()-2]->state;
|
||||||
|
|
||||||
// don't inherit the queued state's command
|
// don't inherit the queued state's command
|
||||||
TS.sCommandName = "";
|
TS.sCommandName = "";
|
||||||
@@ -591,6 +593,8 @@ void Actor::BeginTweening( float time, TweenType tt )
|
|||||||
|
|
||||||
void Actor::StopTweening()
|
void Actor::StopTweening()
|
||||||
{
|
{
|
||||||
|
for( unsigned i = 0; i < m_Tweens.size(); ++i )
|
||||||
|
delete m_Tweens[i];
|
||||||
m_Tweens.clear();
|
m_Tweens.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -604,8 +608,8 @@ void Actor::HurryTweening( float factor )
|
|||||||
{
|
{
|
||||||
for( unsigned i = 0; i < m_Tweens.size(); ++i )
|
for( unsigned i = 0; i < m_Tweens.size(); ++i )
|
||||||
{
|
{
|
||||||
m_Tweens[i].info.m_fTimeLeftInTween *= factor;
|
m_Tweens[i]->info.m_fTimeLeftInTween *= factor;
|
||||||
m_Tweens[i].info.m_fTweenTime *= factor;
|
m_Tweens[i]->info.m_fTweenTime *= factor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -882,7 +886,7 @@ float Actor::GetTweenTimeLeft() const
|
|||||||
tot += m_fHibernateSecondsLeft;
|
tot += m_fHibernateSecondsLeft;
|
||||||
|
|
||||||
for( unsigned i=0; i<m_Tweens.size(); ++i )
|
for( unsigned i=0; i<m_Tweens.size(); ++i )
|
||||||
tot += m_Tweens[i].info.m_fTimeLeftInTween;
|
tot += m_Tweens[i]->info.m_fTimeLeftInTween;
|
||||||
|
|
||||||
return tot;
|
return tot;
|
||||||
}
|
}
|
||||||
@@ -902,9 +906,9 @@ void Actor::SetGlobalDiffuseColor( RageColor c )
|
|||||||
{
|
{
|
||||||
for( unsigned ts = 0; ts < m_Tweens.size(); ++ts )
|
for( unsigned ts = 0; ts < m_Tweens.size(); ++ts )
|
||||||
{
|
{
|
||||||
m_Tweens[ts].state.diffuse[i].r = c.r;
|
m_Tweens[ts]->state.diffuse[i].r = c.r;
|
||||||
m_Tweens[ts].state.diffuse[i].g = c.g;
|
m_Tweens[ts]->state.diffuse[i].g = c.g;
|
||||||
m_Tweens[ts].state.diffuse[i].b = c.b;
|
m_Tweens[ts]->state.diffuse[i].b = c.b;
|
||||||
}
|
}
|
||||||
m_current.diffuse[i].r = c.r;
|
m_current.diffuse[i].r = c.r;
|
||||||
m_current.diffuse[i].g = c.g;
|
m_current.diffuse[i].g = c.g;
|
||||||
@@ -918,7 +922,7 @@ void Actor::SetGlobalDiffuseColor( RageColor c )
|
|||||||
void Actor::SetGlobalX( float x )
|
void Actor::SetGlobalX( float x )
|
||||||
{
|
{
|
||||||
for( unsigned ts = 0; ts < m_Tweens.size(); ++ts )
|
for( unsigned ts = 0; ts < m_Tweens.size(); ++ts )
|
||||||
m_Tweens[ts].state.pos.x = x;
|
m_Tweens[ts]->state.pos.x = x;
|
||||||
m_current.pos.x = x;
|
m_current.pos.x = x;
|
||||||
m_start.pos.x = x;
|
m_start.pos.x = x;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,6 @@
|
|||||||
#include "RageTypes.h"
|
#include "RageTypes.h"
|
||||||
#include "RageUtil_AutoPtr.h"
|
#include "RageUtil_AutoPtr.h"
|
||||||
#include "ActorCommands.h"
|
#include "ActorCommands.h"
|
||||||
#include <deque>
|
|
||||||
#include <map>
|
#include <map>
|
||||||
struct XNode;
|
struct XNode;
|
||||||
struct lua_State;
|
struct lua_State;
|
||||||
@@ -216,7 +215,7 @@ public:
|
|||||||
else if( m_Tweens.empty() ) // not tweening
|
else if( m_Tweens.empty() ) // not tweening
|
||||||
return m_current;
|
return m_current;
|
||||||
else
|
else
|
||||||
return m_Tweens.back().state;
|
return m_Tweens.back()->state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -394,7 +393,7 @@ protected:
|
|||||||
TweenState state;
|
TweenState state;
|
||||||
TweenInfo info;
|
TweenInfo info;
|
||||||
};
|
};
|
||||||
deque<TweenStateAndInfo> m_Tweens; // use deque for contant time delete of the head
|
vector<TweenStateAndInfo *> m_Tweens;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Temporary variables that are filled just before drawing
|
// Temporary variables that are filled just before drawing
|
||||||
|
|||||||
Reference in New Issue
Block a user