From 1091b24a82ac39ade2753424430ac4095faf47e2 Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Sat, 9 Jul 2011 12:21:16 +0000 Subject: [PATCH] Speed up texture downloading: * remove duplicate request early * use reference to same TextureInfo for all faces. * download textures async * decode textures sync on a separate thread git-svn-id: https://radegast.googlecode.com/svn/trunk@958 f7a694da-4d33-11de-9ad6-1127a62b9fcd --- Radegast/GUI/Rendering/Rendering.cs | 70 +++++++++++++++++------------- Radegast/GUI/Rendering/RenderingHelpers.cs | 1 + 2 files changed, 40 insertions(+), 31 deletions(-) diff --git a/Radegast/GUI/Rendering/Rendering.cs b/Radegast/GUI/Rendering/Rendering.cs index 0e082d8..3b0ca7e 100644 --- a/Radegast/GUI/Rendering/Rendering.cs +++ b/Radegast/GUI/Rendering/Rendering.cs @@ -739,20 +739,18 @@ namespace Radegast.Rendering if (!PendingTextures.Dequeue(Timeout.Infinite, ref item)) continue; - if (TexturesPtrMap.ContainsKey(item.TeFace.TextureID)) - { - item.Data.TextureInfo = TexturesPtrMap[item.TeFace.TextureID]; - GL.BindTexture(TextureTarget.Texture2D, item.Data.TextureInfo.TexturePointer); - - continue; - } + // Already have this one loaded + if (item.Data.TextureInfo.TexturePointer != 0) continue; - if (LoadTexture(item.TeFace.TextureID, ref item.Data.TextureInfo.Texture, false)) + if (item.TextureData != null) { - Bitmap bitmap = (Bitmap)item.Data.TextureInfo.Texture; + ManagedImage mi; + Image img; + OpenJPEG.DecodeToImage(item.TextureData, out mi, out img); + Bitmap bitmap = (Bitmap)img; bool hasAlpha; - if (item.Data.TextureInfo.Texture.PixelFormat == System.Drawing.Imaging.PixelFormat.Format32bppArgb) + if (bitmap.PixelFormat == System.Drawing.Imaging.PixelFormat.Format32bppArgb) { hasAlpha = true; } @@ -764,10 +762,8 @@ namespace Radegast.Rendering item.Data.TextureInfo.HasAlpha = hasAlpha; bitmap.RotateFlip(RotateFlipType.RotateNoneFlipY); item.Data.TextureInfo.TexturePointer = GLLoadImage(bitmap, hasAlpha); - TexturesPtrMap[item.TeFace.TextureID] = item.Data.TextureInfo; - bitmap.Dispose(); - item.Data.TextureInfo.Texture = null; + item.TextureData = null; } } Logger.DebugLog("Texture thread exited"); @@ -1830,13 +1826,32 @@ namespace Radegast.Rendering public void DownloadTexture(TextureLoadItem item) { - if (TexturesPtrMap.ContainsKey(item.TeFace.TextureID)) + lock (TexturesPtrMap) { - item.Data.TextureInfo.TexturePointer = TexturesPtrMap[item.TeFace.TextureID].TexturePointer; - } - else - { - PendingTextures.Enqueue(item); + if (TexturesPtrMap.ContainsKey(item.TeFace.TextureID)) + { + item.Data.TextureInfo = TexturesPtrMap[item.TeFace.TextureID]; + } + else + { + TexturesPtrMap[item.TeFace.TextureID] = item.Data.TextureInfo; + + if (item.TextureData == null) + { + Client.Assets.RequestImage(item.TeFace.TextureID, (state, asset) => + { + if (state == TextureRequestState.Finished) + { + item.TextureData = asset.AssetData; + PendingTextures.Enqueue(item); + } + }); + } + else + { + PendingTextures.Enqueue(item); + } + } } } @@ -1936,19 +1951,12 @@ namespace Radegast.Rendering else { - if (TexturesPtrMap.ContainsKey(teFace.TextureID)) - { - data.TextureInfo.TexturePointer = TexturesPtrMap[teFace.TextureID].TexturePointer; - } - else + DownloadTexture(new TextureLoadItem() { - DownloadTexture(new TextureLoadItem() - { - Data = data, - Prim = prim, - TeFace = teFace - }); - } + Data = data, + Prim = prim, + TeFace = teFace + }); } } diff --git a/Radegast/GUI/Rendering/RenderingHelpers.cs b/Radegast/GUI/Rendering/RenderingHelpers.cs index 27eaa20..7b5e35c 100644 --- a/Radegast/GUI/Rendering/RenderingHelpers.cs +++ b/Radegast/GUI/Rendering/RenderingHelpers.cs @@ -267,6 +267,7 @@ namespace Radegast.Rendering public FaceData Data; public Primitive Prim; public Primitive.TextureEntryFace TeFace; + public byte[] TextureData = null; } public enum RenderPass -- 2.11.0