Substrateを使用してMinecraftファイルデータを解析しています。Minecraftは、ブロックで構成された「チャンク」で構成されています。だから私はさまざまな16x16タイルのスプライトシートを持っています。WPFでcroppedbitmapを使用して、マップのセクションを構成する適切なグラフィックタイルを見つけます。次に、WPFでImage()コントロールに「ソース」を割り当てます。これは私のcroppedbitmapです。最後に、myCanvas.Children.Add(myImage)を実行します...問題は、キャンバスに約30枚の画像を配置した後、アプリケーションのクロールが遅くなることです。典型的なMinecraftマップには数百または数千の画像があるため、これは問題です。大量のビットマップデータを描画するためのより良い方法はありますか?マップにツールチップを配置してインタラクティブにすることができるので、画像コントロールがあるのが好きです。しかし、私は、画像コントロールはおそらくはるかに高価であり、何千もの画像コントロールを使用しても機能しない可能性があることを認めます。これが私のコードです。(これは特定の値のタイルのみを解析するため、id == 9の場合)
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();
}