私はiPhoneでopenGLプログラミングとマルチスレッドを初めて使用し、小さなopenGLゲームを作成しようとしていて、小さなパフォーマンスの問題に直面しています。
ゲームはグラフィックスを個別のopenGLビューとしてレンダリングし(私は今のところES 1.1を使用しています)、レンダリングエンジンはユーザーの方向(コンパスなど)に応じてグラフィックスを更新します。オンラインで人々の経験を経て、私は次のことを決めました。
- すべての openGL 関連の操作を別のスレッドで実行します (スレッド間での openGL 関連の操作はありません)。
- メインスレッドで位置情報サービスからコールバックを実行する
デリゲートを使用して、Location Controller と私の openGLViews の間で見出しの更新を通信します。
-(void)loadGame{ //other loading operations [self loadThreads]; [graphicsThread start]; } -(void)loadThreads{ //graphics thread is an ivar graphicsThread = [[NSThread alloc] initWithTarget:self selector:@selector(loadGameViews) object:Nil]; //load other thread related stuff } -(void)loadGameViews{ //create and load all openGLViews }
編集 :
-(void)loadGameViews{
//create and load all openGLViews
[self.openGLView performSelector:@selector(startAnimation) onThread:graphicsThread withObject:NULL waitUntilDone:NO];
}
コードは正常に動作しますが、フレーム レート (iPad でのテスト) が 40 FPS に低下していることに気付きました (シングル スレッドで実行している場合、iot は 60 でした)。知りたかった:
- 40 FPS がゲームの許容フレーム レートである場合。
- スレッド ロジックが正しい場合 (または、これを行うためのより良い方法はありますか?)
- フレームレートを 60 FPS に戻す方法があれば