`

非典型2D游戏引擎 Orx 源码阅读笔记(1) 总体结构

 
阅读更多

write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie

讨论新闻组及文件

前言

完全不了解Orx的可以参考我写的《orx 库简单介绍 》以及官方主页

开始学习Orx其实很久了,但是一直仅仅是学习了一些基础的用法,没有深入研究源代码,在用Orx写游戏的时候常常会因为某个配置出现问题而完全束手无策,求助于iarwain,最近在移植一个Win32编好的游戏到IPhone上时,又碰到了问题,还是束手无策,因为我决定还是看看Orx的源代码,不然,命运总是不掌握在自己的手里,就像撞大运编程一样。这也是我当时选择引擎最大的要求之一,开源,所能带来的好处之一。而Orx这种"数据驱动"式的引擎,更加是使得了解源代码如此重要,因为我感觉对于我来说,我更加能够发现调用一个API的错误,而非常难去发现一个配置上的错误,我一直也认为这是Orx"数据驱动"的弊端之一,这也是我认为Orx非典型的原因。

源码阅读思路及目标

对于源码阅读,我还是用个人习惯的的先从整体上了解各个模块,然后单独了解各模块源码,最后整个的走一下主要的执行流程,了解各个模块是怎么结合在一起的。
对于Orx的源码阅读,我还是不准备达到到句句理解的地步,基本上还是以整体了解为主,顺面关心一下个人比较感兴趣的渲染部分,对源码的理解程度以最后能够完全脱离Orx的配置模块,靠自己的代码将各个模块组合起来,并实现基本的Orx功能为止。Orx作为跨平台引擎,我不能去分析所有其支持的平台,主要关心的版本是Win32版本及IPhone版本,当然,事实上因为Orx的跨平台主要是依赖于将SDL,GLFW等库作为插件来完成的,所以,其实在Orx这一层的代码其实都一样。(IPhone版本比较特殊)
为了无论在何时都能找到本文对应的源码,这里使用最新的Orx1.2版本的源码,并未使用svn上的版本。

Orx总体结构

作为一个iarwain目标为完整game engine的Orx,模块的构成还是比较复杂的。

物理结构:

从Orx源代码的目录上可以基本区分出来:
Animation:动画部分
base:基础部分,包含一些为了跨平台而定义的宏,Orx本身需要的宏和常用常量,函数,还有Orx的模块处理
core:内核部分,包括时钟,配置,事件部分,本地化部分
debug:日志部分及FPS显示
display:显示部分
io:IO部分,包括文件IO,及摇杆,鼠标,键盘的输入。
main:main函数参数处理
math:数学相关部分,包括一个vector的实现
memory:内存处理部分,
object:object部分
physics:物理部分
plugin:插件部分
render:渲染部分,包括摄像机,特效,渲染器,shader,视口等部分
sound:声音部分
utils:工具类部分,包括用C语言实现的HashTable,List,Tree3大容器,一些有用的String函数,以及一个screenshot实现。(感觉这个放在display更加合适)

另外,Orx比较特殊的是包含一套插件:
通过插件来实现的部分有:Display,Joystick,Keyboard,Mouse,Physics,Render,Sound。
通用插件(实现除物理,声音以外的功能)本身现在有4套:GLFW ,IPhone,SDL ,SFML
其中SFML是1.1版本前使用的插件。GLFW是现在(1.2版本)默认使用的插件。
其中SFML,GLFW插件支持3大主流平台(Win32,Linux,MacOS),SDL插件仅支持Win32,Linux。
IPhone的插件是因为IPhone版本比较特殊而特别加入的,对应支持IPhone/IPad平台。
声音插件现在有SFML的插件和OpenAL的插件。SFML为1.1以前版本默认声音插件,OpenAL的实现为1.2版本默认声音插件。可能是因为OpenAL插件太好,所以作者虽然使用了SDL,但是并没有使用SDL的声音模块做SDL的声音插件。
物理插件目前仅有Box2D实现的插件。

逻辑结构:

从"orxModule.h"的一个枚举定义中,可以看到Orx作者为Orx整体的逻辑模块的划分。

/* * Module enum */
typedef enum __orxMODULE_ID_t
{
orxMODULE_ID_ANIM = 0 ,
orxMODULE_ID_ANIMPOINTER,
orxMODULE_ID_ANIMSET,
orxMODULE_ID_BANK,
orxMODULE_ID_BODY,
orxMODULE_ID_CAMERA,
orxMODULE_ID_CLOCK,
orxMODULE_ID_CONFIG,
orxMODULE_ID_DISPLAY,
orxMODULE_ID_EVENT,
orxMODULE_ID_FILE,
orxMODULE_ID_FILESYSTEM,
orxMODULE_ID_FONT,
orxMODULE_ID_FPS,
orxMODULE_ID_FRAME,
orxMODULE_ID_FX,
orxMODULE_ID_FXPOINTER,
orxMODULE_ID_GRAPHIC,
orxMODULE_ID_INPUT,
orxMODULE_ID_JOYSTICK,
orxMODULE_ID_KEYBOARD,
orxMODULE_ID_LOCALE,
orxMODULE_ID_MAIN,
orxMODULE_ID_MEMORY,
orxMODULE_ID_MOUSE,
orxMODULE_ID_OBJECT,
orxMODULE_ID_PARAM,
orxMODULE_ID_PHYSICS,
orxMODULE_ID_PLUGIN,
orxMODULE_ID_RENDER,
orxMODULE_ID_SCREENSHOT,
orxMODULE_ID_SHADER,
orxMODULE_ID_SHADERPOINTER,
orxMODULE_ID_SOUND,
orxMODULE_ID_SOUNDPOINTER,
orxMODULE_ID_SOUNDSYSTEM,
orxMODULE_ID_SPAWNER,
orxMODULE_ID_STRUCTURE,
orxMODULE_ID_SYSTEM,
orxMODULE_ID_TEXT,
orxMODULE_ID_TEXTURE,
orxMODULE_ID_VIEWPORT,

orxMODULE_ID_NUMBER,

orxMODULE_ID_MAX_NUMBER = 64 ,

orxMODULE_ID_NONE = orxENUM_NONE

} orxMODULE_ID;

因为英文命名的枚举已经很能说明各逻辑模块包含的内容了,这里就不一一介绍了。

引用的外部工程

现在已经不是需要所有事情都从头做起的年代了,作为游戏引擎,需要处理的各个方面内容实在太多,很难都完全自己处理,Orx使用了一些外部库来完成一些相应功能。
深蓝在Orx的官方中文论坛中进行了一些总结 ,较为详细,可供参考。
我这里仅仅简单的说明一下:
Box2D:物理部分
freetype:制作字体工具时使用,因为Orx引擎本身并不支持freetype即时生成的材质实现字体显示,所以事实上Orx引擎本身并不需要freetype。
glfw,SDL,SFML:作为主要模块的插件实现,主要用于解决跨平台相关的问题。
SOIL:用于支持常用的图片格式。
OpenAL:声音处理。
stb_vorbis:ogg声音格式支持。
libsndfile:wav,aiff声音格式支持。

我描述的仅仅是大概的情况,关于引用外部工程以及插件的详细使用情况可以参考Orx的changelog

关于SFML

在最后提供一些额外的关于SFML信息,虽然与Orx的总体结构无关,但是也顺面在此记录。
很多外部工程的引用都是从新的1.2开始的,而且都是为了替代SFML的相关部分而引入的,也就是说,最后Orx用glfw/SDL + SOIL + OpenAL + stb_vorbis + libsndfile才实现了SFML的部分功能。这还真的仅仅是SFML的部分功能,仅仅是Orx需要的那一部分功能。这里可以看出SFML有多么强大,其作为simple and fast Multimedia library的库,与SDL(Simple DirectMedia Layer)相比真的是太不simple了。事实上,从SFML的License页 可以看到,SFML本身就使用了

这么多的外部库。而其中Orx最后使用用于替代SFML的相应部分的库,可以看到,也基本来自于SFML本身使用的这些库。。。。。。。。#@¥#@%……¥#@……¥6

iarwain对SFML的评价是强大,简单,但是buggy。
并且,从效率上来看,iarwain也是使用了这些外部库,但是在changelog中,有这么一句:
* IMPORTANT: Added new plugins for embedded versions: SDL plugins for win/linux (35-40% than the SFML ones) and GLFW plugins for win/linux/osx (~2% faster than SDL ones).
也就是说,在1.2版本比1.1版本要快35%一样,仅仅因为使用了新的插件替代了SFML。不知道SFML在simple与fast的平衡中,是否因为太过强大,功能太过丰富,而导致实现simple的代价过大。
features页面 上,可以看到,SFML甚至还包含一个网络模块。。。。。
不过,SFML用C++结合了上面这么多有用的库,实现那么多功能,还有一堆的其他语言(Python,Ruby,D,C#等)绑定,并且也使用很自由的zlib/png协议,感觉还是值得一试的。特别是当对效率没有那么高的要求的时候。。。。。。

原创文章作者保留版权 转载请注明原作者 并给出链接

write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie

分享到:
评论

相关推荐

    非典型2D游戏引擎 Orx 源码

    Orx 是一个轻量级的2D游戏引擎,它的设计目标是简洁、模块化和易于扩展。这个“非典型”之处在于它不采用常见的图形渲染管线,而是提供了一种更灵活的方式来构建游戏逻辑和视觉效果。Orx 以其小巧的体积、跨平台支持...

    Orx游戏引擎源码

    通过研究Orx源码,开发者不仅可以学习到2D游戏引擎的实现细节,还可以掌握C语言编程、数据结构和算法、跨平台开发等多方面技能。此外,Orx的社区活跃,提供了丰富的教程和示例,为学习者提供了良好的学习环境。

    Orx: Portable Game Engine:Orx:便携式游戏引擎-开源

    Orx是一款强大的便携式游戏引擎,专注于2D游戏开发,以其轻量级、灵活性和易用性而受到开发者们的欢迎。作为一个开源项目,Orx提供了完全透明的源代码,鼓励社区参与,促进了代码的持续改进和创新。 Orx的核心设计...

    ocaml-orx:Orx游戏引擎的OCaml绑定

    是“一个开源,可移植,轻便,基于插件,数据驱动且非常易于使用的2D导向游戏引擎。” Orx本身是用C编写的。 该存储库提供绑定以使用OCaml中的Orx。 声音,图形,物理,输入处理等等可以由Orx用C语言处理,而游戏...

    C#实现类似淘宝图片局部放大功能源码.rar_C#图片放大_C#实现类似淘宝图片局部放大功能源码_Orx

    而"orx"通常是指Orx Portable Game Engine,这是一个轻量级、跨平台的游戏开发框架,它可能被用在这个项目中,作为图像处理的一部分。不过,考虑到这是一个关于图片局部放大的功能,Orx可能不是主要的库,而是可能...

    sublime-text-orx:ORX配置对崇高文本的支持

    Orx( )是一个开源的,可移植的,轻量级的,基于插件的,数据驱动的并且非常易于使用的面向2D的游戏引擎。 Orx为游戏开发提供了完整的框架,目前可在Windows(mingw和使用Visual Studio的本机),Linux(x86 / x86...

    norx:ORX 2.5D游戏引擎的Nim包装器

    编译Nim ORX游戏唯一需要的就是这个Nimble模块和正确的库路径中的ORX动态库文件( liborx[p|d].so|dll )。 但是,对于调试等而言,同时具有带有ORX C源代码的完整ORX克隆等更为实用。生成并安装ORX 首先安装ORX ...

    rewrite_x32orx64_zh-CN

    这种方法常用于优化SEO(搜索引擎优化),简化或规范化URL,隐藏实际路径以增强网站安全,以及实现其他功能,如负载均衡。 **2. IIS URL重写模块:** IIS是微软提供的一个强大的Web服务器,URL重写模块是其可选...

    C语言资源大全之游戏编程

    * Orx:一个便携、轻量级、插件化、数据驱动的2D游戏引擎,使用zlib协议。 * Quake2:Quake2引擎,使用GNU GPL2.1协议。 * Spearmint:一个为FPS游戏设计的引擎,使用GNU GPL3 及更高版本协议。 游戏库 * Allegro...

    orx-install:ORx安装脚本

    什么是ORx? ORx的名称为“ Oh-Rex”,代表Outernet ReceiverX。“ X”代表自制设备。支持的设备和配置请注意,Raspberry Pi v1是目前唯一受支持的版本。 v2具有不支持的ARM v7处理器。 此存储库中的脚本支持以下...

    Suz-OrX-archive-refs-heads-master.zip

    在压缩包内的文件名列表中,只有一个条目:"Suz-OrX-archive-refs-heads-master",这可能是解压后的Git仓库目录结构,包括了.git目录(存储Git元数据)、源代码文件、测试文件、配置文件等。由于具体文件内容未知,...

    2017java源码-Order-System-Utility:ORXBuild2.0Beta版ORX是一个简单,可移植但功能有限的订购系统。

    2017年java源码java-Order-System-Utility ORX Build 2.0 Beta ORX是一个简单,可移植但功能有限的订购系统。 Jentzen Paolo Ancheta Javier版权所有(C)2017 ORX绝对不提供保修。 这是一个免费软件,出于教育目的...

    Leaf-Brawl:使用植物物质的战斗游戏

    游戏开发采用了开源的游戏引擎Orx,这是一款基于C语言的轻量级2D游戏引擎,支持跨平台开发,让开发者可以在多个操作系统上构建游戏,如Windows、Linux和Mac OS。GPLv3许可证的应用表明《Leaf-Brawl》是遵循自由软件...

    orx-color-pallete:orx引擎调色板定义

    欧罗调色板用于HTML颜色的定义。... 包含之后,您可以通过@Colors.MediumOrchid直接引用颜色名称。... 当您的编辑器支持颜色的可视化并且您可以原型化而无需使用颜色选择器工具切换到绘画程序时,这是很好的。

    EPORNER 2.COM%20-%20[bpM0orx6f9R]%20

    EPORNER 2.COM%20-%20[bpM0orx6f9R]%20

    IISURL重写组件(中文版)32位、64位rewrite_x32orx64_zh-CN.

    这个组件允许管理员通过创建规则来修改请求的URL,使其符合网站的结构优化或者SEO(搜索引擎优化)需求。在【标题】中提到的"IISURL重写组件(中文版)32位、64位rewrite_x32orx64_zh-CN",意味着这是适用于不同架构...

    TexturePacker 4.3.1 x64orX86完美破解

    TexturePacker 4.3.1 x64、X86完美破解,破解步骤简单,已经验证完美破解可用

    2D EXSY研究水杨醛硫代苄基半卡巴腙分子内活泼质子的动态特性 (2004年)

    这篇文章介绍了一项应用二维核磁共振(2D NMR)技术中的二维交换谱(2D EXSY)来研究水杨醛硫代苄基半卡巴腙分子在丙酮溶液中活泼质子动态特性的科学研究。研究的关键在于了解活泼质子与溶液中水分子间的化学交换速率...

    htop_2.0.1.orig.tar.gz

    htop工具安装源码; Htop是Linux系统中的一个互动的进程查看器,一个文本模式的应用程序(在控制台orX终端中),需要ncurses。与Linux传统的top相比,htop更加人性化。它可以让用户交互式操作,支持颜色主题,可横向...

Global site tag (gtag.js) - Google Analytics