ピクセルの束を計算し、QtConcurrent::mappedReduced
を使ってQImageに入れたいと思います。しかし、私はQImage::setPixel: coordinate (636,442) out of range
エラーを取得します。これはおそらく、nullイメージを作成するデフォルトのQImageコンストラクタを使用しているためです。ドキュメンテーションでコンストラクタの引数を設定する方法や、縮小の初期値を提供する方法を見つけられませんでした。これを行う方法はありますか? JSのように初期値を指定する必要があると思っていましたが、Qtはおそらく別のアイデアを持っていました。QtConcurrentを初期値で減らす
スケルトン:私は回避策を見つけた...しかし、今私は、チェック減速を実行するたびに確認する必要があるため、このコードは...最適ではない
struct Pixel{
QRgb value;
QPoint pos;
};
void reducer(QImage &result, const Pixel &pixel){
result.setPixel(pixel.pos,pixel.value);
}
...
void reducer(QImage &result, const Pixel &pixel, int width, int height){
if(result.width()==0)
result = QImage(width,height, QImage::Format_RGB888);
result.setPixel(pixel.pos,pixel.value);
}
...
auto boundReducer = std::bind(reducer,_1,_2,width,height);
ありがとうございます:ああ...あらかじめ構築された画像を渡すのは意味がありますが、減速器の単純さのためにパフォーマンス上の問題が生じると思われるのはなぜですか? – petoknm
@petoknm 'setPixel'オペレーションは、' pixel'コンテナを繰り返し、処理するためにピクセルをスレッドプールに送出するオーバーヘッドよりもはるかに時間がかかりません。 'setPixel'はメモリへの32ビットの書き込み操作です。それを並列化することには意味がありませんが、できるだけ速く実行できるのは完全なメモリ帯域幅であるからです。この動作は、制約されたメモリ帯域幅、換言すれば、である。 I/O制約は並列化では得られません。 y、xに沿ってピクセルコンテナを並べ替えることができますし、繰り返してRAMの速度になります。 –
説明をありがとう – petoknm