Irrlicht不定期分析
仔细背诵日语的三小时中,时间过的很慢,效率异常之高,学了不少东西,很高兴,拿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) )之间的整数.随机性很好.