ER-428 / CTS-422 : [PUBLIC] movement updates are lost when walking. Changed code to detect if the circuit has stopped getting packets. Reviewed by Andrew

master
Dave SIMmONs 2011-01-19 12:54:05 -08:00
parent b2e4486cf2
commit f91a9c87e5
4 changed files with 12 additions and 10 deletions

View File

@ -87,6 +87,7 @@ LLCircuitData::LLCircuitData(const LLHost &host, TPACKETID in_id,
mPingDelayAveraged((F32)INITIAL_PING_VALUE_MSEC),
mUnackedPacketCount(0),
mUnackedPacketBytes(0),
mLastPacketInTime(0.0),
mLocalEndPointID(),
mPacketsOut(0),
mPacketsIn(0),
@ -667,6 +668,8 @@ void LLCircuitData::checkPacketInID(TPACKETID id, BOOL receive_resent)
mHighestPacketID = llmax(mHighestPacketID, id);
}
// Save packet arrival time
mLastPacketInTime = LLMessageSystem::getMessageTimeSeconds();
// Have we received anything on this circuit yet?
if (0 == mPacketsIn)

View File

@ -122,7 +122,7 @@ public:
U32 getPacketsLost() const;
TPACKETID getPacketOutID() const;
BOOL getTrusted() const;
F32 getAgeInSeconds() const;
F32 getAgeInSeconds() const;
S32 getUnackedPacketCount() const { return mUnackedPacketCount; }
S32 getUnackedPacketBytes() const { return mUnackedPacketBytes; }
F64 getNextPingSendTime() const { return mNextPingSendTime; }
@ -130,6 +130,7 @@ public:
{ return mOutOfOrderRate.meanValue(scale); }
U32 getLastPacketGap() const { return mLastPacketGap; }
LLHost getHost() const { return mHost; }
F64 getLastPacketInTime() const { return mLastPacketInTime; }
LLThrottleGroup &getThrottleGroup() { return mThrottles; }
@ -248,6 +249,7 @@ protected:
S32 mUnackedPacketCount;
S32 mUnackedPacketBytes;
F64 mLastPacketInTime; // Time of last packet arrival
LLUUID mLocalEndPointID;

View File

@ -210,7 +210,6 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe
mLastInterpUpdateSecs(0.f),
mLastMessageUpdateSecs(0.f),
mLatestRecvPacketID(0),
mCircuitPacketCount(0),
mData(NULL),
mAudioSourcep(NULL),
mAudioGain(1.f),
@ -1884,7 +1883,6 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
}
mLatestRecvPacketID = packet_id;
mCircuitPacketCount = 0;
// Set the change flags for scale
if (new_scale != getScale())
@ -2207,7 +2205,8 @@ void LLViewerObject::interpolateLinearMotion(const F64 & time, const F32 & dt)
LLVector3 new_pos = (vel + (0.5f * (dt-PHYSICS_TIMESTEP)) * accel) * dt;
LLVector3 new_v = accel * dt;
if (time_since_last_update > sPhaseOutUpdateInterpolationTime)
if (time_since_last_update > sPhaseOutUpdateInterpolationTime &&
sPhaseOutUpdateInterpolationTime > 0.0)
{ // Haven't seen a viewer update in a while, check to see if the ciruit is still active
if (mRegionp)
{ // The simulator will NOT send updates if the object continues normally on the path
@ -2216,9 +2215,12 @@ void LLViewerObject::interpolateLinearMotion(const F64 & time, const F32 & dt)
LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit( mRegionp->getHost() );
if (cdp)
{
// Find out how many seconds since last packet arrived on the circuit
F64 time_since_last_packet = LLMessageSystem::getMessageTimeSeconds() - cdp->getLastPacketInTime();
if (!cdp->isAlive() || // Circuit is dead or blocked
cdp->isBlocked() || // or doesn't seem to be getting any packets
(mCircuitPacketCount > 0 && mCircuitPacketCount == cdp->getPacketsIn()))
(time_since_last_packet > sPhaseOutUpdateInterpolationTime))
{
// Start to reduce motion interpolation since we haven't seen a server update in a while
F64 time_since_last_interpolation = time - mLastInterpUpdateSecs;
@ -2249,9 +2251,6 @@ void LLViewerObject::interpolateLinearMotion(const F64 & time, const F32 & dt)
new_pos = new_pos * ((F32) phase_out);
new_v = new_v * ((F32) phase_out);
}
// Save current circuit packet count to see if it changes
mCircuitPacketCount = cdp->getPacketsIn();
}
}
}
@ -5105,7 +5104,6 @@ void LLViewerObject::setRegion(LLViewerRegion *regionp)
}
mLatestRecvPacketID = 0;
mCircuitPacketCount = 0;
mRegionp = regionp;
for (child_list_t::iterator i = mChildList.begin(); i != mChildList.end(); ++i)

View File

@ -613,7 +613,6 @@ protected:
F64 mLastInterpUpdateSecs; // Last update for purposes of interpolation
F64 mLastMessageUpdateSecs; // Last update from a message from the simulator
TPACKETID mLatestRecvPacketID; // Latest time stamp on message from simulator
U32 mCircuitPacketCount; // Packet tracking for early detection of a stopped simulator circuit
// extra data sent from the sim...currently only used for tree species info
U8* mData;