diff options
author | Melanie | 2010-10-08 11:31:52 +0200 |
---|---|---|
committer | Melanie | 2010-10-08 11:31:52 +0200 |
commit | 52dd547863c0cdd22f53f0efcaef11ae096855a0 (patch) | |
tree | e1b545832530f02b3485a39826555e444423aad3 /OpenSim/Region/ClientStack | |
parent | Implement rezzing coalesced objects (diff) | |
download | opensim-SC_OLD-52dd547863c0cdd22f53f0efcaef11ae096855a0.zip opensim-SC_OLD-52dd547863c0cdd22f53f0efcaef11ae096855a0.tar.gz opensim-SC_OLD-52dd547863c0cdd22f53f0efcaef11ae096855a0.tar.bz2 opensim-SC_OLD-52dd547863c0cdd22f53f0efcaef11ae096855a0.tar.xz |
Make SendKillObject send multiple localIDs in one packet. This avoids the
halting visual behavior of large group deletes and eliminates the packet flood
Diffstat (limited to 'OpenSim/Region/ClientStack')
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | 41 |
1 files changed, 26 insertions, 15 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 2b1bd97..fff4300 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | |||
@@ -1516,35 +1516,46 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1516 | OutPacket(pc, ThrottleOutPacketType.Unknown); | 1516 | OutPacket(pc, ThrottleOutPacketType.Unknown); |
1517 | } | 1517 | } |
1518 | 1518 | ||
1519 | public void SendKillObject(ulong regionHandle, uint localID) | 1519 | public void SendKillObject(ulong regionHandle, List<uint> localIDs) |
1520 | { | 1520 | { |
1521 | // m_log.DebugFormat("[CLIENT]: Sending KillObjectPacket to {0} for {1} in {2}", Name, localID, regionHandle); | 1521 | // m_log.DebugFormat("[CLIENT]: Sending KillObjectPacket to {0} for {1} in {2}", Name, localID, regionHandle); |
1522 | 1522 | ||
1523 | KillObjectPacket kill = (KillObjectPacket)PacketPool.Instance.GetPacket(PacketType.KillObject); | 1523 | KillObjectPacket kill = (KillObjectPacket)PacketPool.Instance.GetPacket(PacketType.KillObject); |
1524 | // TODO: don't create new blocks if recycling an old packet | 1524 | // TODO: don't create new blocks if recycling an old packet |
1525 | kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1]; | 1525 | kill.ObjectData = new KillObjectPacket.ObjectDataBlock[localIDs.Count]; |
1526 | kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock(); | 1526 | for (int i = 0 ; i < localIDs.Count ; i++ ) |
1527 | kill.ObjectData[0].ID = localID; | 1527 | { |
1528 | kill.ObjectData[i] = new KillObjectPacket.ObjectDataBlock(); | ||
1529 | kill.ObjectData[i].ID = localIDs[i]; | ||
1530 | } | ||
1528 | kill.Header.Reliable = true; | 1531 | kill.Header.Reliable = true; |
1529 | kill.Header.Zerocoded = true; | 1532 | kill.Header.Zerocoded = true; |
1530 | 1533 | ||
1531 | if (m_scene.GetScenePresence(localID) == null) | 1534 | if (localIDs.Count == 1) |
1532 | { | 1535 | { |
1533 | lock (m_entityUpdates.SyncRoot) | 1536 | if (m_scene.GetScenePresence(localIDs[0]) != null) |
1534 | { | 1537 | { |
1535 | m_killRecord.Add(localID); | 1538 | OutPacket(kill, ThrottleOutPacketType.State); |
1536 | 1539 | return; | |
1537 | // The throttle queue used here must match that being used for updates. Otherwise, there is a | ||
1538 | // chance that a kill packet put on a separate queue will be sent to the client before an existing | ||
1539 | // update packet on another queue. Receiving updates after kills results in unowned and undeletable | ||
1540 | // scene objects in a viewer until that viewer is relogged in. | ||
1541 | OutPacket(kill, ThrottleOutPacketType.Task); | ||
1542 | } | 1540 | } |
1541 | m_killRecord.Add(localIDs[0]); | ||
1543 | } | 1542 | } |
1544 | else | 1543 | else |
1545 | { | 1544 | { |
1546 | OutPacket(kill, ThrottleOutPacketType.State); | 1545 | lock (m_entityUpdates.SyncRoot) |
1546 | { | ||
1547 | foreach (uint localID in localIDs) | ||
1548 | m_killRecord.Add(localID); | ||
1549 | } | ||
1547 | } | 1550 | } |
1551 | |||
1552 | // The throttle queue used here must match that being used for | ||
1553 | // updates. Otherwise, there is a chance that a kill packet put | ||
1554 | // on a separate queue will be sent to the client before an | ||
1555 | // existing update packet on another queue. Receiving updates | ||
1556 | // after kills results in unowned and undeletable | ||
1557 | // scene objects in a viewer until that viewer is relogged in. | ||
1558 | OutPacket(kill, ThrottleOutPacketType.Task); | ||
1548 | } | 1559 | } |
1549 | 1560 | ||
1550 | /// <summary> | 1561 | /// <summary> |
@@ -10969,7 +10980,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
10969 | { | 10980 | { |
10970 | // It's a ghost! tell the client to delete it from view. | 10981 | // It's a ghost! tell the client to delete it from view. |
10971 | simClient.SendKillObject(Scene.RegionInfo.RegionHandle, | 10982 | simClient.SendKillObject(Scene.RegionInfo.RegionHandle, |
10972 | localId); | 10983 | new List<uint>() { localId }); |
10973 | } | 10984 | } |
10974 | else | 10985 | else |
10975 | { | 10986 | { |