首先声明一点,这是本人的构思,没成事实,请探讨。 首先我认为一个图形引擎最重要的是体系结构,结构决定了易用性,灵活性,以及效率和稳定性。 易用性: 这是最重要的,如果一个引擎不好用。就没什么价值了。 灵活性: 硬件,技术都是无时无刻不在变化的。如果一个软件的体系结构不灵活,就不能适应这些改变。同时一个引擎的灵活性不够,也表示它的可移植性也不好。也没什么意义。 效率: 如果你做出一个蜗牛,我想用户肯定更愿意去抓一只乌龟。 稳定性: 这个似乎没有说的必要 :( 从2004-3月开始,我就一直在想,引擎该是什么样子的,别人怎么用起来舒服,而我自己又能保证,可扩充性,效率,稳定性和可维护性等等的性(means ability not sex)。经过一阵时间的实践和思考。得到以下的结论,写出来为的是理顺自己的思维,顺便和别人讨论交流,以便于再思考,再改进。 引擎的模块: (1). platform 相关模块: 这部分负责初始化渲染环境。输入系统,Window的管理。 (2). Renderer: 该部分主要为所有和渲染动作相关的行为集合。包括Graphics resource system . render device. material system 等。这些全是基本的渲染原子操作和对象,比如 图元绘制,渲染状态管理等,以及纹理,VertexBuffer , Pixelbuffer等。这个Renderer是抽象的,可以替换的。 (3). Model System : 我觉得这块比重很大,如果说Renderer是画笔,那么我觉得Model system就是题材,Model System主要向Renderer提供绘制对象。或者说ModelSystem调用Renderer来绘制自己。Model System提供数据,Renderer则拥有绘制,呈现保存这些数据的功能。Model System里应有骨骼动画, (4). Effect System : 这部分主要包括 Particle system。以及其他部分特效系统(轨迹系统,面片系统)。该部分可以通过slot/socket机制和Model System结合。也就是在ModelSystem里提供socket。 EffectSystem把自己的对象插入到这个socket中。反过来,Effect System里的轨迹系统也能提供socket,而这个socket上可以插EffectSystem里的对象也可以插Model。 (5). 场景管理: 这个很重要,不过还没研究过。 (6). 物理系统,暂时准备不研究。没能力。 (7). GUI: GUI里应该包含,GUI 消息收集系统,消息分发系统,窗口管理系统,绘制系统,资源风格控制系统。这些系统里面,绘制系统和Renderer相关,GUI消息收集器和platform相关。其他都可以做成完全独立。 (8). base service: 这是基础库。比如资源打包,图象读取分析,线程管理,配置系统等。这些东西是处在最地层的,绝对不需要和任何模块发生关系。 (9). 资源系统,在引擎里用的资源。统一起见,他们应该都有动态的load / unload的功能 (10). Application Framework. 用来搭建一个应用程序。 主要模块分析: Platform . 说到platform就不能不说可移植性能。我一直很重视移植性(因为我喜欢linux). 我的观点就是把所有和平台(系统,硬件)相关的东西。统统丢到这里来。 这个模块主要负责: 1. 渲染器的创建,寻找可用的渲染器,可以提供一个窗口,在这个窗口上创建渲染器,或者在创建窗口的时候也创建渲染器. 同时还应该负责D3D/OpenGL等的初始化。也就是说这个工作完成后,渲染器就已经就位了。 2. 窗口的创建和窗口消息的分派,把各种不同平台的消息处理成统一的,比如键盘消息,手柄消息等处理成一系列统一的定义。并负责消息循环。 这些处理过的消息,在消息循环过程中会被分配到对应的message listener上去。 3. 和GUI System的接口。这里platform应该负责转化和处理输入法消息,并通过一个IGUIMessageDisptcher的接口和GUI消息通信, 在这个接口的实现里面,会处理对应的输入消息,并在必要的时候显示IME的窗口。并把处理过的消息发给GUI系统 4. 线程,时间等设备。
Renderer. 这可以说是图形引擎的核心部件之一,我觉得它应该是包含以下部分: 1:Vertex Buffer 系统,应该有一个很强的Vertex Buffer描述能力, 用户可以很方便自由的创建不同格式的vertex buffer,并声明它的用途。 以适应各种不同的渲染需求,尤其是在VS/PS里。 2: Material System,他包含了: TextureLayer: 纹理层. 每一个纹理层有它的描述和作用. 以及表示这是个干什么用的纹理(Normal Map, Diffuse map还是其他什么map), 同时还需要属于这个TextureLayer的纹理环境属性(混合方式). 以及这个纹理的纹理坐标生成方式或者这个纹理使用那个通道的贴图坐标。 Shader System: 不知道说什么。 RenderState: 这个主要是一些什么Depth test . aplhablending啊一类的。 通常它决定了绘制顺序. 3: 资源系统的接口。渲染器里有texture,shader,material,vertex buffer等资源。 该接口主要与引擎里的资源系统相结合。同时提供管理器来管理这些资源。 4: 差点拉了渲染器本身: 渲染器提供一组最简练的接口,切换各种状态,材质,绘制几种抽象的有限的对象。 通常这些对象是Vertexbuffer/Index Buffer,材质等的一个结合。 千万不要让你的引擎的用户去操作引擎的底层。 GUI System. 我认为GUI是一个很独立的系统,它靠上面我提到的几个接口和Platform以及Renderer通信。除此之外这应该是一个到那里都可以替换的东西. Application FrameWork. 应用程序应该是一个IApplication的实现,主要包括。 1. IApplication : 应用程序,提交给Platform后,应用程序就有消息响应能力,并能进入到消息循环中. 2. MsgListener: 各种消息listener。比如,platform的消息应该交给IApplication中的listener处理. 这样,应用程序就有消息处理能力 3. ApplicationLayer. IApplication本身只一个状态机。ApplicationLayer是这个状态机的一个状态。 4. Application的各种System。比如声音系统,我们这里提到的RenderSystem等。 这些system.组成一个完善的多媒体应用程序. 当然除了RenderSystem以外,其他都不是我们这个3D引擎里要讨论 其他的模块还没分析,比如SceneGraph等,主要是因为不熟悉。当然也有一些不需要分析。本人的观点是尽量能重用和容易替换这些模块。不要把整个系统做的太紧密:比如单根派生等做法就会弄的系统很难分拆和在其他地方重用,或者用其他地方代码替换你的引擎对应模块。 其实还有很多话要写。没办法人懒,凑合着理解吧。欢迎批评,批评的时候请说出你的理由,请勿人生攻击,谁攻击谁小狗:-) xheartblue心蓝 |