我在googlecode上开了一个小工程,上面保留了前一段时间写的一些代码,在这里做一些简单的介绍。介绍自己的丑代码需要一些勇气,这一点现在感受颇深。
    snev是一个这个工程的名字,但是里面却是一些彼此无关的代码。其中有很多只是些代码片段,或者说一些小代码玩具。
    trunk/source/billiard 是一个桌球小游戏,是开始学习opengl的时候的一个小练习。如果想编译执行,需要glewt和glut扩展,得到源代码之后make就行,make是 手写的,在mingw和cygwin下面都测试过。这个小程序内容很简单,就是20个球在桌子上碰来碰去,最简单的包围球碰撞检测,代码生成的球体模 型,shadow volume做的阴影,之前想做成一个3D桌球的游戏,后来因为时间关系不想写了。
    trunk/tlab/heap下面是内存分配的代码,有heap和heap2两个实现,其中heap就是的最简单的单链表,每次查找时在 freelist中找到第一个可以非配的块作为分配块,效率极低。heap2是一个优化过的版本,优化的基本思想是,不止保存一个free list,而是保存32个free list,第i个free list里保存的是 大小为 2^i ~ 2^(i+1),2的i次幂到(i+1)次幂大小的块,每次需要分配一块M大小的内存时,找到这个块所对应的一个free list,算法在网上很容易就可以找到,如果要具体的复杂度分析可以自行搜索。heap2在进行了这个小的优化之后,比heap中使用的但链表要快了很 多,但是从我的测结果来看,在windows xp下,比系统提供的慢2/3,也就是说效率是malloc的1/3,但是已经比最简单的heap快了千倍。看来看去,好像这个heap1就是个托,他的 使命就是告诉大家,虽然heap2也不是很快,但是已经比我快了好几百倍了。但是这个托也没有做什么坏事,对比他的同行,cctv的实习生和五毛党,你托 出了素质,脱出了水平,傻的高尚,慢的光荣。heap2虽然慢,但是在内存块中可以自定义数据,所以可以很容易的查出来内存泄露,也是他最他的功能了,不 过heap2遇到stl就死循环,这是一粒硕大无比的bug,不得不说。
    trunk/tlab/math里面有一个matrix的实现,用的是右手坐标系加列向量的存储的方式,总之,可以完全替掉OpenGL中的 matrix操作就是了。另一个是一个sintable的生成,就是把三角函数吧0-2PI均分成很多个点,在每个点上取得这个点所对应的sin值,如果 要取的数值在某两个点之间的话,再用线性差值就行了。但是我得到的这个sintable于在其他地方看到的一个sintable中的值有一些略微的差别, 我想可能是他做了一些线性回归的原因。
    trunk/tlab/regexp里面是一个简单的正则表达式引擎。只能处理最基本的三种运算(连接,或,闭包)运算,也就是ab(连 接),a|b(或者), a*(闭包),当然也支持小括号。具体的过程和编译原理上的差不多,也就是由正则表达是生成NFA,由NFA生成DFA,然后判断的过程。由于这个代码使 用的都是c的东西,所以看起来很是纠结,对,纠结。
    trunk/tlab/CsScripts里一个小的脚本引擎,一个解释型的脚本语言。函数是以&开头的一个字符串,不支持函数定义,只能在 cpp文件里内置函数(继承Function借口并定义Compute函数),我内置了一个print函数。动态变量定义,内置支持 NULL,Float,Int,String四种变量,变量名和php中一样,以$开头。int,float支持几乎所有的运算(不支持位运算,这个脚本 也不是用来科学计算的语言,他的目的在于把一些逻辑从cpp文件中移出来,这样的话,死机的时候其他的程序员对着你喊“我这里又挂了”的时候,你可以大声 的告诉他,“别找我,找那个臭屁的designer吧,是他写的这个该死的脚本),支持if-elif-else语句,while-break语句,当然 这些都是无限嵌套的,不过他们其实也不是无限潜逃的,有一个固定的栈的大小,在程序到达三米宽之前,我想,这个栈是不会轻易溢出的。具体的不多说,下面有 一段具体的脚本语言,源代码里面也有很多脚本的例子。需要注明的是这个语言里面的所有的出错信息都是我写的,你得忍受我蹩脚的英语,还得忍受错误位置有时 候报的不太精确。以下就是这个脚本的一些语法。
  1 {
  2         $m = -7
  3         &print( $m )
  4         $m = - 7.0 + 3
  5         &print( $m )
  6         $var1 = 5
  7         $var2 = 5
  8
  9         if ( $var1 == 5 ) {
 10                 if ( $var2 == 5 ) {
 11                         &print( "$var1 == 10 && $var2 == 15" )
 12                         
 13                         $i = 0
 14                         while ( $i < $var1 ) {
 15                                 $j = 0
 16                                 while ( $j < $var2 ) {
 17                                         if ( $i == 3 && ($j == 3) ) {
 18                                                 &print( "hello", "tangel" )
 19                                         }
 20                                         else
 21                                         {
 22                                                 &print( $i, $j)
 23                                         }
 24                                         $j = $j + 1
 25                                 }
 26                                 $i = $i + 1
 27                         }
 28                 }
 29         }
 30         else {
 31         }
 32 }
    这就是我这一年来写的一些小程序,小结到此结束。
posted on 2010-01-02 19:27  Tangel  阅读(152)  评论(0)    收藏  举报