Optimized calls to Event() (avoid allocating a new Event when it can be reused)

This commit is contained in:
smallmodel 2023-09-07 18:21:03 +02:00
parent 47a3c0bf55
commit c5a46be23e
No known key found for this signature in database
GPG key ID: 9F2D623CEDF08512
16 changed files with 195 additions and 146 deletions

View file

@ -120,7 +120,7 @@ bool UConnection::SendEvent
ptr = m_listeners.ObjectAt( i );
if( ptr )
{
Event *e = new Event( m_events.ObjectAt( i ) );
Event *e = new Event( *m_events.ObjectAt( i ) );
for( j = 1; j < numargs; j++ )
{

View file

@ -72,9 +72,7 @@ void VehicleCollisionEntity::EventDamage
Event *ev
)
{
Event *event = new Event( ev );
m_pOwner->ProcessEvent( event );
m_pOwner->ProcessEvent(*ev);
}
void VehicleCollisionEntity::Solid

View file

@ -765,19 +765,19 @@ void FuncBeam::Activate
}
void FuncBeam::UpdateEndpoint
(
Event *ev
)
(
Event* ev
)
{
if ( end )
{
Event *ev1 = new Event( ev );
{
if (end)
{
Event* ev1 = new Event(std::move(*ev));
VectorCopy( end->origin, edict->s.origin2 );
PostEvent( ev1, level.frametime );
}
}
VectorCopy(end->origin, edict->s.origin2);
PostEvent(ev1, level.frametime);
}
}
void FuncBeam::UpdateOrigin
(
@ -786,8 +786,8 @@ void FuncBeam::UpdateOrigin
{
if ( origin_target )
{
Event *ev1 = new Event( ev );
{
Event* ev1 = new Event(std::move(*ev));
setOrigin( origin_target->centroid );
PostEvent( ev1, level.frametime );

View file

@ -630,7 +630,7 @@ void Door::DoorBlocked(Event *ev)
assert(master);
if ((master) && (master != this)) {
master->ProcessEvent(new Event(ev));
master->ProcessEvent(*ev);
return;
}

View file

@ -3076,7 +3076,7 @@ void Entity::Sink(Event *ev)
}
if (target < myalpha) {
Event *event = new Event(ev);
Event *event = new Event(std::move(*ev));
PostEvent(event, FRAMETIME);
}

View file

@ -190,8 +190,7 @@ void LODMaster::PassEvent
ScriptError( "No LOD Model" );
}
Event *event = new Event( ev );
m_current->ProcessEvent( event );
m_current->ProcessEvent(*ev);
}
CLASS_DECLARATION( Animate, LODSlave, "lodslave" )

View file

@ -2964,7 +2964,7 @@ void Player::Killed(Event *ev)
// Custom killed event will do the job
//
if (m_pKilledEvent) {
event = new Event(m_pKilledEvent);
event = new Event(*m_pKilledEvent);
for (int i = 1; i <= ev->NumArgs(); i++) {
event->AddValue(ev->GetValue(i));
}

View file

@ -538,7 +538,7 @@ void Player::LogStats(Event *ev)
// FIXME: FS
gi.FS_Flush(logfile);
Event *ev1 = new Event(ev);
Event *ev1 = new Event(std::move(*ev));
PostEvent(ev1, 1);
}

View file

@ -175,12 +175,10 @@ void ScriptTimer::Disable()
void ScriptTimer::Enable()
{
bEnabled = true;
bEnabled = true;
CancelEventsOfType( &EV_ScriptTimer_Think );
Event *ev = new Event( &EV_ScriptTimer_Think );
ProcessEvent( ev );
CancelEventsOfType(EV_ScriptTimer_Think);
ProcessEvent(EV_ScriptTimer_Think);
}
qboolean ScriptTimer::Done()

View file

@ -1016,7 +1016,7 @@ void TouchField::SendEvent(Event *ev)
// Check if our owner is still around
if (owner) {
event = new Event(ontouch);
event = new Event(*ontouch);
event->AddEntity(ev->GetEntity(1));
owner->PostEvent(event, delay);
} else {

View file

@ -421,20 +421,18 @@ void VehicleTurretGun::EventKilled(Event *ev)
void VehicleTurretGun::EventDamage(Event *ev)
{
Event *event = new Event(ev);
if (owner) {
owner->ProcessEvent(event);
owner->ProcessEvent(*ev);
return;
}
if (m_pVehicleOwner) {
m_pVehicleOwner->ProcessEvent(event);
m_pVehicleOwner->ProcessEvent(*ev);
return;
}
if (!m_bUseRemoteControl) {
DamageEvent(event);
DamageEvent(ev);
return;
}
@ -442,7 +440,7 @@ void VehicleTurretGun::EventDamage(Event *ev)
Player *player = (Player *)m_pRemoteOwner.Pointer();
if (player->m_pVehicle) {
player->m_pVehicle->ProcessEvent(event);
player->m_pVehicle->ProcessEvent(*ev);
return;
}
}

View file

@ -537,8 +537,7 @@ void ViewMaster::PassEvent
viewthing = ( Viewthing * )( ( Entity * )current_viewthing );
if ( viewthing )
{
event = new Event( ev );
viewthing->ProcessEvent( event );
viewthing->ProcessEvent( *ev );
}
}

View file

@ -3572,8 +3572,7 @@ void Weapon::WeaponSound(Event *ev)
}
if (owner) {
e = new Event(ev);
owner->ProcessEvent(e);
owner->ProcessEvent(*ev);
} else {
Item::BroadcastAIEvent(AI_EVENT_WEAPON_FIRE);
}

View file

@ -1787,6 +1787,20 @@ void Event::LoadEvents()
}
}
/*
=======================
Event
=======================
*/
Event::Event()
{
fromScript = false;
eventnum = 0;
data = NULL;
dataSize = 0;
maxDataSize = 0;
}
/*
=======================
Event
@ -1823,79 +1837,6 @@ Event::Event
eventnum = 0;
}
/*
=======================
~Event
=======================
*/
Event::~Event()
{
Clear();
}
/*
=======================
Event
=======================
*/
Event::Event()
{
fromScript = false;
eventnum = 0;
data = NULL;
dataSize = 0;
maxDataSize = 0;
}
/*
=======================
ErrorInternal
=======================
*/
void Event::ErrorInternal( Listener *l, str text ) const
{
str classname;
str eventname;
EVENT_DPrintf( "^~^~^ Game" );
classname = l->getClassname();
eventname = getName();
EVENT_DPrintf( " (Event: '%s', Object: '%s') : %s\n", eventname.c_str(), classname.c_str(), text.c_str() );
}
/*
=======================
Event
=======================
*/
Event::Event( const Event *ev )
{
fromScript = ev->fromScript;
eventnum = ev->eventnum;
dataSize = ev->dataSize;
maxDataSize = ev->maxDataSize;
if( dataSize )
{
data = new ScriptVariable[ dataSize ];
for( int i = 0; i < dataSize; i++ )
{
data[ i ] = ev->data[ i ];
}
}
else
{
data = NULL;
}
#ifdef _DEBUG
name = ev->name;
#endif
}
/*
=======================
Event
@ -1903,30 +1844,44 @@ Event
*/
Event::Event( const Event &ev )
{
fromScript = ev.fromScript;
eventnum = ev.eventnum;
fromScript = ev.fromScript;
eventnum = ev.eventnum;
dataSize = ev.dataSize;
maxDataSize = ev.maxDataSize;
if( dataSize )
{
data = new ScriptVariable[ dataSize ];
if (dataSize)
{
data = new ScriptVariable[dataSize];
for( int i = 0; i < dataSize; i++ )
{
data[ i ] = ev.data[ i ];
}
}
else
{
data = NULL;
}
for (int i = 0; i < dataSize; i++)
{
data[i] = ev.data[i];
}
}
else
{
data = NULL;
}
#ifdef _DEBUG
name = ev.name;
name = ev.name;
#endif
}
Event::Event(Event&& ev)
{
fromScript = ev.fromScript;
eventnum = ev.eventnum;
dataSize = ev.dataSize;
maxDataSize = ev.maxDataSize;
data = ev.data;
ev.data = NULL;
ev.dataSize = 0;
ev.maxDataSize = 0;
ev.eventnum = 0;
}
/*
=======================
Event
@ -1971,6 +1926,31 @@ Event::Event(int index, int numArgs)
=======================
Event
Initializes the event with the specified command
=======================
*/
Event::Event(const char* command)
{
eventnum = FindEventNum(command);
if (!eventnum)
{
EVENT_DPrintf("^~^~^ Event '%s' does not exist.\n", command);
}
fromScript = qfalse;
maxDataSize = 0;
dataSize = 0;
data = NULL;
#ifdef _DEBUG
name = command;
#endif
}
/*
=======================
Event
Initializes the event with the specified command
=======================
*/
@ -1998,6 +1978,80 @@ Event::Event(const char* command, int numArgs)
#endif
}
/*
=======================
~Event
=======================
*/
Event::~Event()
{
Clear();
}
Event& Event::operator=(const Event& ev)
{
Clear();
fromScript = ev.fromScript;
eventnum = ev.eventnum;
dataSize = ev.dataSize;
maxDataSize = ev.maxDataSize;
if (dataSize)
{
data = new ScriptVariable[dataSize];
for (int i = 0; i < dataSize; i++)
{
data[i] = ev.data[i];
}
}
else
{
data = NULL;
}
#ifdef _DEBUG
name = ev.name;
#endif
return *this;
}
Event& Event::operator=(Event&& ev)
{
Clear();
fromScript = ev.fromScript;
eventnum = ev.eventnum;
dataSize = ev.dataSize;
maxDataSize = ev.maxDataSize;
data = ev.data;
ev.data = NULL;
ev.dataSize = 0;
ev.maxDataSize = 0;
ev.eventnum = 0;
return *this;
}
/*
=======================
ErrorInternal
=======================
*/
void Event::ErrorInternal(Listener* l, str text) const
{
str classname;
str eventname;
EVENT_DPrintf("^~^~^ Game");
classname = l->getClassname();
eventname = getName();
EVENT_DPrintf(" (Event: '%s', Object: '%s') : %s\n", eventname.c_str(), classname.c_str(), text.c_str());
}
/*
=======================
AddContainer

View file

@ -330,22 +330,26 @@ public:
void operator delete( void *ptr );
#endif
Event();
Event( const Event *ev );
Event( const Event &ev );
Event( int index );
Event( int index, int numArgs );
Event( const char* command, int numArgs = 0 );
Event
(
const char *command,
int flags,
const char *formatspec, // Arguments are : 'e' (Entity) 'v' (Vector) 'i' (Integer) 'f' (Float) 's' (String) 'b' (Boolean).
// Uppercase arguments means optional.
const char *argument_names,
const char *documentation,
uchar type = EV_NORMAL
);
Event();
Event(const Event& ev);
Event(Event&& ev);
Event(int index);
Event(int index, int numArgs);
Event(const char* command);
Event(const char* command, int numArgs);
Event
(
const char* command,
int flags,
const char* formatspec, // Arguments are : 'e' (Entity) 'v' (Vector) 'i' (Integer) 'f' (Float) 's' (String) 'b' (Boolean).
// Uppercase arguments means optional.
const char* argument_names,
const char* documentation,
byte type = EV_NORMAL
);
Event& operator=(const Event& ev);
Event& operator=(Event&& ev);
~Event();

View file

@ -57,7 +57,7 @@ class ScriptCommandEvent : public Event
{
public:
ScriptCommandEvent(unsigned int eventNum);
ScriptCommandEvent(unsigned int eventNum, size_t numArgs);
ScriptCommandEvent(unsigned int eventNum, int numArgs);
};
ScriptCommandEvent::ScriptCommandEvent(unsigned int eventNum)
@ -66,8 +66,8 @@ ScriptCommandEvent::ScriptCommandEvent(unsigned int eventNum)
fromScript = true;
}
ScriptCommandEvent::ScriptCommandEvent(unsigned int eventNum, size_t numArgs)
: Event(eventNum)
ScriptCommandEvent::ScriptCommandEvent(unsigned int eventNum, int numArgs)
: Event(eventNum, numArgs)
{
fromScript = true;
}