私は最近、ゲームを作成するプロジェクトから始めました(私はちょっと新しいです)。そして、パフォーマンスを向上させるためにマルチスレッドを実装する方法について考え始めました。
ゲームにユニットがあり、そのユニットに位置x
とが含まれているとしy
ます。この位置は、インターネットから1つのトレッドによって更新され、別のスレッドがx,y
ユニットのグラフィックをレンダリングするために使用しています(どこにあるかを知る必要があります)。
ここで、これらの変数にミューテックスまたはセファモア(どちらを使用するのが最適かは少しわかりません)を設定するとします。もちろん、問題はレンダリングスレッドにあります。立ち止まって待つことはできません。ゲームが遅くなります。ただし、これはインターネットスレッドでは問題になりません。何か問題がない限り、ゲームを更新するのにさらに数ミリ秒は関係ありません。
そこで、どうすればこの問題を解決できるかを考えていたところ、アイデアが浮かびました。2セットを作成するとx,y
します(これからはx
、単純にするためにのみ使用できますが、アイデアは得られます)。だからあなたはとを持っていx1
ますx2
。
- 現在、インターネットスレッドはx1のみを更新しました。
- グラフィックスレッドはx1を使用してから、x2を現在の値に更新します。
今ここにアイデア。がインターネットスレッドからロックされている場合x1
、グラフィックスレッドは次のように表示します
「ねえ、私は待つことができません。それ
x2
は位置の非常に良い近似であるため、私は先に進んで使用します。」
x1
そして、それは再び自由になるまでそうします。こんな感じになります。
//Thread Graphics:
if (x1 is not locked){
lock x1:
use x1
unlock x1:
x2=x1
}else{
use x2
}
//Thread Internet:
wait until x1 is unlocked:
lock x1:
save data to x1
unlock x1:
これは余分なメモリを消費することに気づきましたが、少なくともこの手法の使用を重要なデータのみに制限する場合は、それだけの価値があると思います。
だから私の質問は:皆さんはこのアイデアについてどう思いますか?多分それはすでに一般的なテクニックです、私だけがそれの名前を知りません。このような問題を解決する方法について他にフィードバックがあれば、よろしくお願いします。これはほとんどのプログラマーに共通の問題だと思います。