diff options
author | John Hurliman | 2009-10-26 18:22:32 -0700 |
---|---|---|
committer | John Hurliman | 2009-10-26 18:22:32 -0700 |
commit | b6651ce79017bc7c6d1df66757e26a74bacfc36f (patch) | |
tree | d6f9835eff9f7d35da3fcdd3cd063cd72cba41c7 /OpenSim/Region | |
parent | Removing the ClientManager reference from IScene and hiding it entirely insid... (diff) | |
download | opensim-SC-b6651ce79017bc7c6d1df66757e26a74bacfc36f.zip opensim-SC-b6651ce79017bc7c6d1df66757e26a74bacfc36f.tar.gz opensim-SC-b6651ce79017bc7c6d1df66757e26a74bacfc36f.tar.bz2 opensim-SC-b6651ce79017bc7c6d1df66757e26a74bacfc36f.tar.xz |
* Double the priority on avatar bake texture requests to get avatars rezzing in faster than the surrounding scene
* Adds duplicate tracking for SceneObjectParts and ScenePresences to avoid sending out duplicate ImprovedTerseObjectUpdate packets
Diffstat (limited to 'OpenSim/Region')
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | 18 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 44 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 69 |
3 files changed, 69 insertions, 62 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index edfb13c..31028b3 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | |||
@@ -6756,11 +6756,21 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
6756 | if (OnRequestTexture != null) | 6756 | if (OnRequestTexture != null) |
6757 | { | 6757 | { |
6758 | TextureRequestArgs args = new TextureRequestArgs(); | 6758 | TextureRequestArgs args = new TextureRequestArgs(); |
6759 | args.RequestedAssetID = imageRequest.RequestImage[i].Image; | 6759 | |
6760 | args.DiscardLevel = imageRequest.RequestImage[i].DiscardLevel; | 6760 | RequestImagePacket.RequestImageBlock block = imageRequest.RequestImage[i]; |
6761 | args.PacketNumber = imageRequest.RequestImage[i].Packet; | 6761 | |
6762 | args.Priority = imageRequest.RequestImage[i].DownloadPriority; | 6762 | args.RequestedAssetID = block.Image; |
6763 | args.DiscardLevel = block.DiscardLevel; | ||
6764 | args.PacketNumber = block.Packet; | ||
6765 | args.Priority = block.DownloadPriority; | ||
6763 | args.requestSequence = imageRequest.Header.Sequence; | 6766 | args.requestSequence = imageRequest.Header.Sequence; |
6767 | |||
6768 | // NOTE: This is not a built in part of the LLUDP protocol, but we double the | ||
6769 | // priority of avatar textures to get avatars rezzing in faster than the | ||
6770 | // surrounding scene | ||
6771 | if ((ImageType)block.Type == ImageType.Baked) | ||
6772 | args.Priority *= 2.0f; | ||
6773 | |||
6764 | //handlerTextureRequest = OnRequestTexture; | 6774 | //handlerTextureRequest = OnRequestTexture; |
6765 | 6775 | ||
6766 | //if (handlerTextureRequest != null) | 6776 | //if (handlerTextureRequest != null) |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index d84c35c..a87bde0 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -248,6 +248,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
248 | protected UUID m_uuid; | 248 | protected UUID m_uuid; |
249 | protected Vector3 m_velocity; | 249 | protected Vector3 m_velocity; |
250 | 250 | ||
251 | protected Vector3 m_lastPosition; | ||
252 | protected Quaternion m_lastRotation; | ||
253 | protected Vector3 m_lastVelocity; | ||
254 | protected Vector3 m_lastAcceleration; | ||
255 | protected Vector3 m_lastAngularVelocity; | ||
256 | |||
251 | // TODO: Those have to be changed into persistent properties at some later point, | 257 | // TODO: Those have to be changed into persistent properties at some later point, |
252 | // or sit-camera on vehicles will break on sim-crossing. | 258 | // or sit-camera on vehicles will break on sim-crossing. |
253 | private Vector3 m_cameraEyeOffset; | 259 | private Vector3 m_cameraEyeOffset; |
@@ -2387,18 +2393,36 @@ if (m_shape != null) { | |||
2387 | /// </summary> | 2393 | /// </summary> |
2388 | public void SendScheduledUpdates() | 2394 | public void SendScheduledUpdates() |
2389 | { | 2395 | { |
2390 | if (m_updateFlag == 1) //some change has been made so update the clients | 2396 | const float VELOCITY_TOLERANCE = 0.01f; |
2397 | const float POSITION_TOLERANCE = 10.0f; | ||
2398 | |||
2399 | if (m_updateFlag == 1) | ||
2391 | { | 2400 | { |
2392 | AddTerseUpdateToAllAvatars(); | 2401 | // Throw away duplicate or insignificant updates |
2393 | ClearUpdateSchedule(); | 2402 | if (RotationOffset != m_lastRotation || |
2403 | Acceleration != m_lastAcceleration || | ||
2404 | (Velocity - m_lastVelocity).Length() > VELOCITY_TOLERANCE || | ||
2405 | (RotationalVelocity - m_lastAngularVelocity).Length() > VELOCITY_TOLERANCE || | ||
2406 | (OffsetPosition - m_lastPosition).Length() > POSITION_TOLERANCE) | ||
2407 | { | ||
2408 | AddTerseUpdateToAllAvatars(); | ||
2409 | ClearUpdateSchedule(); | ||
2394 | 2410 | ||
2395 | // This causes the Scene to 'poll' physical objects every couple of frames | 2411 | // This causes the Scene to 'poll' physical objects every couple of frames |
2396 | // bad, so it's been replaced by an event driven method. | 2412 | // bad, so it's been replaced by an event driven method. |
2397 | //if ((ObjectFlags & (uint)PrimFlags.Physics) != 0) | 2413 | //if ((ObjectFlags & (uint)PrimFlags.Physics) != 0) |
2398 | //{ | 2414 | //{ |
2399 | // Only send the constant terse updates on physical objects! | 2415 | // Only send the constant terse updates on physical objects! |
2400 | //ScheduleTerseUpdate(); | 2416 | //ScheduleTerseUpdate(); |
2401 | //} | 2417 | //} |
2418 | |||
2419 | // Update the "last" values | ||
2420 | m_lastPosition = OffsetPosition; | ||
2421 | m_lastRotation = RotationOffset; | ||
2422 | m_lastVelocity = Velocity; | ||
2423 | m_lastAcceleration = Acceleration; | ||
2424 | m_lastAngularVelocity = RotationalVelocity; | ||
2425 | } | ||
2402 | } | 2426 | } |
2403 | else | 2427 | else |
2404 | { | 2428 | { |
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 67384fb..0ac5be0 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -93,12 +93,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
93 | public Vector3 lastKnownAllowedPosition; | 93 | public Vector3 lastKnownAllowedPosition; |
94 | public bool sentMessageAboutRestrictedParcelFlyingDown; | 94 | public bool sentMessageAboutRestrictedParcelFlyingDown; |
95 | 95 | ||
96 | 96 | private Vector3 m_lastPosition; | |
97 | private Quaternion m_lastRotation; | ||
98 | private Vector3 m_lastVelocity; | ||
97 | 99 | ||
98 | private bool m_updateflag; | 100 | private bool m_updateflag; |
99 | private byte m_movementflag; | 101 | private byte m_movementflag; |
100 | private readonly List<NewForce> m_forcesList = new List<NewForce>(); | 102 | private readonly List<NewForce> m_forcesList = new List<NewForce>(); |
101 | private short m_updateCount; | ||
102 | private uint m_requestedSitTargetID; | 103 | private uint m_requestedSitTargetID; |
103 | private UUID m_requestedSitTargetUUID = UUID.Zero; | 104 | private UUID m_requestedSitTargetUUID = UUID.Zero; |
104 | private SendCourseLocationsMethod m_sendCourseLocationsMethod; | 105 | private SendCourseLocationsMethod m_sendCourseLocationsMethod; |
@@ -145,12 +146,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
145 | public string JID = string.Empty; | 146 | public string JID = string.Empty; |
146 | 147 | ||
147 | // Agent moves with a PID controller causing a force to be exerted. | 148 | // Agent moves with a PID controller causing a force to be exerted. |
148 | private bool m_newForce; | ||
149 | private bool m_newCoarseLocations = true; | 149 | private bool m_newCoarseLocations = true; |
150 | private float m_health = 100f; | 150 | private float m_health = 100f; |
151 | 151 | ||
152 | private Vector3 m_lastVelocity = Vector3.Zero; | ||
153 | |||
154 | // Default AV Height | 152 | // Default AV Height |
155 | private float m_avHeight = 127.0f; | 153 | private float m_avHeight = 127.0f; |
156 | 154 | ||
@@ -158,16 +156,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
158 | protected ulong crossingFromRegion; | 156 | protected ulong crossingFromRegion; |
159 | 157 | ||
160 | private readonly Vector3[] Dir_Vectors = new Vector3[6]; | 158 | private readonly Vector3[] Dir_Vectors = new Vector3[6]; |
161 | |||
162 | /// <value> | ||
163 | /// The avatar position last sent to clients | ||
164 | /// </value> | ||
165 | private Vector3 lastPhysPos = Vector3.Zero; | ||
166 | |||
167 | /// <value> | ||
168 | /// The avatar body rotation last sent to clients | ||
169 | /// </value> | ||
170 | private Quaternion lastPhysRot = Quaternion.Identity; | ||
171 | 159 | ||
172 | // Position of agent's camera in world (region cordinates) | 160 | // Position of agent's camera in world (region cordinates) |
173 | protected Vector3 m_CameraCenter = Vector3.Zero; | 161 | protected Vector3 m_CameraCenter = Vector3.Zero; |
@@ -1123,18 +1111,18 @@ namespace OpenSim.Region.Framework.Scenes | |||
1123 | CameraConstraintActive = true; | 1111 | CameraConstraintActive = true; |
1124 | //m_log.DebugFormat("[RAYCASTRESULT]: {0}, {1}, {2}, {3}", hitYN, collisionPoint, localid, distance); | 1112 | //m_log.DebugFormat("[RAYCASTRESULT]: {0}, {1}, {2}, {3}", hitYN, collisionPoint, localid, distance); |
1125 | 1113 | ||
1126 | Vector3 normal = Vector3.Normalize(new Vector3(0,0,collisionPoint.Z) - collisionPoint); | 1114 | Vector3 normal = Vector3.Normalize(new Vector3(0f, 0f, collisionPoint.Z) - collisionPoint); |
1127 | ControllingClient.SendCameraConstraint(new Vector4(normal.X, normal.Y, normal.Z, -1 * Vector3.Distance(new Vector3(0,0,collisionPoint.Z),collisionPoint))); | 1115 | ControllingClient.SendCameraConstraint(new Vector4(normal.X, normal.Y, normal.Z, -1 * Vector3.Distance(new Vector3(0,0,collisionPoint.Z),collisionPoint))); |
1128 | } | 1116 | } |
1129 | else | 1117 | else |
1130 | { | 1118 | { |
1131 | if (((Util.GetDistanceTo(lastPhysPos, AbsolutePosition) > 0.02) | 1119 | if ((m_pos - m_lastPosition).Length() > 0.02f || |
1132 | || (Util.GetDistanceTo(m_lastVelocity, m_velocity) > 0.02) | 1120 | (m_velocity - m_lastVelocity).Length() > 0.02f || |
1133 | || lastPhysRot != m_bodyRot)) | 1121 | m_bodyRot != m_lastRotation) |
1134 | { | 1122 | { |
1135 | if (CameraConstraintActive) | 1123 | if (CameraConstraintActive) |
1136 | { | 1124 | { |
1137 | ControllingClient.SendCameraConstraint(new Vector4(0, 0.5f, 0.9f, -3000f)); | 1125 | ControllingClient.SendCameraConstraint(new Vector4(0f, 0.5f, 0.9f, -3000f)); |
1138 | CameraConstraintActive = false; | 1126 | CameraConstraintActive = false; |
1139 | } | 1127 | } |
1140 | } | 1128 | } |
@@ -2373,6 +2361,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
2373 | 2361 | ||
2374 | public override void Update() | 2362 | public override void Update() |
2375 | { | 2363 | { |
2364 | const float VELOCITY_TOLERANCE = 0.01f; | ||
2365 | const float POSITION_TOLERANCE = 10.0f; | ||
2366 | |||
2376 | SendPrimUpdates(); | 2367 | SendPrimUpdates(); |
2377 | 2368 | ||
2378 | if (m_newCoarseLocations) | 2369 | if (m_newCoarseLocations) |
@@ -2383,28 +2374,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
2383 | 2374 | ||
2384 | if (m_isChildAgent == false) | 2375 | if (m_isChildAgent == false) |
2385 | { | 2376 | { |
2386 | if (m_newForce) // user movement 'forces' (ie commands to move) | 2377 | // Throw away duplicate or insignificant updates |
2378 | if (m_bodyRot != m_lastRotation || | ||
2379 | (m_velocity - m_lastVelocity).Length() > VELOCITY_TOLERANCE || | ||
2380 | (m_pos - m_lastPosition).Length() > POSITION_TOLERANCE) | ||
2387 | { | 2381 | { |
2388 | SendTerseUpdateToAllClients(); | 2382 | SendTerseUpdateToAllClients(); |
2389 | m_updateCount = 0; | 2383 | |
2390 | } | 2384 | // Update the "last" values |
2391 | else if (m_movementflag != 0) // scripted movement (?) | 2385 | m_lastPosition = m_pos; |
2392 | { | 2386 | m_lastRotation = m_bodyRot; |
2393 | m_updateCount++; | 2387 | m_lastVelocity = m_velocity; |
2394 | if (m_updateCount > 3) | ||
2395 | { | ||
2396 | SendTerseUpdateToAllClients(); | ||
2397 | m_updateCount = 0; | ||
2398 | } | ||
2399 | } | ||
2400 | else if ((Util.GetDistanceTo(lastPhysPos, AbsolutePosition) > 0.02) | ||
2401 | || (Util.GetDistanceTo(m_lastVelocity, m_velocity) > 0.02) | ||
2402 | || lastPhysRot != m_bodyRot) | ||
2403 | { | ||
2404 | // Send Terse Update to all clients updates lastPhysPos and m_lastVelocity | ||
2405 | // doing the above assures us that we know what we sent the clients last | ||
2406 | SendTerseUpdateToAllClients(); | ||
2407 | m_updateCount = 0; | ||
2408 | } | 2388 | } |
2409 | 2389 | ||
2410 | // followed suggestion from mic bowman. reversed the two lines below. | 2390 | // followed suggestion from mic bowman. reversed the two lines below. |
@@ -2447,15 +2427,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
2447 | public void SendTerseUpdateToAllClients() | 2427 | public void SendTerseUpdateToAllClients() |
2448 | { | 2428 | { |
2449 | m_perfMonMS = Environment.TickCount; | 2429 | m_perfMonMS = Environment.TickCount; |
2450 | 2430 | ||
2451 | m_scene.ForEachClient(SendTerseUpdateToClient); | 2431 | m_scene.ForEachClient(SendTerseUpdateToClient); |
2452 | 2432 | ||
2453 | m_lastVelocity = m_velocity; | ||
2454 | lastPhysPos = AbsolutePosition; | ||
2455 | lastPhysRot = m_bodyRot; | ||
2456 | |||
2457 | m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS); | 2433 | m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS); |
2458 | |||
2459 | } | 2434 | } |
2460 | 2435 | ||
2461 | public void SendCoarseLocations() | 2436 | public void SendCoarseLocations() |
@@ -3316,7 +3291,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
3316 | /// </summary> | 3291 | /// </summary> |
3317 | public override void UpdateMovement() | 3292 | public override void UpdateMovement() |
3318 | { | 3293 | { |
3319 | m_newForce = false; | ||
3320 | lock (m_forcesList) | 3294 | lock (m_forcesList) |
3321 | { | 3295 | { |
3322 | if (m_forcesList.Count > 0) | 3296 | if (m_forcesList.Count > 0) |
@@ -3338,7 +3312,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
3338 | // Ignoring this causes no movement to be sent to the physics engine... | 3312 | // Ignoring this causes no movement to be sent to the physics engine... |
3339 | // which when the scene is moving at 1 frame every 10 seconds, it doesn't really matter! | 3313 | // which when the scene is moving at 1 frame every 10 seconds, it doesn't really matter! |
3340 | } | 3314 | } |
3341 | m_newForce = true; | ||
3342 | 3315 | ||
3343 | m_forcesList.Clear(); | 3316 | m_forcesList.Clear(); |
3344 | } | 3317 | } |