0

ゲームを起動すると、バックグラウンドでリソースをロードしている間、画面にロード中の画像が表示されるようにします。これを行うには、単純な UIImageView コンポーネントをロードし、それに「スピナー」を追加して、デバイスがバックグラウンドで何かをロードしていることをユーザーにフィードバックします。

この画像が表示されている間に、すべての画像とテクスチャを読み込み、OpenGL ビューを設定してレンダリングします。2 番目のフレームがレンダリングされたら、ImageView を非表示にして、OpenGL ビューのみを表示します。レンダリングに非常に時間がかかるため、OpenGL ビューを最初のフレームに表示したくありません。

ただし、すべてのリソースをロードし、OpenGL ビューの DisplayLink をセットアップして新しいスレッドでレンダー ループに入り、ロードが完了したときに OpenGL ビューを表示することに問題があります。レンダリング ループが開始していないようです。

これが私のView ControllerのloadViewメソッドです

- (void)loadView 
{
CGRect mainScreenFrame = [[UIScreen mainScreen] applicationFrame];

    // Set up the image view
    UIImage *img = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"Startscreen" ofType:@"png"]];
    _imageView = [[UIImageView alloc] initWithFrame:mainScreenFrame];
    _imageView.image = img;

    // Set up the spinner
    _spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    [_spinner setCenter:CGPointMake(mainScreenFrame.size.height/3.0*1.85, mainScreenFrame.size.width/10.0*7.55)];
    [_imageView addSubview:_spinner];    
    [_spinner startAnimating];

    // Show the loading image
    self.view = _imageView;

    /* Load resources in a new thread -- this shows the spinner during loading */
    [NSThread detachNewThreadSelector:@selector(loadGLView) toTarget:self withObject:nil];
}

loadGLView は次のことだけを行い、OpenGL ビューを初期化し、ロード プロセスを開始します。

_glView = [[JungleOpenGLView alloc] initWithFrame:mainScreenFrame];

これは、OpenGL ビューで DisplayLink をセットアップする方法です。

CADisplayLink* displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(setupRender:)];
[displayLink setFrameInterval:2];
[displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

2 番目のフレームがレンダリングされると、通知が送信され、ViewController が設定されます

self.view = _glView;
4

1 に答える 1

0

私は自分の間違いを見つけました。次のように、読み込みメソッド用の新しいスレッドを作成する代わりに:

[NSThread detachNewThreadSelector:@selector(loadGLView) toTarget:self withObject:nil];

私が使用した:

[self performSelectorInBackground:@selector(loadGLView) withObject:nil];

それはトリックを行います。このテーマ (スレッドの作成) についてよく読んでください。

于 2012-11-05T09:21:07.487 に答える