IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> ogre 学习笔记 - Day 3 -> 正文阅读

[游戏开发]ogre 学习笔记 - Day 3

ogre 学习笔记 - Day 3


从之前的学习中,对ogre有了一些基本的认知。现在可以去尝试看看SampleBrowser了。

SampleBrowser

  • 找到程序入口 WinMain,WinMain里面除去一些七七八八的只剩两行

    OgreBites::SampleBrowser brows (nograb, startUpSampleIdx);
    brows.go();
    

    看看类关系

    class SampleBrowser : public SampleContext, public TrayListener
    
    class SampleContext : public ApplicationContext, public InputListener
    

    通过昨天的学习,知道 ApplicationContext 继承自 FrameListener。
    InputListener 响应设备输入事件,TrayListener响应UI事件。
    粗略看看 SampleBrowser, SampleContext 发现重载了很多事件响应。
    这其中发现重载了一个比较奇怪的函数 createWindow

    virtual NativeWindowPair createWindow(const Ogre::String& name, uint32_t w, uint32_t h, Ogre::NameValuePairList miscParams)
            {
    #if OGRE_PLATFORM == OGRE_PLATFORM_ANDROID
                // ...
    #endif
                NativeWindowPair res = ApplicationContext::createWindow(name, w, h, miscParams);
    
    #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE_IOS
                // ...
    #endif
    
                return res;
            }
    

    这个函数对不同的平台做了一些不同的设置,调用了父类的 ApplicationContext::createWindow。

    既然可以重载createWindow

    virtual NativeWindowPair
        createWindow(const Ogre::String& name, uint32_t w = 0, uint32_t h = 0,
                     Ogre::NameValuePairList miscParams = Ogre::NameValuePairList());
    
    struct NativeWindowPair
    {
        Ogre::RenderWindow* render;
        NativeWindowType* native;
    };
    

    createWindow 返回的是一个pair,包含 RenderWindow, NativeWindowType。

    调试一下,看看 createWinow 都做了什么。
    最终会进入到 ApplicationContextSDL::createWindow

    NativeWindowPair ApplicationContextSDL::createWindow(const Ogre::String& name, Ogre::uint32 w, Ogre::uint32 h, Ogre::NameValuePairList miscParams)
    {
        NativeWindowPair ret = {NULL, NULL};
    
        if(!SDL_WasInit(SDL_INIT_VIDEO)) {
            SDL_InitSubSystem(SDL_INIT_VIDEO | SDL_INIT_GAMECONTROLLER);
        }
        
        // ...
        
        int flags = p.useFullScreen ? SDL_WINDOW_FULLSCREEN : SDL_WINDOW_RESIZABLE;
        int d = Ogre::StringConverter::parseInt(miscParams["monitorIndex"], 1) - 1;
        ret.native =
            SDL_CreateWindow(p.name.c_str(), SDL_WINDOWPOS_UNDEFINED_DISPLAY(d),
                            SDL_WINDOWPOS_UNDEFINED_DISPLAY(d), p.width, p.height, flags);
    
    #if OGRE_PLATFORM != OGRE_PLATFORM_EMSCRIPTEN
        SDL_SysWMinfo wmInfo;
        SDL_VERSION(&wmInfo.version);
        SDL_GetWindowWMInfo(ret.native, &wmInfo);
    #endif
    
        // ...
    
        ret.render = mRoot->createRenderWindow(p);
        mWindows.push_back(ret);
        return ret;
    }
    

    通过SDL2创建了一个窗口,然后创建了一个RenderWindow,RenderWindow 包含了一个SwapChain。(D3D11)

    Root是ogre的入口,Application 属于 Component,那么,它并非核心部分,只要能获取其他的窗口句柄,它就应该可以Attach到任意一个窗口上。

    现在归纳一下,SampleBrowser 继承自 FrameListener, InputListener, TrayListener。它就拥有了UI,输入的功能。创建了系统窗口,创建了渲染窗口,接下来就是创建UI了。

    按照之前的获得的信息,创建UI应该在重载的 setup 函数里, 直接去瞄一眼。

    直接在 SampleBrowser::setup里来一个断点调试。F10。

    ApplicationContext::setup();
    

    发现当运行 ApplicationContext::setup() 时, UI 已经在运行了。已知ogre还没有运行到 Frame事件,不会发生更新事件。那么,UI与ogre不是同一个流程。UI的渲染也不是用的ogre渲染系统?

    带着这个疑问,一步一步的调试,发现SampleBrowser重载了 loadResources在里面加载一些资源, 加载资源的时候,会通过 TrayManager::Update 调用到 RenderWindow::Updata,实现刷新画面。

    通过这个现象,猜测可以在任何时候去更新应用的画面。如果UI与Frame同一帧都调用了RenderWindow::Update,怎么防止呢?暂时留着疑问。

    回到 setup,继续

    Sample* startupSample = loadSamples();
    

    从配置文件加载例子

    Ogre::MaterialPtr thumbMat = Ogre::MaterialManager::getSingleton().create("SdkTrays/SampleThumbnail", "Essential");
    thumbMat->setLightingEnabled(false);
    thumbMat->setDepthCheckEnabled(false);
    thumbMat->getTechnique(0)->getPass(0)->createTextureUnitState();
    

    创建缩略图材质

    setupWidgets();
    

    加载UI

    if (startupSample && mFirstRun){
        runSample(startupSample);
    }
    

    运行初始场景

    然后,就是点击UI,选择运行场景了。

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-12-02 17:05:52  更:2021-12-02 17:07:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 20:34:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码