頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


semaphoreでコードがスッキリする

強化学習(DQN)に強引にSceneKitの物理エンジンを使う
↑ここでSCNSceneRendererDelegateメソッドの
- (void)renderer:(id)renderer updateAtTime:(NSTimeInterval)time;
内でオブジェクトの位置・姿勢・速度・角速度の4つを取得してるとあったけど、呼び出し元で、
nextStatus = [sceneManager getNextStatusFor:currentStatus action:action];
てな感じでコードを書けるとすっきりする。

- (void)renderer:(id)renderer updateAtTime:(NSTimeInterval)time;
実際は↑このメソッドは適当な時間にコールされて何回目かにようやく欲しい値を得られる、ということになる。
なので
[sceneManager getStatusFor:currentStatus action:action];
で計算をスタートさせて、実際に欲しい値を取得できた段階でdelegate使うなりして呼び出し元で値を入手する、、、
とか書くともう処理をたどるのが大変になってくる。
なので、今回も

Metal Performance Shaderで同期処理っぽく記述する
↑これと同じ方法を使ってる。このsemaphoreを使う記述方法がすっごいお気に入りなんだわ。
-(Status)getNextStatusFor:(Status)status action:(Action)action
{
    currentStatus = status;
    applyTorque = [self getTorqueForAction:action];
    
    semaphore = dispatch_semaphore_create(0);
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        self->calculationMode = CM_START;
        
    });
    
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    
    return currentStatus;
}
↑呼び出し元からはこれを呼び出して、ここでは値を得るまでwaitさせておいて、SCNSceneRendererDelegateメソッド内で値を得た時点で
dispatch_semaphore_signal(semaphore);
してやると値をreturnする。
この方法、ホント重宝するわ。

<< アプリでMacの輝度調整  TopPage  強化学習(DQN)に強引にSceneKitの物理エンジンを使う >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/1151-acfdef49




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad