从切割简单的多边形到切割复杂的多边形,一路过来,遇到了很多很多的问题
总算是大体得到解决了,相当的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池本来要拿去重用的内存给干掉了~
很幸运的,我蒙对了!!但是这与我的敢猜想敢动手验证是分不开的,之前无法寸进就是因为一直凭空乱猜但是不怎么付出行动去验证~
其实一个项目最最怕的就是卡在一个地方很长一段时间,比如一个星期两个星期甚至一个月!
如果不存在这种情况的话,那么我真的可以说,其实做项目是一件很让人享受的事情~
如果卡的时间长了的话,难免会产生让人反感的情绪,让人觉得很恶心,让人心底产生让项目草草了事的想法
而且,恶心程度与被卡住的时间成正比!特别是公司里面的项目,这种项目如果卡住了的话,那就真的是郁闷了。。
像我这种靠一时兴起来做的项目倒是无所谓,实在被恶心的不行了大不了不做了...
废话不多说,最后晒几张战果图片给大家来瞧瞧: