パン可能なタイル グラフィックを表示する WPF コントロール (FrameworkElement から継承) を作成しました。各タイルは 24bpp で 256x256 ピクセルです。OnRender をオーバーライドしました。そこで、新しいタイルを (BitmapFrame として) ロードし、drawingContext.DrawImage を使用してすべての可視タイルを描画します。
これで、レンダリング サイクルごとに数個以上の新しいタイルがある場合は常に、フレームレートが 60 fps からゼロに約 1 秒間低下します。これは、イメージの読み込み (ミリ秒単位で実行) や DrawImage (中間のレンダリング データ構造を埋めるだけなので、まったく時間がかからない) が原因ではありません。
私の推測では、レンダー スレッド自体が多数 (~20) の新しい BitmapSource インスタンス (つまり、まだキャッシュされていないインスタンス) を取得するたびにチョークします。それらを内部の DirectX 互換フォーマットに変換するのに多くの時間を費やしているか、キャッシュの問題である可能性があります。ビデオ RAM が不足することはありません。Perforator は 60MB 未満でピークを示し、私は 256MB を持っています。また、Perforator によると、すべてのレンダー ターゲットはハードウェア アクセラレーション対応であり、それもあり得ません。
どんな洞察もいただければ幸いです!
前もって感謝します
ダニエル
@RandomEngy:
BitmapScalingMode.LowQuality は問題を少し軽減しましたが、解決しませんでした。意図した解像度で既にタイルを読み込んでいます。また、最新のグラフィックス ドライバー (Nvidia) である必要はありません。
スケーリングにそれほど時間がかかることを知って、少し驚いています。私が理解した方法では、ビットマップ (サイズに関係なく) は Direct3D テクスチャとして読み込まれ、ハードウェア スケーリングされます。実際のところ、ビットマップが初めてレンダリングされると、それ以上フリーズすることなく回転とスケールを変更できます。