如何在游戏开始前更改游戏中的图形API

y53ybaqx  于 2022-09-26  发布在  其他
关注(0)|答案(2)|浏览(381)

我想编写一个在OpenGL和DirectX中工作的游戏。我知道我必须使用OpenGL API和DirectX API分别编写一次函数。但在游戏开始之前,我如何选择图形API呢?

在我的程序中,我有一个超类,它具有必须由子类实现的纯虚函数。子类是使用特定的renderAPI来执行函数的类。

下面是一个小例子来说明这一点:


# include <iostream>

class Renderer{
public:

  enum API{
      None=0,
      OpenGL = 1,
      DirectX = 2
  };

 virtual void bindBuffer() = 0;
};

class OpenGLBuffer: public Renderer{
    public:
    virtual void bindBuffer(){
        //opengl Code
    }
};

static Renderer::API api = Renderer::API::OpenGL;  
using namespace std;

int main()
{

   switch(api){
       case Renderer::API::None:
            cout<<"Nothing" << std::endl;
            break;
       case Renderer::API::OpenGL:
            cout<<"OpenGL code" << std::endl;
            break;
       case Renderer::API::DirectX:
            cout<<"DirectX code" << std::endl;
       break;
   }

    return 0;
}

如何在游戏开始前更改静态变量API?我有个主意,但我不确定这是不是正确的方法。例如,使用int main(int argc, char *argv[])并在命令行中提供图形API。但如何让它成为现实中的大公司。

xj3cbfub

xj3cbfub1#

您可以使用抽象接口和继承。

创建一个包含要使用的API的抽象类(结构):

struct My_API
{
    virtual void draw_line(const Point& start, const Point& end) = 0;
}

使用工厂设计模式,使用您选择的框架创建实现API的子类:

struct OpenGL_API : public My_API
{
     void draw_line(const Point& start, const Point& end) override;
};

struct DirectX : public My_API
{
     void draw_line(const Point& start, const Point& end) override;
};

现在,您可以这样做:

My_API * p_api = nullptr;
switch (api)
{
    case USING_DIRECTX:  p_api = new DirectX; break;
    case USING_OPENGL:   p_api = new OpenGL; break;
}
// Draw the line
p_api->draw_line(start_point, end_point);

事实上,大公司只使用一种框架,并根据自己的需求进行定制。勇敢的公司制定了自己的框架。

au9on6nz

au9on6nz2#

大公司会有一个配置文件,在Main函数的开始,您将读取该文件并捕获您应该使用的API的值。然后在您的游戏中,您将有一个窗口/面板/屏幕,您可以在其中选择值,更改这些值后,新的值将保存到该配置文件中。下次您的软件启动时,它将读取该文件,其中将有一个新值,指定一个新的API。

关于代码,实际上应该是这样的:

static Renderer *api; //a pointer of a generic renderer
static OpenGlRenderer openGlApi;//an actual instance of a specific renderer
static DirectxRenderer directxApi;//an actual instance of a specific renderer

然后,在您的main函数中,您将拥有如下内容:

auto configuration = readMyConfigFileFunction("config.configdata");
switch(configuration.api){
   case Renderer::API::None:
        cout<<"Nothing" << std::endl;
        break;
   case Renderer::API::OpenGL:
        api = &openGlApi;
        break;
   case Renderer::API::DirectX:
        api = &directxApi;
   break;
 }
//then 
api->doRendering().....

相关问题