1

最初に言っておくと、以下はすべて cocos2d-x-2.1.4 に基づいています。

cocos2d-x の HelloCpp プロジェクトでは、呼び出していることがわかりますCCDirector::sharedDirector()->stopAnimation();(void AppDelegate::applicationDidEnterBackground()ここをクリックして確認してください)。

アプリが非アクティブなときにアニメーションを停止することを想定しています。そして、それは iOS で完璧に機能します。

しかし Android では、これを呼び出した後、stopAnimation()アニメーションを実行していた要素が点滅し始めます。また、デバイスのパフォーマンスが低下したため、表示が悪化しました。

次に、 を使用しようとしましたがCCDirector::sharedDirector()->pause()、パフォーマンスは悪くなく、アニメーションは停止し、点滅しませんでした。

したがって、これら2つの方法の違いを知りたいです。

ではCCDirector.h、次のコードを確認できます。

/** Pauses the running scene.
 The running scene will be _drawed_ but all scheduled timers will be paused
 While paused, the draw rate will be 4 FPS to reduce CPU consumption
 */
void pause(void);

/** Stops the animation. Nothing will be drawn. The main loop won't be triggered anymore.
 If you don't want to pause your animation call [pause] instead.
 */
virtual void stopAnimation(void) = 0;

ここでは「アニメーションを一時停止したくない場合は代わりに [pause] を呼び出してください。」 と書いてありますが、実際には を呼び出すとアニメーションを一時停止できpause()たので、戸惑いました。

そして、この投稿では、 で呼び出されるとアプリがクラッシュすると述べていCCDirector::sharedDirector()->pause();ますvoid AppDelegate::applicationDidEnterBackground()。しかし、自分でテストしたところ、このバージョンでは iO と Android の両方でクラッシュしませんでした。

pause()では、の代わりにを使用するとどうなるかを考えましたstopAnimation()

それから私はいくつかのテストをしました。最終的に結果が得られ、iOstopAnimation()よりも優れpause()たパフォーマンスを発揮しましたが、Android では逆でした。

したがって、コードを次のように変更したかったのです。

void AppDelegate::applicationDidEnterBackground() {
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    CCDirector::sharedDirector()->stopAnimation();
#elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
    CCDirector::sharedDirector()->pause();
#endif
}

void AppDelegate::applicationWillEnterForeground() {
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    CCDirector::sharedDirector()->startAnimation();
#elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
    CCDirector::sharedDirector()->resume();
#endif
}

今、誰かが私にいくつかの提案をすることができますか? または、良くない場合はその理由を教えてください。

4

1 に答える 1

2

一時停止すると、フレーム バッファの描画と表示が続行されますが、フレームレートは非常に低くなります (4 fps)。

StopAnimation は、描画を完全に停止します。現時点では、ディスプレイに何が起こるかは定義されていません。iOS では単に「フリーズ」する傾向がありますが、GL ドライバーの実装によっては、点滅が発生する可能性もあります。これは、ダブル バッファリングまたはトリプル バッファリングがフレーム バッファを循環し続けるが、cocos2d が最後に描画したフレームの内容を含むのはそのうちの 1 つだけである場合です。

ストップ アニメーションは、アプリがバックグラウンドに入る、またはアプリの上に別のビューを表示するなどして非表示になる状況のみを対象としています。それ以外の場合は、一時停止を使用してください。

まばたきを防ぐために、アプリがフォアグラウンドに入ったときに startAnimation を再度実行する必要があるのではないでしょうか? あるプラットフォームでは一時停止を使用し、別のプラットフォームでは stopAnimation を使用する必要はありません。

于 2013-11-01T11:09:53.043 に答える