1

私は現在、タイルベースのマップエディターに取り組んでおり、スクロールを希望どおりに機能させることに重点を置いています。それは私がいくつかの問題を経験するところです。スクロールしている間、画像が生成され、スクロールすると新しいコンテンツが表示されます。これは、新しい側で約200枚の画像(System.Windows.Controls.Image)が生成されるまで正常に機能します(単純なマップ、複雑ではありません)。

側面で約1000枚の画像(またはより速くスクロールするとさらに多くの画像)が生成されるたびに、スクロールの速さなどに応じて、アプリケーションがしばらくハングします。

この一時的なハングアップの原因は、常にこの回線が原因です。この行を削除すると、「ラグ」が完全になくなります(ただし、明らかに目的の結果は得られません)。

img.Source = it.GetFullSpriteSource(0);

このメソッドはImageSourceを生成するか、すでに生成されている場合は変数に格納されているImageSourceを返します。次のシナリオでも同じ問題が発生するため、問題はこの方法にはありません。

public static ImageSource yellowimg;
[...]
System.Drawing.Bitmap derp = new System.Drawing.Bitmap(32, 32);
using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(derp))
    g.FillRectangle(System.Drawing.Brushes.Yellow, 0, 0, 32, 32);
yellowimg = Utilities.ToImgSource(derp);
[...]
img.Source = yellowimg;

したがって、問題はおそらく、ImageSourceを割り当てるという事実にあります。

私はこのようなビットマップからImageSourceを生成していますが、関連している可能性があります。

public static ImageSource ToImgSource(Bitmap bitmap)
{
    return Imaging.CreateBitmapSourceFromHBitmap(
      bitmap.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty,
      BitmapSizeOptions.FromEmptyOptions());
}

別のスレッドでの生成(バックグラウンド生成)も試しましたが、別のスレッドからImageSourceを読み取ろうとすると、次のエラーが発生します。

The calling thread cannot access the object because different thread owns it


私が試すことができることは何ですか?

私はWPF(最近開始された)に精通しておらず、についての知識はほとんどないことを覚えておいてくださいImageSource

ありがとう、

〜Tgys

4

1 に答える 1

0

System.Drawing.BitmapからImageSourceを作成する代わりに、WriteableBitmapを使用する必要があります。複雑な描画をビットマップに描画する必要がある場合は、DrawingVisualのDrawingContextに描画、そのDrawingVisualをRenderTargetBitmapにレンダリングする必要があります。

別のスレッドでImageSourceオブジェクトを作成する場合、UIで使用する前に、それらのFreezeメソッドを呼び出す必要があります。

于 2012-08-30T13:49:20.887 に答える