单例模式 + 工厂函数

#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. 全局变量

 
static CRenderDevice* g_pRenderDevice = NULL; static stRenderDeivceSettings g_stDeviceSettings;
  • g_pRenderDevice
    保存全局唯一的渲染设备实例(单例风格)。

  • g_stDeviceSettings
    保存全局的设备设置(分辨率、窗口句柄、颜色等)。

👉 说明 CRenderDevice 采用了 单例模式 + 工厂函数 的设计。


2. CRenderDevice::GetRenderDevice

 
CRenderDevice* CRenderDevice::GetRenderDevice(char* pRenderDeviceName)

逻辑分支:

  1. 如果 pRenderDeviceName == NULL

    • 直接返回当前全局实例 g_pRenderDevice

  2. 如果还没有创建设备 (!g_pRenderDevice)

    • 检查名字是否是 "Renderware"

    • 如果是,则 new CRenderDevice_Renderware

    • 调用 OnCreate(&g_stDeviceSettings) 进行初始化。

    • 如果失败,在 Debug 模式下输出错误字符串。

返回:全局的 g_pRenderDevice

👉 这就是一个 静态工厂方法,支持根据名字创建不同的渲染设备实例。
比如未来可以扩展成:

 
if(strcmp(pRenderDeviceName, "Direct3D9") == 0) { g_pRenderDevice = new CRenderDevice_D3D9; }

3. CRenderDevice 构造/析构

 
CRenderDevice::CRenderDevice(void) {} CRenderDevice::~CRenderDevice(void) {}
  • 空实现,基类只是提供统一接口。


4. CRenderDevice::OnCreate

 
BOOL CRenderDevice::OnCreate(stRenderDeivceSettings* pDeviceSettings) { if (!pDeviceSettings) return FALSE; if (!pDeviceSettings->m_hWnd) return FALSE; memcpy(&m_DefaultSettings, pDeviceSettings, sizeof(stRenderDeivceSettings)); return TRUE; }
  • 检查传入的设备设置是否有效(窗口句柄必须存在)。

  • 拷贝一份配置到 m_DefaultSettings

  • 返回 TRUE 表示成功。

👉 这是基类的默认实现,子类(如 CRenderDevice_Renderware)会在它的 OnCreate先调用基类的 OnCreate,再做自己的渲染 API 初始化。


5. CRenderDevice::OnDestroy

 
BOOL CRenderDevice::OnDestroy(void) { return TRUE; }
  • 默认啥也不干,返回 TRUE。

  • 子类可以 override 来清理资源(比如 RwEngineClose / RwEngineTerm)。


6. 总体流程

当外部调用:

 
CRenderDevice* pDevice = CRenderDevice::GetRenderDevice("Renderware");

执行流程是:

  1. 工厂方法检查 g_pRenderDevice 是否已存在。

  2. 没有 → 创建一个 CRenderDevice_Renderware

  3. 调用 OnCreate(&g_stDeviceSettings),初始化 RenderWare。

  4. 成功则返回设备实例。

以后别的地方调用 GetRenderDevice(NULL) 就能拿到这个全局唯一的设备指针。


总结一句话
这段代码实现了 渲染设备的单例工厂。默认支持 "Renderware",以后可以扩展 "Direct3D9""OpenGL",而基类 CRenderDevice 提供了基础的参数拷贝和接口框架

posted on 2025-10-07 23:39  lydstory  阅读(10)  评论(0)    收藏  举报

导航