1

arrayまたはstd::vector;で表されるイメージがメモリにあると想像してください。この例では、画像が 400x300 ピクセルのようなものであり、この構造を最大 64x64 ピクセルの正方形 (またはタイル) に分割したいとも想定しています。

私が検討している配列は、このように宣言されています

int a[400*300];

そして好きではない

int a[400][300];

これは、1 つの連続したメモリ チャンクです。

私が言いたいのは、データ構造とそのデータ構造へのアクセスを可能な限り線形に保つよう常に心がけているということです。イメージを正方形に分割するには、イメージがメモリ内でどのようにレイアウトされているかに応じて、1 つの行から別の行へ、または 1 つの列から別の列へジャンプする必要があります。画像のサイズと寸法が与えられた場合、正方形の境界を計算するのに問題はありませんが、このアプローチを使用することに実際の利点が見られずに、この正方形の反復を表現するときに少し複雑になりすぎます。

では、なぜこの種の細分化ステップに関する解決策がそれほど人気が​​あるのでしょうか? 一度に1行または一度に1列のようにレンダリングしないのはなぜですか?

4

1 に答える 1

3

メモリの局所性 / キャッシュの一貫性。ほとんどの画像処理操作は 2D で実行され、メモリ アクセスを効率的に行うには、2D で互いに近いピクセルをメモリ内で互いに近づける必要があります。このようにデータをブロックに配置すると、単純な線形レイアウトを使用した場合よりも、同じ x 座標と隣接する y 座標を持つ 2 つのピクセルのメモリ アドレスが平均して近くなります。

画像をレイアウトするより複雑な方法があり、GPU によってレンダリングされるときにテクスチャによく使用され、平均してさらに優れたメモリの局所性を提供します。

于 2013-11-09T06:24:37.947 に答える