单例模式 + 工厂函数
#include "CRenderDevice.h" #include "CRenderDevice_Renderware.h" static CRenderDevice* g_pRenderDevice = NULL; static stRenderDeivceSettings g_stDeviceSettings; CRenderDevice* CRenderDevice::GetRenderDevice( char* pRenderDeviceName ) { if( !pRenderDeviceName ) return g_pRenderDevice; if( !g_pRenderDevice ) { if( strcmp( pRenderDeviceName, "Renderware" ) == 0 ) { g_pRenderDevice = new CRenderDevice_Renderware; if( !g_pRenderDevice->OnCreate( &g_stDeviceSettings ) ) { #ifdef _DEBUG OutputDebugString( "Failed to create render device. ( CRenderDevice::OnCreate() )\n" ); #endif } } } return g_pRenderDevice; } CRenderDevice::CRenderDevice( void ) { } CRenderDevice::~CRenderDevice( void ) { } BOOL CRenderDevice::OnCreate( stRenderDeivceSettings* pDeviceSettings ) { if( !pDeviceSettings ) return FALSE; if( !pDeviceSettings->m_hWnd ) return FALSE; memcpy( &m_DefaultSettings, pDeviceSettings, sizeof( stRenderDeivceSettings ) ); return TRUE; } BOOL CRenderDevice::OnDestroy( void ) { return TRUE; }
1. 全局变量
-
g_pRenderDevice
保存全局唯一的渲染设备实例(单例风格)。 -
g_stDeviceSettings
保存全局的设备设置(分辨率、窗口句柄、颜色等)。
👉 说明 CRenderDevice 采用了 单例模式 + 工厂函数 的设计。
2. CRenderDevice::GetRenderDevice
逻辑分支:
-
如果
pRenderDeviceName == NULL-
直接返回当前全局实例
g_pRenderDevice。
-
-
如果还没有创建设备 (
!g_pRenderDevice)-
检查名字是否是
"Renderware"。 -
如果是,则
new CRenderDevice_Renderware。 -
调用
OnCreate(&g_stDeviceSettings)进行初始化。 -
如果失败,在 Debug 模式下输出错误字符串。
-
返回:全局的 g_pRenderDevice。
👉 这就是一个 静态工厂方法,支持根据名字创建不同的渲染设备实例。
比如未来可以扩展成:
3. CRenderDevice 构造/析构
-
空实现,基类只是提供统一接口。
4. CRenderDevice::OnCreate
-
检查传入的设备设置是否有效(窗口句柄必须存在)。
-
拷贝一份配置到
m_DefaultSettings。 -
返回 TRUE 表示成功。
👉 这是基类的默认实现,子类(如 CRenderDevice_Renderware)会在它的 OnCreate 中 先调用基类的 OnCreate,再做自己的渲染 API 初始化。
5. CRenderDevice::OnDestroy
-
默认啥也不干,返回 TRUE。
-
子类可以 override 来清理资源(比如
RwEngineClose/RwEngineTerm)。
6. 总体流程
当外部调用:
执行流程是:
-
工厂方法检查
g_pRenderDevice是否已存在。 -
没有 → 创建一个
CRenderDevice_Renderware。 -
调用
OnCreate(&g_stDeviceSettings),初始化 RenderWare。 -
成功则返回设备实例。
以后别的地方调用 GetRenderDevice(NULL) 就能拿到这个全局唯一的设备指针。
✅ 总结一句话:
这段代码实现了 渲染设备的单例工厂。默认支持 "Renderware",以后可以扩展 "Direct3D9" 或 "OpenGL",而基类 CRenderDevice 提供了基础的参数拷贝和接口框架
浙公网安备 33010602011771号