* Adds console command, 'predecode-j2k <number of threads>' to load all of the texture assets from the scene and decode the j2k layer data to cache. The work is split between the number of threads you specify. A good number of threads value is the number of cores on your machine minus 1.
* Increases the number of ImageDataPackets we send per PriorityQueue pop and tweak it so that the number of packets is ( (2 * decode level) + 1 ) * 2, and (((2 * (5-decode level)) + 1) * 2). The first one sends more data for low quality textures, the second one sends more data for high quality textures.0.6.3-post-fixes
							parent
							
								
									676b7c1073
								
							
						
					
					
						commit
						76206543e8
					
				|  | @ -496,6 +496,16 @@ namespace OpenSim | |||
|                 case "reset": | ||||
|                     Reset(cmdparams); | ||||
|                     break; | ||||
|                 case "predecode-j2k": | ||||
|                     if (cmdparams.Length > 0) | ||||
|                     { | ||||
|                         m_sceneManager.CacheJ2kDecode(Convert.ToInt32(cmdparams[0])); | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         m_sceneManager.CacheJ2kDecode(1); | ||||
|                     } | ||||
|                     break; | ||||
| 
 | ||||
|                 default: | ||||
|                     string[] tmpPluginArgs = new string[cmdparams.Length + 1]; | ||||
|  | @ -688,6 +698,7 @@ namespace OpenSim | |||
|             m_console.Notice("login-enable  - Allows login at sim level"); | ||||
|             m_console.Notice("login-disable - Disable login at sim level"); | ||||
|             m_console.Notice("login-status  - Show the actual login status"); | ||||
|             m_console.Notice("predecode-j2k - Precache assets,decode j2k layerdata, First parameter is threads to use"); | ||||
| 
 | ||||
|             ShowPluginCommandsHelp(CombineParams(helpArgs, 0), m_console); | ||||
| 
 | ||||
|  |  | |||
|  | @ -230,12 +230,24 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
|                                 else if (!process.data.J2KDecodeWaiting) | ||||
|                                 { | ||||
|                                     // Send more data at a time for higher discard levels | ||||
|                                     for (int i = 0; i < (2*(5 - process.data.DiscardLevel) + 1)*2; i++) | ||||
|                                     bool done = false; | ||||
|                                     for (int i = 0; i < (2*(process.data.DiscardLevel) + 1)*2; i++) | ||||
|                                         if (!process.data.SendPacket(m_client)) | ||||
|                                         { | ||||
|                                             done = true; | ||||
|                                             pq[h] -= (500000*i); | ||||
|                                             break; | ||||
|                                         } | ||||
|                                     if (!done) | ||||
|                                     { | ||||
|                                         for (int i = 0; i < (2 * (5- process.data.DiscardLevel) + 1) * 2; i++) | ||||
|                                             if (!process.data.SendPacket(m_client)) | ||||
|                                             { | ||||
|                                                 done = true; | ||||
|                                                 pq[h] -= (500000 * i); | ||||
|                                                 break; | ||||
|                                             } | ||||
|                                     } | ||||
|                                 } | ||||
|                                 // If the priority is less then -4 billion, the client has forgotten about it, pop it off | ||||
|                                 if (pq[h] < -400000000) | ||||
|  |  | |||
|  | @ -236,7 +236,8 @@ namespace OpenSim.Region.Environment.Modules.Agent.TextureSender | |||
|             // Cache Decoded layers | ||||
|             lock (m_cacheddecode) | ||||
|             { | ||||
|                 m_cacheddecode.Add(AssetId, layers); | ||||
|                 if (!m_cacheddecode.ContainsKey(AssetId)) | ||||
|                     m_cacheddecode.Add(AssetId, layers); | ||||
| 
 | ||||
|             } | ||||
| 
 | ||||
|  |  | |||
|  | @ -547,5 +547,132 @@ namespace OpenSim.Region.Environment.Scenes | |||
|         { | ||||
|             m_localScenes.ForEach(action); | ||||
|         } | ||||
| 
 | ||||
|         public void CacheJ2kDecode(int threads) | ||||
|         { | ||||
|             if (threads < 1) threads = 1; | ||||
| 
 | ||||
|             IJ2KDecoder m_decoder = m_localScenes[0].RequestModuleInterface<IJ2KDecoder>(); | ||||
| 
 | ||||
|             List<UUID> assetRequestList = new List<UUID>(); | ||||
| 
 | ||||
|             #region AssetGathering! | ||||
|             foreach (Scene scene in m_localScenes) | ||||
|             { | ||||
|                 List<EntityBase> entitles = scene.GetEntities(); | ||||
|                 foreach (EntityBase entity in entitles) | ||||
|                 { | ||||
|                     if (entity is SceneObjectGroup) | ||||
|                     { | ||||
|                         SceneObjectGroup sog = (SceneObjectGroup) entity; | ||||
|                         foreach (SceneObjectPart part in sog.Children.Values) | ||||
|                         { | ||||
|                             if (part.Shape != null) | ||||
|                             { | ||||
|                                 if (part.Shape.TextureEntry.Length > 0) | ||||
|                                 { | ||||
|                                     OpenMetaverse.Primitive.TextureEntry te = | ||||
|                                         new Primitive.TextureEntry(part.Shape.TextureEntry, 0, | ||||
|                                                                    part.Shape.TextureEntry.Length); | ||||
|                                     if (te.DefaultTexture != null) // this has been null for some reason... | ||||
|                                     { | ||||
|                                         if (te.DefaultTexture.TextureID != UUID.Zero) | ||||
|                                             assetRequestList.Add(te.DefaultTexture.TextureID); | ||||
|                                     } | ||||
|                                     for (int i=0; i<te.FaceTextures.Length; i++) | ||||
|                                     { | ||||
|                                         if (te.FaceTextures[i] != null) | ||||
|                                         { | ||||
|                                             if (te.FaceTextures[i].TextureID != UUID.Zero) | ||||
|                                             { | ||||
|                                                 assetRequestList.Add(te.FaceTextures[i].TextureID); | ||||
|                                             } | ||||
|                                         } | ||||
|                                     } | ||||
|                                 } | ||||
|                                 if (part.Shape.SculptTexture != UUID.Zero) | ||||
|                                 { | ||||
|                                     assetRequestList.Add(part.Shape.SculptTexture); | ||||
|                                 } | ||||
| 
 | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             #endregion | ||||
| 
 | ||||
|             int entries_per_thread = (assetRequestList.Count/threads) + 1; | ||||
| 
 | ||||
|             UUID[] arrAssetRequestList = assetRequestList.ToArray(); | ||||
| 
 | ||||
|             int currpos = 0; | ||||
| 
 | ||||
|             List<UUID[]> arrvalus = new List<UUID[]>(); | ||||
| 
 | ||||
|             //split into separate arrays | ||||
|             for (int j=0;j<threads;j++) | ||||
|             { | ||||
|                 List<UUID> val = new List<UUID>(); | ||||
| 
 | ||||
|                 for (int k=j*entries_per_thread; k < ((j+1)* entries_per_thread);k++) | ||||
|                 { | ||||
|                     if (k < arrAssetRequestList.Length) | ||||
|                     { | ||||
|                         val.Add(arrAssetRequestList[k]); | ||||
|                     } | ||||
| 
 | ||||
|                 } | ||||
|                 arrvalus.Add(val.ToArray()); | ||||
|             } | ||||
| 
 | ||||
|             for (int l=0;l<arrvalus.Count;l++) | ||||
|             { | ||||
|                 DecodeThreadContents threadworkItem = new DecodeThreadContents(); | ||||
|                 threadworkItem.sn = m_localScenes[0]; | ||||
|                 threadworkItem.j2kdecode = m_decoder; | ||||
|                 threadworkItem.arrassets = arrvalus[l]; | ||||
| 
 | ||||
|                 System.Threading.Thread decodethread = | ||||
|                     new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(threadworkItem.run)); | ||||
|                  | ||||
|                 threadworkItem.SetThread(decodethread); | ||||
| 
 | ||||
|                 decodethread.Priority = System.Threading.ThreadPriority.Lowest; | ||||
|                 decodethread.Name = "J2kCacheDecodeThread_" + l+1; | ||||
|                 ThreadTracker.Add(decodethread); | ||||
|                 decodethread.Start(); | ||||
|                  | ||||
|             } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|         } | ||||
|     } | ||||
|     public class DecodeThreadContents | ||||
|     { | ||||
|         public Scene sn; | ||||
|         public UUID[] arrassets; | ||||
|         public IJ2KDecoder j2kdecode; | ||||
|         private System.Threading.Thread thisthread; | ||||
| 
 | ||||
|         public void run( object o) | ||||
|         { | ||||
|             for (int i=0;i<arrassets.Length;i++) | ||||
|             { | ||||
|                 AssetBase ab = sn.AssetCache.GetAsset(arrassets[i], true); | ||||
|                 if (ab != null && ab.Data != null) | ||||
|                 { | ||||
|                     j2kdecode.syncdecode(arrassets[i], ab.Data); | ||||
|                 } | ||||
|             } | ||||
|             ThreadTracker.Remove(thisthread); | ||||
|         } | ||||
| 
 | ||||
|         public void SetThread(System.Threading.Thread thr) | ||||
|         { | ||||
|             thisthread = thr; | ||||
|         } | ||||
| 
 | ||||
|     } | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Teravus Ovares
						Teravus Ovares