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 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> <2021SC@SDUSC>开源游戏引擎Overload主体代码架构概述 -> 正文阅读

[游戏开发]<2021SC@SDUSC>开源游戏引擎Overload主体代码架构概述

2021SC@SDUSC

前言

此篇文章为Overload引擎相关第二篇,Overload引擎的Github主页在这里,本文主题是介绍Overload的大致框架和运行流程,但并不会深入进去,是一个主体的概述

主体架构

一、各模块说明

Overload 1.3.0由12个模块组成(事实上是10个模块和2个集成),各个模块对应的简介在Overload的Github主页就有,下面我把官方的简介贴上来,就不再做其他解释了。
Overload_Module

二、程序运行流程

1.从OvEditor的Main开始

官方推荐我们从OvEditor开始启动程序,事实上默认的启动项也就是OvEditor,所以整个Overload就是从OvEditor的Main函数开始的:
Main
进入Main.cpp,我们要找到真正的程序进入口,也就是main函数(事实上首先调用的是WinMain):
mainFunction
在上图中,我们可以看到,main函数首先会调用UpdateWorkingDirectionary()函数,我们可以先看看它的作用:
UpdateWorkingDirectionary
可以看到,这是个十分简单的函数,我们不必继续深入,就可以知道它是用于获取当前的执行路径(项目路径),以便后续的项目资源的加载使用。现在我们回到main函数继续看:
mainLoadProject
这是main函数获取项目路径之后的程序,此时做了一个判断,如果没有给定一个项目,即argv<2时,将会打开ProjectHub(项目中心),可以让用户选择需要打开的项目(tie()是c++ 11中元组的相关API,想理解的可以自行搜索)。当已经给定项目时(可能是从CMD打开),则会直接打开项目,如果从VS打开的,应当会进入没有给定项目的流程。我们继续往下看:
run
此处即将要进入下一步骤,调用app.Run(),顾名思义,是要运行应用了,我们跟着它去看看

2.app.Run()

进入app.Run(),我们会来到Application.cpp,具体位置在:
Application
将要执行的代码是:
appRun
可以看到,程序会生成一个Clock的实例,在后续循环中持续更新,用于计时,循环的条件是判断应用程序是否在运行。对于循环内部的代码,我们分别深入看看,首先是PreUpdate(),不过我们得先找到它的位置:
EditorCPP
循环中的3个Update函数都在这个Editor.cpp中

3.PreUpdate()

PreUpdate
PROFILER_SPY的实现方式我们不深入介绍了,它的作用是在作用域结束时发送数据,可以视作一个信号,用于保证拓扑顺序。
PollEvents()的作用是允许对创建出的窗口进行输入或其他各种操作,例如改变窗口大小等等。
SetClearColor和Clear可以放在一起说,实际就是设置了绘制的清空颜色并执行清空的操作。这个对没有图形编程基础的朋友来说可能不能理解,但在此也不会深入讲述,所以知道它的功能就好了。
值得一提的是,Overload中所有跟图形绘制相关的操作都是基于OpenGL的,上述三个函数也都是以OpenGL为基础实现的。接下来我们先跳过Update(),先看一下更简单的PostUpdate()

4.PostUpdate()

PostUpdate
这里实际也是与图形编程息息相关,PROFILER_SPY已经说过,就不再说第二遍了。
SwapBuffers是进行两帧渲染画面之间的交换,我们一般用到双缓冲技术,具体不多说了,感兴趣可以去看其他有关这一方面的文章。简单来说,这个函数的作用就是更新我们要看到的画面。
接下来的ClearEvents,是为了清除前一帧的所有操作,防止对渲染下一帧画面产生影响。
对m_elapsedFrames的自加,是要对帧数进行统计,一帧结束了,所以要加一。

5.Update()

Update
Update()是一个十分复杂的函数,有着许多的内部调用,也是Overload的主体。我们不会对每个调用进行深入的剖析,只会简单的说说它的作用和实现思路。因为这只是一个概述,而不是详解,但即便如此,这种复杂度也不是之前的几个函数可以比的。
Update需要输入,从之前的app.run中我们可以知道,输入的事实上是clock的变化值,有些类似于帧时间,但未必可以完全等同,这个输入在接下来的许多调用中都会涉及。
HandleGlobalShortcuts是用来在UI中对物体或一些文件进行删改,当我们点击删除或按下删除键,并且有一个对象被选中时,此函数会执行。
UpdateCurrentEditorMode是用于更改当前的模式,有Play模式和Edit模式,在UI界面中应当是通过按键切换,与此同时会进行垃圾回收(GC)。
PrepareRendering,看名字就很好懂,是用来给渲染做准备,具体则是绑定各种buffer(缓冲区)和data(数据)。
UpdateEditorPanels的作用是更新编辑面板,也很好懂,具体来讲会对各个子面板都做更新。
RenderViews是用来做渲染,包括asset,scene和game三个视界,是引擎表现的主体,没有它就不能查看编辑界面和预览游戏画面,资源也会变得不可见,是十分重要的,但同时也非常复杂,有着极多层的封装。
RenderEditorUI是RenderViews的补充,用于渲染面板,即非视界的各部分,编写代码的基础是imGui。
最后的ExecuteDelayedActions,是用来执行各种此帧内应该执行的操作,之所以是delay,是为了防止与渲染产生冲突,同时不实时执行也能更好的组织,防止操作之间冲突。

总结

以上就是本次要介绍的Overload主体代码框架,但我们并没有十分深入。在之后的时间里,我们会对每个模块做深入详尽的介绍,此次仅仅是概述,展示了Overload的一个大体运行流程,更具体的以后再说。

DianaLike

  游戏开发 最新文章
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-09-29 10:39:01  更:2021-09-29 10:41:20 
 
开发: 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/28 3:46:26-

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