其实山寨也不容易

    技术2025-12-09  1

     

     

      看到首页有个文章标题:中国缺乏创新,大多是“山寨”,我想说其实“山寨”也不容易。一直想“山寨”一个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 模型库有取之不尽,用之不尽的免费模型,很给力的

     

        每天都在进步,哪怕速度像蜗牛,你也是充实的。。。希望一切的努力不要白费。

     

     

     

     

     

     

     

     

    最新回复(0)