2

私の Windows ストア アプリでは、ファイル (ほとんどの画像) を分離ストレージに保存/使用しています。
画像を提示する必要があるときは、次を使用します。

var file = await folder.GetFileAsync(fileName);
using (var stream = await file.OpenAsync(FileAccessMode.Read))
{
    obj.Image = new BitmapImage();
    await obj.Image.SetSourceAsync(stream);
}

しかし、同じページで 3 つ以上の画像を使用すると、ラグが発生します。
分離ストレージ ファイルにアクセスするためのより高速なソリューションを探しています。

4

2 に答える 2

0

この記事メディア リソースの最適化 (C#/VB/C++ および XAML を使用した Windows ストア アプリ)から始めて、さらにいくつかのことを試すことができます。

  1. それらを ListView / GridView に表示する場合は、仮想化が有効になっていることを確認してください (仮想化をサポートする適切な ItemsPanel を使用します)。

  2. ローカル ストレージから画像を読み込むだけの場合 - Image.Source からのバインドを適切な URI (ms-appx:/// または ms-appdata:///local/) に設定すると、画像コントロールがすべてを実行します。あなた。

于 2013-05-20T22:55:35.027 に答える
0

複数の画像をどのように開いているのかわかりませんが、すべてのメソッドが非同期であるため、ファイルを順番に反復処理するのではなく、すべてを並行して開く必要があります。

したがって、これを行う代わりに (次のイメージのロードを開始する前に前のイメージのロードを待機する場合):

foreach (var fileName in fileNames)
{
    var file = await folder.GetFileAsync(fileName);
    using (var stream = await file.OpenAsync(FileAccessMode.Read))
    {
        obj.Image = new BitmapImage();
        await obj.Image.SetSourceAsync(stream);
    }
}

次のようにアプローチする必要があります。

// not sure about the type of obj
public async Task<Image> LoadImage(string fileName, dynamic obj)
{
    var file = await folder.GetFileAsync(fileName);
    using (var stream = await file.OpenAsync(FileAccessMode.Read))
    {
        obj.Image = new BitmapImage();
        await obj.Image.SetSourceAsync(stream);
    }
}

var tasks = fileNames.Select(f => LoadImage(f, obj)).ToArray();
await Task.WhenAll(tasks);

これにより、イメージをロードする待機可能なタスクの配列が初期化され、それらが同時に実行されるようにすべてのタスクが同時に待機されます。

于 2013-05-21T04:54:58.907 に答える