lambda 回调中 Android Cocos2D-x 应用程序段错误
Seg fault on Android Cocos2D-x app in lambda callback
我在 Cocos2D-X 游戏的 Android 版本中遇到了一个奇怪的崩溃问题。
在很多地方我都有回调,当其他一些动作完成时执行,像这样调用:
playAnimationOnce(animationName, [this] {
m_animationStateMachine->changeState(TWITCHING_ANIM_STATE);
m_stateMachine->changeState(DEAD);
});
在 Android 上,m_animationStateMachine
能够很好地更改状态,但是,对 m_stateMachine
的任何引用都会导致崩溃,具体而言:
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x3f800044
Stack frame #00 pc 008ed5ec /data/app/com.bundleID.appname/lib/arm/libcocos2dcpp.so (_ZN12StateMachine11changeStateEPK5StatePKv+52): Routine StateMachine::changeState(State const*, void const*) at /path/to/project/proj.android-studio/app/jni/../../../Platform/Util/StateMachine.cpp:158
Stack frame #01 pc 007ef73c /data/app/com.bundleID.appname/lib/arm/libcocos2dcpp.so: Routine operator() at /path/to/project/proj.android-studio/app/jni/../../../Source/Actors/Hero.cpp:1291
游戏在 iOS 上运行良好。我什至在 XCode 上针对 iOS 逐步执行回调,并验证该对象在 iOS.
上有效
我没有办法在 Android 上使用调试器,所以我无法比使用日志语句更好地检查每个变量。
我已经尝试过的事情:
- 使用
[&]
而非 [this]
进行捕获
- 创建一个只有两个状态的
StateMachine
的全新实例,这也导致了崩溃。
还有其他一些我现在忘记的事情。请随时向我发送任何和所有建议,我不知道是什么原因造成的。
我想通了。
我仍然不知道 Android 是什么导致了这个问题,所以如果你知道,请告诉我。
本质上,当 m_animationStateMachine->changeState
被执行时,一个新的动画播放清除当前 运行 个动画,并使用 cocos2d-x 方法清除动画回调。
我认为这导致 m_animationStateMachine->changeState
之后的所有行都在某些未定义的上下文中执行。
我通过将 m_animationStateMachine->changeState
作为回调的最后一行,并在播放新动画之前更改 class' 状态来解决此问题。
将此作为答案发布,以便我可以在几天内解决这个问题,也许这对将来的其他人有所帮助。
我在 Cocos2D-X 游戏的 Android 版本中遇到了一个奇怪的崩溃问题。
在很多地方我都有回调,当其他一些动作完成时执行,像这样调用:
playAnimationOnce(animationName, [this] {
m_animationStateMachine->changeState(TWITCHING_ANIM_STATE);
m_stateMachine->changeState(DEAD);
});
在 Android 上,m_animationStateMachine
能够很好地更改状态,但是,对 m_stateMachine
的任何引用都会导致崩溃,具体而言:
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x3f800044
Stack frame #00 pc 008ed5ec /data/app/com.bundleID.appname/lib/arm/libcocos2dcpp.so (_ZN12StateMachine11changeStateEPK5StatePKv+52): Routine StateMachine::changeState(State const*, void const*) at /path/to/project/proj.android-studio/app/jni/../../../Platform/Util/StateMachine.cpp:158
Stack frame #01 pc 007ef73c /data/app/com.bundleID.appname/lib/arm/libcocos2dcpp.so: Routine operator() at /path/to/project/proj.android-studio/app/jni/../../../Source/Actors/Hero.cpp:1291
游戏在 iOS 上运行良好。我什至在 XCode 上针对 iOS 逐步执行回调,并验证该对象在 iOS.
上有效我没有办法在 Android 上使用调试器,所以我无法比使用日志语句更好地检查每个变量。
我已经尝试过的事情:
- 使用
[&]
而非[this]
进行捕获
- 创建一个只有两个状态的
StateMachine
的全新实例,这也导致了崩溃。
还有其他一些我现在忘记的事情。请随时向我发送任何和所有建议,我不知道是什么原因造成的。
我想通了。
我仍然不知道 Android 是什么导致了这个问题,所以如果你知道,请告诉我。
本质上,当 m_animationStateMachine->changeState
被执行时,一个新的动画播放清除当前 运行 个动画,并使用 cocos2d-x 方法清除动画回调。
我认为这导致 m_animationStateMachine->changeState
之后的所有行都在某些未定义的上下文中执行。
我通过将 m_animationStateMachine->changeState
作为回调的最后一行,并在播放新动画之前更改 class' 状态来解决此问题。
将此作为答案发布,以便我可以在几天内解决这个问题,也许这对将来的其他人有所帮助。