я кодирование класса игрового движка, и я предложил, чтобы добавить #define, чтобы иметь дело с несколькими API, таким образом:Изменение API-интерфейсов во время выполнения или время компиляции?
#ifdef OGL
typedef COpenGl CBaseApi;
#elif defined(OGLES)
typedef COpenGlEs CBaseApi;
#elif defined(DX9)
typedef CDirectX9 CBaseApi;
#elif defined(DX10)
typedef CDirectX10 CBaseApi;
#elif defined(DX11)
typedef CDirectX11 CBaseApi;
#endif
И у меня есть два вопроса: Как я могу получить выше Работа?
Я пробовал:
class CBaseAPI
{
//abstract class, virtual functions
}
class COpenGL : public CBaseAPI
{
//implementations
}
Но это не сработало, как я ожидал.
И второй вопрос: этот метод #define лучше, чем использование какой-либо фабрики? Я изначально делал это:
//inside the Main program
myGameEngine.Initialize(GraphicAPI::DirectX11);
//inside the Initialize function
void GameEngine::Initialize(GraphicAPI graphicAPI)
{
switch(graphicAPI)
{
case GraphicAPI::DirectX11:
{
//Defined as private members:
//BaseAPI graphicAPI;
//class CDirectX11 : public BaseAPI
graphicAPI = new CDirectX11();
}
//other cases here
}
}
Есть ли какие-либо плюсы и минусы этих методов, и что является предпочтительным?
Итак, вам придется перекомпилировать, чтобы изменить API-интерфейсы рендеринга? – Hna
@Hna, способная изменить API рендеринга во время выполнения, не стоит дополнительных затрат на производительность. – Borgleader
@Borgleader Ну не меняйте его во время выполнения. Скорее, прочитайте аргумент командной строки или файл настроек пользователей, затем выберите API-интерфейс рендеринга. Вы не можете сделать это с помощью препроцессоров. – Hna