实时阴影绘制技术研究

C++博客 首页 新随笔 联系 聚合 管理
  48 Posts :: 20 Stories :: 57 Comments :: 0 Trackbacks
到了真的动手干,才知道自己的基础这么弱,几乎能够不断的遇到C++和openGL上的问题,这样工作起来既有挫折感也蛮有成就感的。
  • 2006年3月1日 hash_map与map
写Node类的时候遇到一个map和hash_map的问题,在Ogre的实现中对于SceneNode的children使用的hash_map,而不是map,引起了我的兴趣,后来在STL China上找到一篇介绍两者区别的文章。简单的总结一下,就是说hash_map同map比较起来,利用了哈希表进行存储,而不是map的RB tree,这样占用多一点空间,节省一些查找时间。因为hash_map基本是常量的查找速度,而map是log(n)的查找速度,因此实际上对于小数据量的情况,大可不必使用hash_map.综上,权衡三个因素: 查找速度, 数据量, 内存使用。
  • 2006年3月2日 inline函数和const问题

以前就注意过dvesg中实现getter的时候通常有两个函数,分别类似于下面的情况:
inline const ParentList& getParents() const { return _parents; }       
inline ParentList getParents() { return _parents; }
首先是inline,google了一下找到三篇文章:
保守的使用inline新手入门:关于C++中的内联函数(inline)C++箴言:理解inline化的介入和排除。总结一下,inline函数主要是通过在编译阶段将调用inline函数的地方替换成内联函数本身,从而在程序执行阶段减少调用的次数,也就减少了系统中栈空间的频繁操作,因此算是一种用空间换时间的优化手段。但是使用的时候也需要多加注意。首先是inline函数中不能有while,switch,不能递归调用,防止潜在的代码膨胀,另外要注意inline函数编译出来的程序也根据编译器的不同而有所不同。还有一点不太理解的:不要仅仅因为函数模板出现在头文件中,就将它声明为 inline。

然后再重提一下const问题。在google随便一搜很容易找到一篇
const用法的文章,毛病一大堆,但是看到了很多以前没有遇到过的情况。看了以后觉得没有记住多少,还是要在实际应用中碰到的会印象深刻。反正const用的好,程序很健壮,用不好麻烦一大堆,要逐渐积累经验。现在我所知道的const:
1,const在*前表示指针的内容是常量,*在const前表示指针地址是常量,不能指向其他地址。
2,const在成员函数前,表示返回值是常量;const在成员函数后表示该函数不能修改函数成员。
对于上边那段代码的理解也找到了:“常函数的调用是这样的:常量对象只能调用常成员函数,非常量对象即可以调常成员函数,也可以调一般成员函数,但当某个函数有const和非const两个版本时,const对象调const版本,非const对象调非const版本”。

  • 2006年3月7日 map使用中的问题以及inline函数的编译问题,诡异的程序异常

为了按名操作Geometry对象,声明了typedef map<string,refptr<Geometry> > GeometryList;在使用的时候,要插入一个数据,使用geoList[a]=b;我发现在一个方法里边这样做了以后,又调用了refptr的析构函数,这样如果智能指针计数为0,那指针岂不被析构了。偏巧程序这时候运行退出时报异常,搞的我以为是这里出了问题。后来才发现在这个过程中,首先执行refptr的拷贝构造函数,构造一个对象,然后把string和智能指针放在map自己的数据中。不存在上述问题。

还有我做了refptr<T>的=号操作符重载,因此每次我在插入一个Geometry的时候,实际只要执行:Geometry* geo;mymap[name]=geo;就可以了,不必使用mymap[name]=refptr<Geometry>(geo);还是参考了前人写的程序才发现可以这么简单。其实c++可以很简单,只是我们不能掌握它的规则。唉,还得学啊!

zjn今天终于调通了3ds的loader。原因是前边他把loader中全局的方法,在声明处就进行了实现,据他说c++会默认这种情况为inline函数,这样导致在设定的lib目录中看不到编译好的lib文件。因为inline的函数是不能在前边放EXPORT_DLL的编译链接输出到DLL的,要在client程序include时进行编译,这样才会节省栈调用。后来把这些函数放在一个类里边实现就调通了。

今天还碰到另外一个异常的问题。“Unhandled Exception:User breakpoint”,在我和zjn那里都碰到了这个异常。后来我发现时yyd的程序里边把color的V4Array的size设为3,而设定的时候写了(*color)[3]=V4(0,1,0,1);这样导致析构的时候异常。但是zjn那里的异常就跟我这个不同,他那里把string作为map的key,在设定Geometry的时候到第八个Geometry就会跳出上述异常,从函数调用来看是string的析构函数有问题,后来换了不从3ds中读这个string,而自己设定序号,就没有异常。唉,c++程序这个东西真是诡异。

posted on 2006-03-07 18:05 苦行僧 阅读(626) 评论(0)  编辑 收藏 引用 所属分类: c++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理