irrlicht源码总结(二)

    好久没写文章了,这几天又突发兴趣来了解下源码。

    既然irrlicht几乎能支持跨平台和各个版本的c++(当然我的vs2017似乎不修改一些源码就不行了,因为源码好像用的还是directx9,个人觉得在如今GPU普及的时代,在怎么也要支持到directx11才行吧。。。),好了,不说偏了。这就是为什么irrlicht没有使用c++标准库里的stl的原因,而是自己实现了一个stl,(当然还多了向量,矩阵等)。当然也就谈不上广泛利用c++11以上的特性了。

    所有的文件在文件夹core中,看过标准stl源码的同志会发现,这里的stl其实还是和标准库差了个档次的(所以还是建议各位能用标准库就用标准库吧),但架构大致还是类似的。

    首先必须看irrAllocator.h文件,所谓allocator其实就是个类似于内存管理的东西,(所以你可以通过写不同的allocator来实现不同的内存分配策略),众所周知,比如一个class我每个对象new 100次 和 new 1次100个对象,效率是很明显后者会提高很多的,并且前者可能内存不连续还会有碎片问题。而一个大型游戏一个类有很多对象,所以可以在加载游戏时就把可能要用的对象创造出来,结束时再销毁。当然,读者去看时就会发现这个allocator很简单,只是把new和delete薄薄封起来而已,达不到什么效果。有能力的人可以模仿stl自己写allocator试试。(这个水还是挺深的,我当年也是研究了allocator很久)

    irrlicht似乎没有提供stl里的vector,这里的vector2d和vector3d其实是固定大小的向量,提供了向量的各种运算。矩阵是matrix4,利用template可以使用各种类型。其实就是一些简单的数学而已,比如说,平面的元素为(T可以替代为float,int等):

        vector3d<T> Normal;//! Normal vector of the plane.
        T D;//! Distance from origin.

也就一个法向量和距离可以表示一个平面咯,

那么什么是点呢?,看点就是这样的,点可以用向量表示:

#define position2d vector2d(利用c++11的using也可以达到相同的目的)

还有一个尺寸dimension(似乎该翻译成这样),看其元素,就两个

            //! Width of the dimension.
            T Width;
            //! Height of the dimension.
            T Height

这不就是高宽么?,其实也可以用二维数组vector2d<T>表示咯,殊途同归。再看三角形的定义:

        //! the three points of the triangle
        vector3d<T> pointA;
        vector3d<T> pointB;
        vector3d<T> pointC;

用的三个点而已,再看矩形

        //! Upper left corner
        position2d<T> UpperLeftCorner;
        //! Lower right corner
        position2d<T> LowerRightCorner;

这当然是一个2d矩形咯

所谓quaternion四元数,应该很常见咯,这里只有浮点数:

        f32 X; // vectorial (imaginary) part
        f32 Y;
        f32 Z;
        f32 W; // real part

f32不用想,肯定就是float

(你去搜肯定能找到typedef float f32;)

直线line我就不列出了,肯定是两个点表示的咯

当然有一个irrString(这个我不如char或wchar_t吧。。。)

irrMath里提供了一部分数学函数,(我还是用cmath吧。。)

还有一颗RBTree,红黑树,也有相应的迭代器,但irr没有type traits类型萃取就少了点味道啊,c++标准库里的set和map肯定是红黑树实现的,我相信读者运用c++和标准库,也可以写出更优雅的红黑树。(或者把map里的红黑树,我的vs里是xtree)

里面有一个heapsort堆排序,叙述这些的书都很多啦,至于coreutil,这个很简单,代码也很少,似乎是用来查找文件名字的(比如一个文件是否在文件夹中),各位用fstream和string也能很轻松达到相同的目的。

还有list忘了,里面的定义是

    struct SKListNode
    {
        SKListNode(const T& e) : Next(0), Prev(0), Element(e) {}

        SKListNode* Next;
        SKListNode* Prev;
        T Element;
    };

很明显是个双向链表咯,因为构造的时候0个元素,那可能就不是环状了(这个随意了),这个list当然不及stl list了;

再看array,我似乎猜到这个array应该就如同vector了吧,里面似有个新概念Alloc Strategy,难道是内存分配策略?噢,读了一些代码发现它其实就是在模拟c++11的move功能,当然不如vector有那么优秀的效率咯。

还有个叫aabbox3d,是由两个点定义的

        //! The near edge
        vector3d<T> MinEdge;

        //! The far edge
        vector3d<T> MaxEdge;

这个是用于碰撞检测的,实际游戏中的物体不可能做那么多碰撞检测,就会转化为一些简单的几何体当它的碰撞体积,当然,对于精度高的,可以用著名的BSP算法来实现。

    想学习游戏引擎源码的,建议大家把最新的源码下载看,在巨人的肩膀上学习,也能事半功倍。

    因为我只是帮各位梳理下思路,我跳过了其它很多细节,以上若有没有听过的概念(其实叙述那些的书很多了),还请各位自行查找资料学习;若有我不当之处,嘿嘿,还请批评指正,谢谢。

    最后想谈谈未来的游戏架构,游戏引擎中各种功能可用软件模拟,也可用硬件实现,大家看到的代码其实都是基于软件模拟,毫无疑问,如果硬件直接支持能获得数千倍不止的提升。

    想当年为解决cpu浮点运算,推出了fcpu,为解决3d游戏的渲染问题,推出了gpu。那么以后会不会为ai的神经元计算而普及ai cpu,会不会为真实的碰撞模拟推出collision cpu?我相信是可能的,因为我准备读完研究生就去研究这些芯片,嘿嘿。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值