前言
2011年11月doom3代码发布
2012年11月doom3 BFG代码发布
两个游戏内容虽然相差不多,但doom3 BFG版本在技术上有很大进化(多线程框架,SWF,立体渲染)。本文技术分析主要基于doom3BFG版本
架构
idCommon是总控制类
绿色的是子系统,可以在各处调用。
Entity是基于继承的结构
多线程渲染
整体分为两个线程,主线程(BackEnd)和Game线程(FrontEnd)。主线程负责获取输入,处理网络消息,调用渲染API,以及调度Game线程。Game线程主要运行游戏逻辑以及生成RenderCommandBuffer。据说这个架构在doom3的版本里就已经实现了,但当时两个线程是反过来的,主线程生成RenderCommandBuffer,子线程调用渲染API,(FrontEnd和BackEnd的名字可能就是从那时候来的),但实现后不知道为什么在某些机器上运行不稳定。因此doom3在在发布的最后时刻又改成了单线程实现。直到后来才发现OpenGL API非创建Device的线程上被调用时,在某些平台上会有问题,但所有文档上都没提过这事儿。(看来卡马克也是被各种坑啊)
主线程:
获取用户输入
接收和发送网络消息
交换RenderCommandBuffer
启动Game线程
渲染上一帧RenderCommandBuffer中的内容
Game线程:
运行一到多个逻辑帧
生成本帧的RenderCommandBuffer
说明:
1&#