一个Delta3d程序启动过程详解

一、初始化一个dtGame::GameApplication的实例,dtGame::GameApplication* app = new dtGame::GameApplication();

设置游戏库的名称,SetGameLibraryName("libname");

调用app->Config("config.xml");Config内容如下:

//解析GameEntryPoint的dll,获取相关函数指针
dtUtil::LibrarySharingManager& lsm = dtUtil::LibrarySharingManager::GetInstance();
std::string libName = GetGameLibraryName();
mEntryPointLib = lsm.LoadSharedLibrary(libName);
dtUtil::LibrarySharingManager::LibraryHandle::SYMBOL_ADDRESS createAddr;
dtUtil::LibrarySharingManager::LibraryHandle::SYMBOL_ADDRESS destroyAddr;
createAddr = mEntryPointLib->FindSymbol("CreateGameEntryPoint");
destroyAddr = mEntryPointLib->FindSymbol("DestroyGameEntryPoint");
mCreateFunction  = reinterpret_cast<CreateEntryPointFn>(createAddr);
mDestroyFunction = reinterpret_cast<DestroyEntryPointFn>(destroyAddr);
//创建Aplication和GameManager
mApplication = mEntryPoint->CreateApplication(configFileName);
mGameManager = new dtGame::GameManager(*mApplication->GetScene());
//执行相关初始化
mEntryPoint->Initialize(*mApplication, mArgc, mArgv);
mApplication->Config();
mEntryPoint->OnStartup(*mApplication, *mGameManager);
//开始系统循环
dtCore::System::GetInstance().Start(); 

在GameEntryPoint中的OnStartUp函数中将相应的组件添加至游戏管理器GameManager中;

在dtCore::System中有一个定时的循环,在循环中发送相关的消息(System::MESSAGE_FRAME等),然后在dtABC::BaseABC中的OnMessage()中进行消息响应。

void BaseABC::OnMessage(MessageData* data)
{if (data->message == dtCore::System::MESSAGE_EVENT_TRAVERSAL){EventTraversal(*static_cast<const double*>(data->userData));}else if (data->message == dtCore::System::MESSAGE_PRE_FRAME){PreFrame(*static_cast<const double*>(data->userData));}else if (data->message == dtCore::System::MESSAGE_FRAME){Frame(*static_cast<const double*>(data->userData));}else if (data->message == dtCore::System::MESSAGE_POST_FRAME){PostFrame(*static_cast<const double*>(data->userData));}else if (data->message == dtCore::System::MESSAGE_PAUSE){Pause(*static_cast<const double*>(data->userData));}
}

在Frame函数中进行模型的渲染

void Application::Frame(const double deltaSimTime)
{if(!mCompositeViewer->done()){bool singleThreaded = mCompositeViewer->getThreadingModel() == osgViewer::ViewerBase::SingleThreaded;//NOTE: The OSG frame() advances the clock and does three traversals, event, update, and render.//We are moving the event traversal to be its own message so we can reliably accept input during the//typical Delta3D update of PreFrame().  The only exception to this is that we needif(mFirstFrame){#ifndef MULTITHREAD_FIX_HACK_BREAKS_CEGUIdtCore::ObserverPtr<osgViewer::GraphicsWindow> gw;if (GetWindow() != NULL){gw = GetWindow()->GetOsgViewerGraphicsWindow();}if (!singleThreaded && gw.valid() && gw->isRealized()){gw->releaseContext();}
#endifif (singleThreaded) { GetCompositeViewer()->setReleaseContextAtEndOfFrameHint(false); }mCompositeViewer->setUpThreading();mCompositeViewer->frame(dtCore::System::GetInstance().GetSimTimeSinceStartup());mFirstFrame = false;}// NOTE: The new version OSG (2.2) relies on absolute frame time// to update drawables; especially particle systems.// The time delta will be ignored here and the absolute simulation// time passed to the OSG scene updater.mCompositeViewer->advance(dtCore::System::GetInstance().GetSimTimeSinceStartup());mCompositeViewer->updateTraversal();mCompositeViewer->renderingTraversals();}
}

Delta3d框架学习--程序启动过程详解相关推荐

  1. 朱老师ARM裸机学习笔记(四):S5PV210启动过程详解

    常用器件特性 内存: SRAM 静态内存 特点就是容量小.价格高,优点是不需要软件初始化直接上电就能用 DRAM 动态内存 特点就是容量大.价格低,缺点就是上电后不能直接使用,需要软件初始化后才可以使 ...

  2. Linux开启动过程详解

    Linux开启动过程详解 Linux启动过程 前言: Linux是一种自由和开放源代码的类UNIX操作系统.该操作系统的内核由林纳斯·托瓦兹在1991年10月5日首次发布.在加上用户空间的应用程序之后 ...

  3. centos7 启动流程图_Linux启动过程详解

    Linux启动过程详解 作者:江远航 一.启动流程图如下 图1 Linux启动流程图 BIOS ---> MBR ---> Kernel---> Init 二.Linux启动顺序 一 ...

  4. Spring启动过程详解

    Spring启动过程详解 前言 spring容器启动过程 AnnotationConfigApplicationContext 有参数构造方法 无参数构造 AnnotatedBeanDefinitio ...

  5. linux efi 启动原理,Linux(RHEL6)启动过程详解

    Linux(RHEL6)启动过程详解 Linux(红帽RHEL6)启动过程详解: RHEL的一个重要和强大的方面是它是开源的,并且系统的启动过程是用户可配置的.用户可以自由的配置启动过程的许多方面,包 ...

  6. 嵌入式linux的u-boot系统启动过程,【站友投递】U-boot启动过程详解

    [站友投递]U-boot启动过程详解 来源:互联网 作者:denny 时间:2009-03-18 Tag:点击: 一.U-BOOT的目录结构 u-boot目录下有18个子目录,分别存放管理不通的源程序 ...

  7. 家用计算机启动过程 装载主引导记录,计算机启动过程详解

    综述: 计算机启动时经过了哪些过程: 计算机接通电源后,第一步要进行加电自检,也就是POST(Power On Self Test),检查RAM.驱动器等:第二步BIOS会读取活动分区主引导记录的启动 ...

  8. golang程序启动流程详解

    golang程序启动流程详解 环境 go1.16.5 linux/amd64 用例 package mainimport "fmt"func main() {fmt.Println ...

  9. Linux 开机引导和启动过程详解

    你是否曾经对操作系统为何能够执行应用程序而感到疑惑?那么本文将为你揭开操作系统引导与启动的面纱. 理解操作系统开机引导和启动过程对于配置操作系统和解决相关启动问题是至关重要的.该文章陈述了 GRUB2 ...

最新文章

  1. android mp4宽高,Android:MediaPlayer视频宽高比问题
  2. 在这个时代,如何管理好95后员工?
  3. Python IDLE快捷键一览
  4. SVN版本控制如何删除文件或者文件夹?
  5. 【渝粤题库】广东开放大学 互联网营销 形成性考核
  6. 为什么说「中台」程序员将来会最值钱?
  7. Qt工作笔记-使用qrand与QTime产生随机数
  8. Linux驱动(12)--LED驱动
  9. 开启人才进阶之旅,鲲鹏开发者技术沙龙点燃计算行业激情
  10. 金狮加密视频播放器破解翻录限制转换为mp4工具使用教程
  11. java毕业设计便利店系统mybatis+源码+调试部署+系统+数据库+lw
  12. Python Tesseract-orc 识别简单验证码
  13. 对于seo优化与sem竞价有什么不同的地方?哪个更适合?
  14. 安装黑苹果时提示未能与服务器,安装黑苹果遇到的问题与解决记录
  15. 中台战略-第四章、企业中台5大成功要素
  16. 多传感器融合标定方法汇总
  17. 2022年武汉市经开区企业研发费用投入奖励补贴政策申报条件以及奖补标准!
  18. vue 权限管理 动态路由(6)
  19. 10万亿的新房市场,为何没有一家现象级的电商?
  20. 谷歌搜索揭示人性最黑暗的秘密

热门文章

  1. rmse多少算效果好_关键词SEO优化带来流量有多少?如何做SEO优化效果好?
  2. python链表实现栈_python实现链表队列栈
  3. 不在 sudoers 文件中。此事将被报告_快餐包装中检出致癌物质?麦当劳、汉堡王回应!...
  4. python字符串_教你快速了解 Python 字符串
  5. 分析启动耗时 android,Android app启动耗时分析
  6. vue 分享微信传参_vue实现微信分享链接添加动态参数的方法
  7. 原码一位乘法器设计_数字IC校招基础知识点复习(七)——超前进位加法器、Wallace树、Booth乘法器...
  8. c语言中实现自动平移,c语言实现图像的旋转与平移
  9. mysql mode_MYSQL中的sql_mode模式
  10. wlan端口服务器无响应,wlan项目遇到的问题,总结