看到CSDN首页有个文章标题:中国缺乏创新,大多是“山寨”,我想说其实“山寨”也不容易。一直想“山寨”一个google earth,这
一路做来,几乎块两年了。
又是一个莫名的问题,导致一个晚上的时间来调试。
还是那句老话,写代码容易,调代码难。
问题描述如下:
发现当加载了模型之后,有一定概率退出会出现D3D资源没有释放完的错误。
一步步排除:
1,调试代码,确定新写的模型管理器没有问题,因为这里是新代码,出错的概率是最大的。
反复很多次后,没有发现问题。
2,尝试让bug复现
操作 结果 结论
分别加多个模型和1个模型 bug偶尔会出现 和模型,纹理数据量无关
不显示模型 bug偶尔会出现 完全排除和新写的纹理管理器有关系
这里经过多次操作,终于可以百分百复现问题
当双击模型飞行后 不出现问题
但是双击那个包含lookat的空的placemark 出现问题
那说明问题出在应用层代码的flytofeature
这回简单了,证明问题彻底跟最近新写的代码无关
flytofeature 内实际调用两个com组件,一个是相机,一个是地形
经过排除,证明问题出在地形节点
实际上这里只调用了地形了的GetHeight接口,调试发现和GetHeight函数没有关系。
如果在以前,那么无论如何也解决不了这个问题的。
幸好最近此类问题碰到的太多了,手到擒来。
退出的时候有d3d资源没有释放,那么证明地形节点的释放有问题
这里要说明一个问题,com组件内一般有finalrelease函数,当com组件最后一次释放时,会调用,所以大部分的释放函数都写在这里
但是通过c# 调用com后,com对象的析构无法控制,导致不一定能调用finalrelease
所以像D3D资源的释放最好不要放这里
调整内部一些资源的释放位置,问题解决。。。
今天顺道解决另一个光照问题:
描述:
当近距离观察模型时,模型变黑
这个明显是光照导致的,至于为什么也一直没想明白
今天调上面的问题时候,突然灵光一闪,我使用的光照方向都是通过视点-模型中心点获得,近距离观察模型边缘的时候,光照和法向量都垂直了,当然黑了
修改为视点方向,一切OK了
支持kmz/dae模型的好处是google 模型库有取之不尽,用之不尽的免费模型,很给力的
每天都在进步,哪怕速度像蜗牛,你也是充实的。。。希望一切的努力不要白费。