7

パフォーマンスに大きな問題があります。問題は、私の Web サイトの 1 つに、約 180 の画像を呼び出すスライダーがあることです。これらの 180 枚の画像はそれぞれ、個別の URL を介してクライアント ブラウザによってダウンロードされます。これらは gif と jpg の混合物であり、それらを 1 つの画像に結合したいと考えています。透過性は問題にならないので、できればjpgです。画像は SQL データベースに保存され、MVC コントローラーを介して表示されます。このスプライトは、従来の一般的な ashx ハンドラーではなく、MVC コントローラーを介して作成することもできると思います。

グーグルで検索したところ、 Scott Hanselman によるブログ投稿に出くわしました。この投稿では、チェック画像を組み合わせる方法を説明し、一般的にやりたいことを行います。2005年に書かれたものなので、もっと良い方法があるかどうか知りたいです。別のプロジェクトで ImageResizer を使用しています。IIS と .NET を使用した画像のサイズ変更について、プロジェクトの創設者と話しているHanselman 氏によるポッドキャストを聞きました。私はそのポッドキャストと私の経験から、.NET と IIS での画像操作が奇妙になる可能性があることを知りました。

この方法で画像のサイズを変更してスプライトにマージすることはまだ良い考えですか? スプライト ジェネレーターは必要ありません。.gif と jpg を組み合わせて、スプライトとして使用できる単一の画像にする効率的な方法が必要です。

4

1 に答える 1

7

ファイル全体がダウンロードされるまで、すべての画像の「初期表示」を遅らせるため、すべてを 1つの画像に結合することはお勧めしません。目に見えるものをできるだけ早くロードし、残りを全体的なスループットのために最適化することをお勧めします。

たとえば、画像がそれぞれ 50KB 未満の場合、それらをスプライト画像として結合することは理にかなっているかもしれませんが、一度に 10 個ずつ結合することをお勧めします。画像がそれぞれ 5KB のように小さい場合は、一度に 30 個が妥当です。

ここには、心配すべき一連のボトルネックがあります

  1. HTTP のオーバーヘッドと同時接続の制限 (スプライト画像がこれに役立ちます)
  2. サーバーのスループット オーバーヘッド (正しいディスク キャッシングとエッジ キャッシングで解決可能)
  3. ブラウザのレンダリング オーバーヘッド (スプライトはアイコンや小さなサムネイルに最適です。巨大であってはなりません。1 メガピクセル未満に保つようにしてください)。

既存の画像を結合して jpeg 形式で再圧縮すると、圧縮が改善される場合もありますが、アーティファクトが発生する場合もあります。たとえば、線画と写真を混ぜるのはよくありません。jpegは線画が苦手です。必要に応じて、PNG、さらには PNG-8 を使用してください。場合によっては、100% 品質の JPEG が GIF または PNG バージョンよりも小さくなることがありますが、ほとんどの場合、線画は PNG 形式で保存するのが最適です。

これらの写真の ID を持っていて、ディスク キャッシュを使用した動的ルートを計画している場合は、タスクが大幅に簡素化されます。

ImageResizerライブラリを使用すると、動的パイプラインとディスク キャッシング システムに非常に簡単に「プラグイン」できます。

この場合、 と を実装IVirtualImageProviderIVirtualBitmapFileます。ビットマップを生成し、残りをパイプラインに処理させる簡単な例については、 Gradient プラグインを参照してください。

URL 構文を定義し、FileExists メソッドと GetFile メソッドでそれを探す必要があります。/combine-images.ashx?idlist=34,56,79,23&dir=horizo​​ntal&width=50&height=50 のようなもの。

次に、各画像を読み込み、マネージ APIを使用してビットマップ インスタンスにサイズ変更し、割り当てたキャンバスに描画する必要があります。

ボトルネックのほとんどは、おそらく SQL からイメージをプルすることにあるでしょう。サーバーの RAM が限られている場合は、並列アプローチよりもシリアル アプローチの方が安全かもしれません (つまり、SQL から一度に 1 つのイメージを取得し、サイズを変更して描画し、データを破棄して先に進みます)。ソース イメージが小さい場合は、マルチスレッド アプローチで問題ない可能性があります。リクエストはデフォルトで 30 秒後にタイムアウトするため、ディスク キャッシュであっても高速にする必要があることを覚えておいてください。適切に実行すると、空のディスク キャッシュを使用して 2 秒未満で 10 個の画像スプライトを提供できるはずです。キャッシュ後は 20 ミリ秒かかります。

これが少し難しいと思われる場合は、カスタム プラグイン開発を提供しますが、待ち行列があります。

リクエストごとに 1 ファイルのアプローチには多くの利点があり、スプライト バンドワゴンに飛び乗る前に、ImageResizer のディスク キャッシュと SqlReader プラグインを試す価値があるかもしれません。それが間違ったアプローチだと言っているわけではありませんが、キャッシュされていない MVC+SQL は、寄与している可能性のある多くのオーバーヘッドを追加する可能性があります。

于 2012-04-24T18:34:10.020 に答える