私はこれを行うための最良の方法を見つけようとしていますが、私がやろうとしていることを正確に理解するのに少し行き詰まっているので、それが何であるか、私が何であるかを説明しますやりたいと思っているのですが、行き詰まっています。
私は単一の配列(実際には画像)を持つプログラムに取り組んでいます。このプログラムでは、フレームごとに多数のオブジェクトを画像配列に配置できます。各オブジェクトは、他のすべてのオブジェクトから完全に独立しています。唯一の依存関係は出力であり、理論的には、これらのオブジェクトのうち2つを配列の同じ場所に配置することが可能です。より多くのオブジェクトを配置できるように、画像上にオブジェクトを配置する効率を高めようとしています。それをするために、私は問題をスレッド化したいと思っています。
スレッド化に向けて私が取った最初のステップは、単にアレイをミューテックスで保護することです。配列にオブジェクトを配置するすべての操作は同じ関数を呼び出すので、ミューテックスロックを1か所に配置するだけで済みます。これまでのところ、機能していますが、私が期待するような改善は見られません。これは、ほとんどの場合、制限要因がイメージ書き込みステートメントであるためであると私は仮定しています。
次に行う必要があると考えているのは、書き込み先の複数のイメージバッファーを用意し、すべての操作が完了したらそれらを結合することです。あいまいさは問題ではありません。必要なのは、ピクセル数を単純に足し合わせることだけです。しかし、これを行うためにどのメカニズムを使用する必要があるかを理解するのに苦労しています。セマフォを見てきましたが、バッファの数が制限されることはわかりますが、2つ以上のプログラムが同時に同じバッファに書き込もうとして、不正確になる可能性がある状況を想像できます。
新しい非標準ライブラリを含まないソリューションが必要です。私は解決策を構築することをいとわないが、私は現在暗闇の中でたださまよっているので、正しい方向へのいくつかの指針を非常に高く評価するだろう...
これを視覚化するために、たとえば、画像配列のさまざまな場所にボールを配置するように指示されたと想像してください。与えられた明るさ、場所、サイズで、フレームごとにボールを配置するように言われています。ボールの正確な位置は、前のフレームの物理特性によって異なります。すべてのボールは、可能な限り迅速に最終的な画像配列に配置する必要があります。この例では、2つのボールが重なり合っている場合、明るさを単純に足し合わせることができるため、一方が他方をブロックしているかどうかを判断する必要はありません。また、GPUカードを使用しないでください;-)
疑似コードは次のようになります:(場所、明るさ、サイズに論理オブジェクトが指定されていると仮定します)。また、isValidPointは、円の位置と半径を指定して、点が円上にあるかどうかを単純に検出するとします。
global output_array[x_arrLimit*y_arrLimit)
void update_ball(int ball_num)
{
calc_ball_location(ball_num, *location, *brightness, *size); // location, brightness, size all set inside function
place_ball(location,brightness,size)
}
void place_ball(location,brighness,size)
{
get_bounds(location,size,*xlims,*ylims)
for (int x=xlims.min;x<xlims.max;y++)
{
for (int y=ylims.min;y<ylims.max;y++)
{
if (isValidPoint(location,size,x,y))
{
output_array(x,y)+=brightness;
}
}
}
}