Irrlicht不定期分析

 

2008-09-01

仔细背诵日语的三小时中,时间过的很慢,效率异常之高,学了不少东西,很高兴,拿Irrlicht放松放松。好久没看它了:)

 

 

Irrlicht最核心的部分就是Device以及其下几个管理器。

我们首先看一个简单的代码立刻可以理解这一切。

 

#include <irrlicht.h>             // 这是一个预编译头,包含了Irr的所有文件头

 

Int main()

{

       IrrlichtDevice *g_pDevice = createDevice( … );

       Scene::IsceneManager* g_pSceneMgr = g_ pDevice->getSceneManager();

       While(g_pSceneMgr->run())

       {

              g_pDevice ->beginScene( … );

              g_pSceneMgr->drawAll();

              g_pDevice->endScene();

}

g_pDevice->drop();

return 0;

}

 

多么简单!多么容易理解的一个框架,世界上找不到比这个更简朴的核心渲染代码了。

 

正如上面获取SceneManager一样,在IrrlichtDevice下还有以下几个重要的管理器。这些管理器均在IrrlichtDevice类下有接口可以Get();

1: getVideoDriver();

2: getFileSystem();

3: getGUIEnvironment();

4: getSceneManager();

5: getCursorControl();

6: getLogger();

7: getOSOperator()

重点就是对这七个管理器实现和设计了,另外还有一个就是在createDevice()需要传入的一个EventReceiver了,这个EvectReceiver中进行我们的逻辑处理。它包括了五方面的消息回调处理。包括 GUIEvent, MouseEvent, KeyEvent, LogEvent, UserEvent. 其中MouseEvent, KeyEvent自然容易理解,GUIEvent无非是在GUI层封装了一层得到的Event, 而UserEvent在引擎中未见使用,看起来是给用户自定义继承使用的,有意思的是,为什么要将一个Log做为一个Event来设计?而且,作者在最基层定义了一个IUnknown的绝对基类,和DXCOM的不同是他添加了一个DebugInfo(),看来作者对Debug的准备措施看的很重要的样子:)

 

继续回来,从IrrlichtDevice找到class IrrlichtDeviceStub : public Irrlicht,实际上,实际的创建是从IrrlichtDeviceStub这里才开始的,IrrlichtDevice仅仅是给用户的一个蜜糖封装,将真正的实现隐藏了起来。

 

接下来 class IrrlichtLinux 和 class IrrlichtWin32 同时继承于 public IrrlichtDeviceStub.这两个子类中除了加了一堆的属性控制函数外,重心就是一个CreateDevice()了,这才是真真切切的实在的设备创建,向下查一层就出现CreateD3Ddevice()标准函数了。不过,在这个createDevice()中不仅仅创建了 窗口,还创建了与OS 管理器,CursorControl,VideoDriver,又通过createGUIAndScene()这个函数创建了GUIEnvironment,SceneManager这些核心,同时又将EventReceiver设置为事件接收,所以,当程序出现任何致命性问题或希望对Irr进行大规模修改的话,这里绝对是重中之重。这里也就是程序的核心根本之地。

 

在CirrlichtDeviceWin32::run()中还有极面熟的下段代码:

MSG msg;

While (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))

{

       TranslateMessage(&msg);

       DispatchMessage(&msg);

}

 

恩,晚了,明天继续查看记录.

 

//--------------------------------------------------------------------------------------------------------------------------

 

2008-09-02

很郁闷,移动硬盘被盗了...本身到不值什么钱,但是!!!我多年攒的近100G的精品代码和电子书籍!!!我搜集的精品MV,MP3,日语教程!!!我搜集的软件安装备份,多少绝版的SN和好东西...我真KAO那个小偷TMD!!!..XD.气晕了

先不说这个了,虽然损失极其惨重...但说白了,也没招...还是要看代码...忍....忍...

 

今天看Irrlicht,发现个有意思的东西,就是它在OS.cpp中的Random,代码很简单,如下:

int seed = 0x0f0f0f0f;

int rand()
{
const int m = 2147483399;
const int a = 40692;
const int q = m/a;
const int r = m%a;  

seed = a * (seed%q) - r* (seed/q);
if (seed<0) seed += m;

return seed;
}

经过测试,这段代码的随机性非常好,效率也很高.

我取100000次随机数仅消耗15毫秒,在汇编级这段代码还可再优化.

另外,我将10000次的随机数组图绘了几次,随机图如下

 

这相当神奇,类似于 卡马克 数字一样神秘的玩意- - 实在无法得知如何获得的.(图中X坐标是随机次数,Y坐标是随机值/10000)

不过,从图中可以得知该Random可随机取( 0 - 2147483648(即FFFFFFFF/2) )之间的整数.随机性很好.

posted @ 2011-03-12 14:52  oayx  阅读(2243)  评论(1编辑  收藏  举报