簡潔にするために、私は非常に大きな2D空間を単純なビット配列にマップしました(実際には約200kのメンバーです)。2つの巨大な配列の間の変化の発見
ここで、1
の「円」を描く小さなアルゴリズムを実行して、中心点と半径を指定したとします。
ここで左側の円が描かれ、そして次の計算上、それは今、私はこれらのマップの多くの層を持っている、とした後、私は計算1.
0000000 0001000
0001000 0011100
0011100 -> 0011100
0011100 0001000
0001000 0000000
0000000 0000000
上に移動し、センターの例ですそれらを「平坦化」する必要があります(Photoshopのブレンドレイヤーオプションのようなものです)。そして、現在、私はアレイ全体で毎回反復し、配列全体を結合します。
擬コード
for(int x = 0; x < width; x++)
for(int y = 0; y < height; y++)
int index = x + y * width
result[index] = layer1[index] * layer2[index]
これは非常に非効率的であり、私は自分のパフォーマンスを改善する必要があります。
UPDATE:私たちは
スパース行列は、我々は必要なものを正確にだったやってしまった、と我々は最高の私たちの使用を適したキーの辞典(DOK)は(動的それぞれを構築する使用して終了何それらを一緒に「ブレンド」する)。これ部材マーキング、
- float配列は、我々は(値)
- ビット配列(同じサイズ)を有する可能性があるメンバーの最大数として寸法:
我々は思い付いた溶液を3つの配列を使用することでしたvalue配列内のメンバのポインタへのポインタの一種として使用されるインクリメントint + value配列内で使用されるインデックスを保存する+
- int配列(同じサイズ)インデックス配列
私たちのニーズはメモリ使用量とCPUに大きく依存していたので、ブレンドごとに新しい配列を生成しないために、各疎行列を二重バッファ形式でラップしました。
最終的には、このソリューションではCPU使用率が従来よりも15倍向上しました(メモリ使用量を約98%削減しました)。私が理解から
ちょっと返事に感謝 - 私はそれについて考えたが、どのように私はどの時点で知っていることは、このソリューションは、現時点では私が持っているものよりも少ない効率的になるのでしょうか? – Ron
変更層が「疎」ではない場合 – Lagerbaer
もう一つの問題は、私は私の例を簡略化して言ったように - 私は、各「ピクセル」のための浮動小数点数としての私のデータを保存する - 私はこのスパース行列を保存するだろうか?動的リストは明らかに非常に非能率的である。 'PixelData [width * height] _sparseMatrix'のように見えますか?そのために – Ron