7

私のメインビューコントローラーには多くのサブビューが含まれています。そのようなサブビューの1つは、にGLKViewリンクされていGLKViewControllerます。はの表示GLKViewControllerの更新を担当しているようで、GLKView自動魔法の何かがメインスレッドでその更新関数を呼び出しています。

このメインビューコントローラの他のビューの1つはUITableViewです。ユーザーがテーブルビューを操作しているとき、GLKView更新は停止します。

確かに、私はOGL ESプログラミングにかなり慣れていないので、これにどのようにアプローチするかわかりません。を取得する必要がありGLKViewControllerます

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect;

メインスレッドとは別のスレッドで呼び出されるメソッド。これによりGLKView、ユーザーが他の要素を操作している間、アニメーションを継続できます。

4

2 に答える 2

0

これはトリッキーです。私はそれを行う良い方法を見つけられませんでした。より良い方法があると確信していますが、私にとってパフォーマンスは大きな問題ではなかったので、それに落ち着きました。私は完全な解決策を持っていません.あなたが求めた方法で問題を解決していません. より良い解決策を思いつくことができれば、それを更新しますが、今のところこれがすべてです。

私が行った方法は、実際には の「上」に透明な ViewController がglkViewControllerあり、GLKViewController の上でやり取りしたいもの (tableViews、ボタン、ほとんどの UI など) がそれに追加されることです。 .

OverlayViewController私がこれを行う方法は、どこからでも簡単にアクセスしたいので、ビューコントローラーと呼ばれるシングルトンオブジェクトを持っていることです. そして、これがGLKViewController::viewWillAppearセレクターに追加されます。

そして、それは本当にすべての魔法です。したがって、IOKit タイプのオブジェクトをホストするオーバーレイ ビューがあります。このように追加します(サブクラスviewWillAppear:から貼り付ける方が簡単です)GLKViewController

- (void) viewWillAppear: (BOOL) animated {
    [[[OverlayViewController shared] view] setUserInteractionEnabled:NO];
    [self.parentViewController.view addSubview: [[OverlayViewController shared] view]];
    ...
}

これは基本的に、表示される 2 つのビュー コントローラーが存在することを意味しますが、それらは互いに「独立」しています。

ただし、このアプローチには明らかな問題があります。たとえば、どのビューが現在ユーザーの操作を受け入れているかを追跡するという面倒な作業があります。これは処理されません。

そうは言っても、GLKitでレンダリング専用のスレッドをディスパッチすることが可能かどうかを調べています。

于 2013-01-04T09:52:31.177 に答える