2014年1月22日水曜日

Cocos2dとMKMapViewとOpenGLについて([[CCDirector sharedDirector]pause];)

Cocos2d for iPhoneを使用していて、iPhone標準のMapViewを表示するときの注意点です。

Mapを表示している間は、可能ならば
[[CCDirector sharedDirector]pause];
をしといたほうがいいです。


MapViewを表示する際は、下記コードで実現できます
(mapViewはメンバーにしています。

    CGRect frame = CGRectMake(50, 45, s.width - 100, s.height - 100);
    self.mapView = [[[MKMapView alloc] initWithFrame:frame] autorelease];
    _mapView.backgroundColor = [UIColor clearColor];
    _mapView.mapType = MKMapTypeStandard;
    _mapView.delegate = self;
    [_mapView setShowsUserLocation:YES];

    [[[CCDirector sharedDirector] view] addSubview:_mapView];

問題は、少し前のOS、具体的にはMKMapViewで呼び出されるのがGoogleMapのものでは、
地図が表示されなかったり、拡大縮小、移動がかくついたりする現象がありました。
それも毎回おこるわけではなく、再表示で直ったり直らなかったりで原因がよくわかりませんでした。

いろいろ考えた結果、そういえばGoogleMapってOpenGL使ってるのではと思いだしました。
もしやCocos2dとGoogleMapでOpenGLが競合して表示が変になっているのでは…

そこで、Map表示時に、Cocos側の描画処理を止める
[[CCDirector sharedDirector]pause];
を呼び出してみました。
すると、何回ためしてもMap側の表示がおかしくなる現象が見られなくなりました。
Mapの動作がいらなくなったり、Cocos側のアニメーションや画面遷移が必要になったタイミングで、
[[CCDirector sharedDirector]resume];
を呼び出せば、自分のアプリの場合は特に問題なく実装できました。

GoogleMap以外にも、OpenGLを使っているAPIを使用している方は、
参考になるかもしれません。


以上です。

0 件のコメント:

コメントを投稿