From 8d7f10e36bbb4de101b900f6b455de09c47d079c Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Fri, 23 Sep 2016 13:55:23 +0100 Subject: cache wind compressed data so cpu burning compression is only done after a change. Not happy with version scheme for several regions on same instance, but should be ok for now --- .../Region/ClientStack/Linden/UDP/LLClientView.cs | 48 ++++++++++++++++------ 1 file changed, 36 insertions(+), 12 deletions(-) (limited to 'OpenSim/Region/ClientStack/Linden/UDP') diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 15f1004..5f8d8f1 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -1395,6 +1395,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP Util.FireAndForget(DoSendCloudData, cloudDensity, "LLClientView.SendCloudData"); } + // wind caching + private static int lastWindVersion = 0; + private static List lastWindPackets = new List(); + + /// /// Send wind layer information to the client. /// @@ -1403,22 +1408,41 @@ namespace OpenSim.Region.ClientStack.LindenUDP public virtual void SendWindData(int version, Vector2[] windSpeeds) { // Vector2[] windSpeeds = (Vector2[])o; - TerrainPatch[] patches = new TerrainPatch[2]; - patches[0] = new TerrainPatch { Data = new float[16 * 16] }; - patches[1] = new TerrainPatch { Data = new float[16 * 16] }; + + bool isNewData; + lock(lastWindPackets) + isNewData = lastWindVersion != version; - for (int x = 0; x < 16 * 16; x++) + if(isNewData) { - patches[0].Data[x] = windSpeeds[x].X; - patches[1].Data[x] = windSpeeds[x].Y; - } + TerrainPatch[] patches = new TerrainPatch[2]; + patches[0] = new TerrainPatch { Data = new float[16 * 16] }; + patches[1] = new TerrainPatch { Data = new float[16 * 16] }; - // neither we or viewers have extended wind - byte layerType = (byte)TerrainPatch.LayerType.Wind; + for (int x = 0; x < 16 * 16; x++) + { + patches[0].Data[x] = windSpeeds[x].X; + patches[1].Data[x] = windSpeeds[x].Y; + } - LayerDataPacket layerpack = OpenSimTerrainCompressor.CreateLayerDataPacketStandardSize(patches, layerType); - layerpack.Header.Zerocoded = true; - OutPacket(layerpack, ThrottleOutPacketType.Wind); + // neither we or viewers have extended wind + byte layerType = (byte)TerrainPatch.LayerType.Wind; + + LayerDataPacket layerpack = + OpenSimTerrainCompressor.CreateLayerDataPacketStandardSize( + patches, layerType); + layerpack.Header.Zerocoded = true; + lock(lastWindPackets) + { + lastWindPackets.Clear(); + lastWindPackets.Add(layerpack); + lastWindVersion = version; + } + } + + lock(lastWindPackets) + foreach(LayerDataPacket pkt in lastWindPackets) + OutPacket(pkt, ThrottleOutPacketType.Wind); } /// -- cgit v1.1