60fpsでCADisplayLinkによって呼び出されるOpenGLESで実行ループを作成しました。AFAIK CADisplayLinkは、バックグラウンドスレッドでターゲットを呼び出します。
実行ループで使用される状態変数は約100個あります。
問題:メインスレッドから、何かを描画するために実行ループで使用される状態変数を変更したいと思います。フレームは、すべての状態変数がターゲット値に設定された後にのみ描画する必要があります。
ある時点で状態変数を変更しても、まだすべてを変更していないのではないかと心配しています(メインスレッドでの同じ実行ループの反復での1つの大きなメソッドで)。たとえば、幾何学的形状の位置には、複数の変数があります。 -スレッド関連のクラッシュまたは、状態変数を更新するメソッドの途中でCADisplayLinkが起動し、ガベージまたはクラッシュが発生する問題。
明らかに、同期プロパティまたはアトミックプロパティを使用するだけでは、トランザクションではないため、役に立ちません。取引が必要だと思います。
私の素朴なアプローチはこれです:
実行ループによって読み取られたインスタンス変数:
BOOL updatingState;
updateStateがYESの場合、runloopメソッドは描画をスキップします。
次に、状態の変更を開始する前に、YESに設定しました。そして、すべてが変更されたら、NOに戻します。
もちろん、問題:これを変更しているときにrunloopメソッドが値を読み取っている場合はどうなりますか?
ゲームエンジンはこの問題にどのように対処しますか?次のフレームが描画される前に状態変数の変更を終了できるように、どのようなロックメカニズムがありますか?