• 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) )之间的整数.随机性很好.

  • 相关阅读:
    .NET CORE 部署3
    Filezilla
    Java 项目转换为maven项目教程
    Andriod studio 汉化教程
    tarjan好题
    关于二分的边界
    2019-10-11
    诗人小G(1D1D动态规划)
    斜率优化dp(玩具装箱)
    扩展欧几里得定律
  • 原文地址:https://www.cnblogs.com/lancidie/p/1982233.html
Copyright © 2020-2023  润新知