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) { OpenMetaverse.Primitive.TextureEntry te = part.Shape.Textures; 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(); 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 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) { OpenMetaverse.Primitive.TextureEntry te = part.Shape.Textures; 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(); 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(); } }