背景: 私の質問が曖昧すぎないことを願っています。影響を受けるメソッドは非常に複雑で時間がかかるため、可能な限り説明し、あまり多くのコードを投稿することはできません。したがって、私の問題は、複数のスレッドで処理を高速化しようとしていることです。このアプリケーションは、2Dゲームエンジンの照明用であり、シーンの上部にさまざまな透明度レベルの黒い長方形を描画します(これにより現在ラグが発生しています)。
私にとっての最初のステップは、同じ光レベルの隣接する長方形をバッチ処理して、レンダリング作業を減らすことでした。これはうまくいきました(おそらくそれはもっとうまくいくかもしれませんが、今のところ重要ではありません)、そして今私は粗いスレッドシステムも実装しました。
私の質問の核心:上記の特定のバッチ処理方法のタイミングを分析しているときに(別々のばらばらのデータセットで動作するスレッドの数が異なる場合)、いくつかの奇妙なスパイクに気づきました。以前は、1つのスレッドで作業する場合、メソッドの実行には約12ミリ秒かかり、15ミリ秒に奇妙なジャンプがありました。あまり考えていませんでした。ただし、2つまたは3つのスレッドで処理する場合、4〜5ミリ秒かかり、10ミリ秒にジャンプし、場合によっては20ミリ秒にもなります。
今では、コードを調べないと原因がわからないことに気付いたので、そうは思いません。むしろ、私はいくつかの結論を導き出そうとしており、今それらを確認したいと思います。前に述べたように、各スレッドは私のデータセットの一部で機能し、互いに完全に切り離されています(それらは重複していません)。ただし、データ配列へのエントリポイントは、特定のクラスの同じインスタンスの同じメソッドを経由します。したがって、スレッドはすべて同じ方法で同じ配列にアクセスします(ただし、その一部は別々です。このため、ロックも使用しません)。これにより、予期しない速度低下が発生する可能性がありますか?
それとも、スレッドがこのように動作するのはおそらく正常な動作ですか(実行時間は標準の2倍以上に変化します)?別の注意点として、必要なときにすべてのスレッドを作成し、実行して完了させます。
データセットへのアクセス方法:
public short GetLightLevelAt(int x, int y)
{
if (inLightingBounds(x, y))
{
return lightData[x, y];
}
else
{
return GuessLightLevelAt(x,y); //This won't ever happen currently, guaranteed
}
}