Chipmunk碰撞回调短时间内重入的解决办法
2015-11-09 20:05
155 查看
Chipmunk引擎中碰撞行为可能在细微处与一般认识略有不同.
比如碰撞回调方法可能会重入.不知道方法(函数)重入概念的童鞋可以自行谷哥或度娘.
第一次碰撞方法还未返回,第二次碰撞回调又被调用了.至于它们是否运行在同一线程,这个不知道.至少我调试中都在一个线程里.但在一个线程里也会发生重入.这里研究的不深入,有错误请指出.
最开始碰撞回调方法如下:
以上代码中的working短时间内偶尔会执行2次.第1次修改将star removeFromParentAndCleanup调用移至方法前部也不行.
第2次修改如下:
仍然不行,从日志上看star调用remove方法后其值仍有可能不为nil,导致if判断失败.
第3次修改增加了if判断条件为:
代码逻辑工作正常,在第二次重入时,star.parent一定为(还是不能肯定,说”应该为”比较妥当 ;)nil,所以避免了再次调用working逻辑.
可能我代码逻辑也有问题,不能依赖于方法的重入次数.因为有了物理引擎回调这个不确定因素,所以使得问题发生的很显然.
比如碰撞回调方法可能会重入.不知道方法(函数)重入概念的童鞋可以自行谷哥或度娘.
第一次碰撞方法还未返回,第二次碰撞回调又被调用了.至于它们是否运行在同一线程,这个不知道.至少我调试中都在一个线程里.但在一个线程里也会发生重入.这里研究的不深入,有错误请指出.
最开始碰撞回调方法如下:
-(BOOL)ccPhysicsCollisionBegin:(CCPhysicsCollisionPair *)pair star:(CCNode *)star stick:(CCNode *)stick{ StarType starType; if (!star) { return YES; } starType = ((Star*)star).starType; star = nil; } //working [star removeFromParentAndCleanup:YES]; return YES; }
以上代码中的working短时间内偶尔会执行2次.第1次修改将star removeFromParentAndCleanup调用移至方法前部也不行.
第2次修改如下:
@synchronized(self){ if (!star) { return YES; } starType = ((Star*)star).starType; [star removeFromParentAndCleanup:YES]; star = nil; } //working...
仍然不行,从日志上看star调用remove方法后其值仍有可能不为nil,导致if判断失败.
第3次修改增加了if判断条件为:
if (!star || !star.parent) { return YES; }
代码逻辑工作正常,在第二次重入时,star.parent一定为(还是不能肯定,说”应该为”比较妥当 ;)nil,所以避免了再次调用working逻辑.
可能我代码逻辑也有问题,不能依赖于方法的重入次数.因为有了物理引擎回调这个不确定因素,所以使得问题发生的很显然.
相关文章推荐
- Chipmunk僵尸物理对象的出现和解决(八)
- Chipmunk僵尸物理对象的出现和解决(八)
- Chipmunk僵尸物理对象的出现和解决(八)
- Chipmunk僵尸物理对象的出现和解决(七)
- Chipmunk僵尸物理对象的出现和解决(七)
- Chipmunk僵尸物理对象的出现和解决(七)
- RPM包管理(1)
- Chipmunk僵尸物理对象的出现和解决(六)
- Chipmunk僵尸物理对象的出现和解决(六)
- Chipmunk僵尸物理对象的出现和解决(六)
- iOS8.4后MPMoviePlayerController继续播放的bug以及修复方法
- 约吗? 免费领取一大波90后单身女神产品经理(增加5位女神)
- jbpm example
- Chipmunk僵尸物理对象的出现和解决(五)
- Chipmunk僵尸物理对象的出现和解决(五)
- Chipmunk僵尸物理对象的出现和解决(五)
- Chipmunk僵尸物理对象的出现和解决(四)
- Chipmunk僵尸物理对象的出现和解决(四)
- Chipmunk僵尸物理对象的出现和解决(四)
- Chipmunk僵尸物理对象的出现和解决(三)