2012-07-02 72 views
3

我正在使用Substrate解析minecraft文件數據。 Minecraft由塊組成,由塊組成。所以我有一張16x16不同的瓷磚。我在WPF中使用裁剪位圖來查找合適的圖形拼貼來組成地圖的一部分。然後我在WPF中分配一個Image()控件的'源',這是我的裁剪位圖。最後,我做myCanvas.Children.Add(myImage)...問題在於,在我的畫布中大約30張左右的圖像之後,應用程序變慢。這是一個問題,因爲典型的Minecraft地圖會有數百或數千個圖像。有沒有更好的方法來繪製大量的位圖數據?我喜歡使用圖像控件,因爲這樣我就可以在地圖上放置工具提示並使其交互。但是我接受Image控件可能更昂貴,並且有數千個控件可能無法工作。這是我的代碼。 (這只是分析有一定價值的瓷磚,因此,如果ID == 9)WPF'Map'控件;使用畫布顯示大量的位圖圖像

 var mapTiles = (BitmapImage)FindResource("mapTiles"); 
     CroppedBitmap waterImage = new CroppedBitmap(mapTiles, new Int32Rect(352, 48, 16, 16)); 
     CroppedBitmap grassImage = new CroppedBitmap(mapTiles, new Int32Rect(0, 0, 16, 16)); 
     foreach (ChunkRef chunk in chunkManager) 
     { 
      countOfTiles++; 

      for (int x = 0; x <= 15; x++) 
      { 
       for (int z = 0; z <= 15; z++) 
       { 
        int height = chunk.Blocks.GetHeight(x, z); 
        //TODO: Normalize Chunk X, Z so 0,0 is the smallest chunk so everything is visible on the canvas. 
        if (height > 0 && chunk.X > 0 && chunk.Z > 0) 
        { 
         var block = chunk.Blocks.GetBlock(x, height - 1, z); 

         if (block.ID == 9) 
         { 
          //352, 48 
          Image image = new Image(); 
          image.Source = waterImage; 
          worldMap.Children.Add(image); 
          Canvas.SetTop(image, (chunk.X + x) * 16); 
          Canvas.SetLeft(image, (chunk.Z + z) * 16); 
          image.ToolTip = countOfTiles.ToString(); 
         } 

回答

2

除了使用較重的圖像,你可以使用一個圖像刷:

// use ImageBrush's instead 
var waterImage = new ImageBrush(new CroppedBitmap(...)); 
var grassImage = new ImageBrush(new CroppedBitmap(...)); 

waterImage.Freeze(); 
grassImage.Freeze(); 

後來:

if (block.ID == 9) 
{ 
    var water = new Rectangle 
    { 
     Width = 16, 
     Height = 16, 
     Fill = waterImage 
    }; 
    worldMap.Children.Add(water); 
    Canvas.SetTop(water, (chunk.X + x) * 16); 
    Canvas.SetLeft(water, (chunk.Z + z) * 16); 
    water.ToolTip = countOfTiles.ToString(); 
} 

如果我離開Freeze,我無法使用100x100拼貼世界的測試應用程序正確顯示。當我凍結每個畫筆時,我可以將地圖無縫顯示至約300x300。在1000x1000下它幾乎無法加載,但此時您需要consider virtualizing the view,因爲UI不會很好地處理這些UIElement。

+0

非常感謝!這種方法最終以多快的速度出現,這是驚人的。一個更正:而不是矩形上的'背景'屬性,我用'填充'。我認爲這只是一個錯字,因爲我找不到背景屬性。 – Richthofen

+0

你是對的,這是一個錯字。甚至可以設計一個輕量級的Control,它封裝了一些塊的子集。此外,您必須在World Size中的某個位置移動到虛擬化面板。 – user7116

+0

我很好奇你的意思是通過虛擬化視圖。你能提供一些鏈接或其他信息嗎?再次,真的很感謝輸入! – Richthofen