cocos2d-x 3.0 程序从安卓后台切换回来后PhysicsBody自己会动

遇到一个奇怪的问题,是用windows开发,部署在安卓机器上,按照如下步骤:
1、在屏幕上创建一个PhysicsBody,代码非常简单(具体见附件)。
// 创建物理世界
auto scene = Scene::createWithPhysics();
scene->getPhysicsWorld()->setDebugDrawMask(cocos2d::PhysicsWorld::DEBUGDRAW_ALL);

// 创建物理边界
auto contentSize = this->getContentSize();
auto edge = Node::create();
edge->setPhysicsBody(PhysicsBody::createEdgeBox(contentSize));
edge->setPosition(contentSize.width / 2, contentSize.height / 2);
this->addChild(edge);
// 创建一个PhysicalBody
auto role = cocos2d::Sprite::create(“block.png”);
auto roleSize = role->getBoundingBox().size;
role->setPosition(contentSize.width / 2, roleSize.height / 2);
role->setPhysicsBody(PhysicsBody::createBox(roleSize));
this->addChild(role);、
2、打包成apk(见附件)。
3、在安卓机器上运行
4、不要退出程序,按机器的HOME切换,之后再进入一次程序,此时PhysicalBody会莫名其妙地弹起来。

cocos2d-x版本v3.0beta2,在三星note2和小米3都会有同样的问题。

哪位大神可以解决一下?

应该是很普遍的问题,没人遇到吗?

在AppDelegate::applicationDidEnterBackground()中取消物理效果,AppDelegate::applicationWillEnterForeground()恢复

能说的详细一点吗?添加什么样的代码,看了Physical相关的接口,比如PhysicalWorld,好像没有相关的代码。
多谢了!

官方的demo(cocos2d-x 3.0 beta2),编译出testcpp.apk,运行PhysicsTest,也会有同样的问题。
有可能是cocos2d-x物理引擎的bug,有大神解释一下吗?

好像只在部分android机器上才会出现,我刚拿了中兴nubi测没有出现,可能跟这个issue有关系
http://cocos2d-x.org/issues/3715
我会在近期试着修复下。。。

我这边三台机器,都有类似的问题。
好像是和重力有关,PhysicalWorld的重力如果设置为0,Body不会出现抖动。
cocos2d-x物理引擎的源代码中,有一些类似这样的:body->applyForce(-_gravity); 不是很明白。

刚刚搭建好环境,可以调试安卓真机,我再找找边界条件。
正在考虑用不用物理引擎,原生的chipmunk和box2d好像都没有类似的问题。

如果可以,有消息时麻烦用站内信通知我一下。
急等,谢谢!

body->applyForce(-_gravity); 是反重力的,跟这个bug应该没有关系。
现在还不知道是什么问题造成的,我最近会着重修复这个bug,一修复就通知你。

在函数PhysicsWorld::update中,如果程序从后台切换回来,_updateTime会很大,bug好像和这个有关。
这也解释了我测试时的一个现象,按HOME退出,越长时间切换回程序,Body移动的速度可能越大,甚至会弹出飞机屏幕。

我按照ChipmunkTest.cpp中的update方法修改PhysicsWorld::update,如下,问题好像得到解决。
但我不明白的是,Body是静止的,并没有速度和加速度,_updateTime是如何影响移动的?

这只是从现象来说,纯属猜测,希望对解决问题有帮助。
等待你的回信。

if (++_updateRateCount >= _updateRate)
{
    if (_updateTime > 0.2f) 
    {
        _updateTime = 1 / 60.0f;
    }
    _info->step(_updateTime * _speed); 
    _updateRateCount = 0;
    _updateTime = 0.0f;
}

不好意思,更正代码如下:
if (++_updateRateCount >= _updateRate)
{
float dt = Director::getInstance()->getAnimationInterval() / 1.5f;
_info->step(dt);
_updateRateCount = 0;
_updateTime = 0.0f;
}

我刚刚在小米3跑了下,没有发现有这样的问题。
你确定你用的版本是3.0rc0?
之前有fix一个这样的bug,参考下面的issue链接:
http://cocos2d-x.org/issues/3509

可以看下我提的链接:http://cocos2d-x.org/issues/4404
最开始是用cocos2d-x 3.0beta2,前几天换成了cocos2d-x 3.0rc0,都有一样的问题。
在rc0中,把测试例的名字由PhysicsTest改成了Node:PhysicsTest。

如附件所示,我重点看了三个测试例:One Way Platfrom、Slice和Joints。
像Joints,很多Body会一起动,长时间停留再返回,甚至会错位,正好有一个截图,也在附件。

我手头有三台机器,note2、mi3、还有一个motor的,都有类似的问题。
并不是每次一定出现,但10次至少有5、6次出现。
晚上我再借其它的手机看看

和3509描述的应该是同一个问题,但现在仍然存在。
另外,按照昨天描述的8楼的代码,不知道为什么,我自己的测试例未再出现问题。

看了你的图片,但是我用小米3一直都重现不出来,没法重现就没办法处理啦,只能下次有遇到的时候再说了。

今天又找了几台机器,见附件,包括三星note2、小米3、华为c8815、酷派5891、motorxt615。

其中在三星note2出现频繁最高,建议使用三星机器测试。
小米3出现的频率有点低,但确实也有这个问题,大概10次里有2、3次,按home键返回后时间长点再返回。

另外,新发现一个更容易出现的方法,在5台机器都很容易复现。
1、进入一个物理测试例,比如one way platform、 joint、slice。
2、按手机电源键关闭手机屏幕。
3、重新打开手机,这时应该直接出现第1步中的物理测试例。此时Body会发生乱动
4、box2d-testbed也有一个测试例one way platform,但不会有这样的问题。
我在小米3每次必现。

这个问题很严重,会直接导致物理引擎不可用。
所以还是解决一下吧,越早解决影响越小。

感谢回复。
找到原因了,跟之前修复的那个issue是一样的
http://www.cocos2d-x.org/issues/3509

因为后来我们前后台切换调用的接口从resume改成startAnimation导致bug又出现了
修复的PR:
https://github.com/cocos2d/cocos2d-x/pull/5915

再次感谢反馈bug

我在DisplayLinkDirector::startAnimation后加了setNextDeltaTimeZero(true);
问题仍然没有得到解决,已经确认代码得到更新,目前只在note2上测试,稍后我再找其它机器。

可能和bug##3509不是一个问题,麻烦也再重新看一下,最好找台三星机器测试。

在小米3上确实不容易复现,要按HOME键之后等很久,才有概率出现。
目前还没找到复现条件。

不过在三星note2几乎是每次必现

额,,好吧,,我这两天再试试。。。

试一下这样是不是可以了