Box2D切割复杂多边形

从切割简单的多边形到切割复杂的多边形,一路过来,遇到了很多很多的问题

总算是大体得到解决了,相当的happy呀,终于可以松口气了

要知道,如果这个算法无法完成,我筹划的这个游戏也就没什么想法了,间接等于我20多天的努力付诸东流

一开始是切割复杂多变性的功能想了蛮久才搞出来,还不得以用了goto跳转标签

记得以前看谭浩强c的时候,就特别不建议使用goto语句,容易让阅读代码的人甚至是自己思维混乱

但是经历这次,我明白了一个道理,无招胜有招,能够解决我的难题,那就是最最实用的招式

邓爷爷有言,不管黑猫白猫,能抓住老鼠就是好猫~

功能完成之后,我很高兴!但是过了不到几分钟,我就被打击到不行!

因为功能虽然实现了,但是接下来的麻烦却让我眉头紧皱~

出现了两个“发作率”相当高的bug。。。

bug不可怕,怕的就是bug刀枪不入,油盐不进,调个把星期都调不出来~

这次我就遇到了这么一个恶心的bug,也是我有史以来遇到的最最恶心的一个bug~

为我汩汩流逝的青春哀叹~

前两天是在是不行了,看到XCode我就想吐,头昏脑胀,比看到蟑螂老鼠还感到恶心~

我深深地知晓,这种状态短时间内肯定是不适合写代码了,我必须要给自己一段缓冲的时间!!

借着国庆黄金周,我在vs的魔兽对战中展开了无情的杀戮,杀或者被杀!用战争来遗忘bug带给我的种种郁闷

其实这几天也蛮累的,其实我压力也很大,家长年纪都大了,我必须要在短时间内开发出一款

能够真正用来盈利的游戏,一款好游戏!!如果能月入4000+,那么老父老母就不用在外面干事儿了,当然,如果有更多的话就更好了~

每每看到我在玩war3,老母亲就会很不爽,直接导致我玩的很不爽,各种郁闷~

多么希望能够将这个游戏做好,然后真正地拿到钱,到时候我要玩war3那就是名正言顺的放松休息了,因为毕竟有底了,做游戏能赚钱!

事情就是这么奇怪,玩了好几天游戏之后写游戏的状态总算是又回来了

昨天在游戏0。6版(也就是报错率非常高的那个初级版本)的基础上像5~6个分支上进行了整改,

没有太大的收获,依然还是错误照报,搞得我很烦,不过也排除了一些错误的可能性,

虽然没有搞出来,但是却让我心里有了一些底儿,而且我在冥冥中预感到,或许这个问题将很快就能得到解决

果不其然,今天中午搞了会儿,然后玩了一个下午的魔兽对战,吃个晚饭后看会儿小说,终于在今天晚上的继续尝试中,将bug给干掉了!!

心情自然是无比的舒畅啊,搞得我郁闷了那么久,终于云开雾散,能不爽么?!

特此将这两个该死的、杀千刀的bug拎出来通告批评:

Thread 1: Program received signal: "EXC_BAD_ACCESS".


哈哈,很功利,因为我确实是想靠这个在AppStore淘金的,所以初期的项目名称就叫做GoldMine了~

Thread 1: Program received signal: "SIGTERM".


遇到这两个bug的时候,我的第一感就是必须各个击破

按照惯例,我首先问google大神,但是由于这两个bug的稀有程度一点儿都不亚于大熊猫,所以基本上我没有得到什么直接的解决方案~

一般来说,EXC_BAD_ACCESS的出现都是由于在内存的操作上面出现了问题(非法访问)

我在网上找到的仅有的可能原因就是:在body正在使用的过程中将body destroy掉了,因此出现非法的内存~或者是因为多线程的原因~

but,ios上面的多线程我是一点儿都不懂,如果真是这个原因,那我就算是完蛋了,所幸不是!

关于第一个在body正在使用的过程中将body destroy掉了,这个就是我所坚信不移的bug原因了

根据这个线索,我一遍又一遍的翻查我的项目源文件,希望能找出一些蛛丝马迹~

但是偏偏就是让人这么样的很蛋疼,这个功能写出来岂会是仅仅的百来行代码?

而且加上又要处理各种出错的意外,顾忌程序的运行效率...我略微统计了一下,1000行代码以上了~

之前我还吹牛说一个月就要把这个游戏搞出来上线,现在看来绝对是没戏了,两个月都不一定有戏的!

其实我也想了很久,可能是由于不会用stl 的 vector才导致了这样的bug,于是我将容器元素为b2Body,b2Fixture的容器改为NSMutableArray,

将C++的b2Body,b2Fixture封装成objective-c的 对象(主要是为了能将这些鸟放进objc的 NSMutableArray 这个容器)~

想法是美好的,但是事实总是这么残酷,我失败了!而且失败的莫名其妙,按理说这样该来是不应该出现任何问题的,

但是出乎我意料的是:新产生的两个bug不被干掉也就算了,连之前我有做处理的几个略微底层一点儿的bug都被频繁的报出

一句话,我已经接近疯狂了。。。

按理说不应该表现的这么不一致的,但偏偏不可能出现的却出现了,这就是所谓的横生枝节呀!

当时已经是昨天夜里凌晨几点了,记得当时我很想睡觉了,偏偏我就是不甘心,非常不甘心!因此我又重新这么试验了一次

他妈的竟然还是表现出同样的症状,尼玛的,老子服了,不搞了,投降了,换别的思路去~

所幸个人有良好的项目备份习惯,也有良好的项目版本控制意识,因此我又回到上一步做其他流向的修改~

这次我将所有的NSMutableArray改用成vector,依然报错。。

我一次又一次的抑制不住自己的冲动,在google里面搜索“m_freeLists[index] = block->next”

尽管我知道奇迹是不会出现的,我还是很脑残的重复这一举动,每天重复一次,每次都让我失望而归

因为我实在是没辙了,眼前这个bug让我感到很无力,我简直被打击的不知所措,根本就不知道该如何是好了~

今天白天我都在想可能要妥协了,既然切割复杂多变性我弄不出来,就将就着用切割简单多边形吧,实在搞不出了也没其他办法了~

可是老天爷就是这么的滑稽,我搞得不想再搞的时候竟然在我的再一次尝试之下,问题得到了相当不错的解决~

出了很happy之外,实在是不知道说什么好!

描述一下我最后的一个思路:

我猜测可能是因为vector,NSMutableArray的析构,dealloc对b2Body,b2Fixture对象造成了一些影响!

我略微看过一点儿box2D的入门pdf,它里面是说box2d用一个小对象分配器来进行内存的优化管理

不推荐直接去释放b2Body,b2Fixture对象,而必须调用b2World的工厂方法DestroyBody()去销毁b2Body对象,

依附于b2Body对象的b2Fixture,b2Joint对象会自动的随着b2BOdy对象的销毁儿销毁....

我受到了一些启发,我决定不再vector里面装 b2Body,b2Fixture类型的对象了~

我新建了2个结构体类型,b2BodyProxy, b2FixtureProxy,

我使用这2个自定义的结构体类型来作为C++ STL vector的模板类型,这样的话,我就再不必担心vector析构时会对SOA池造成什么影响了~

之前报出的那个m_freeLists[index] = block->next错误,我一直猜测的就是在CreateBody重用SOA池中的内存时出现了非法的内存访问

导致这种情况最有可能的原因莫过于在销毁b2Body或b2Fixture的时候绕过了b2World所提供的工厂方法,出现了非法的操作!

我翻查项目的源文件也就是为了能找出这几行罪魁祸首的代码,但是一直都没有找到,那么,有一种很大的可能就是:

容器(c++ STL vector 或者 objective-c NSMutableArray)在析构的时候将SOA池本来要拿去重用的内存给干掉了~

很幸运的,我蒙对了!!但是这与我的敢猜想敢动手验证是分不开的,之前无法寸进就是因为一直凭空乱猜但是不怎么付出行动去验证~

其实一个项目最最怕的就是卡在一个地方很长一段时间,比如一个星期两个星期甚至一个月!

如果不存在这种情况的话,那么我真的可以说,其实做项目是一件很让人享受的事情~

如果卡的时间长了的话,难免会产生让人反感的情绪,让人觉得很恶心,让人心底产生让项目草草了事的想法

而且,恶心程度与被卡住的时间成正比!特别是公司里面的项目,这种项目如果卡住了的话,那就真的是郁闷了。。

像我这种靠一时兴起来做的项目倒是无所谓,实在被恶心的不行了大不了不做了...

废话不多说,最后晒几张战果图片给大家来瞧瞧:






  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值