将OpenGL依赖项与客户端代码和服务器代码分开

low*_*owq 0 c++ opengl dependencies

在我正在编写的游戏中,我希望有一个专用服务器连接到具有OpenGL渲染的客户端.除了服务器对mesa/OpenGL的不幸依赖之外,一切看起来都很棒.理想情况下,我希望能够拥有一个专用服务器而无需在十分之一上安装任何东西.

基本上,它归结为此.我的每个游戏对象都有一个精灵.为了渲染该精灵,必须通过图像数据将图像数据发送到图形卡glTexImage2D,并且a GLuint与纹理数据相关联.要渲染纹理,您需要纹理ID.

我通过使用两个不同的主文件将客户端与服务器分开,这两个主文件共享相同的核心游戏文件.只有客户端#include的图形相关文件.我的整体类结构如下所示:

//Core game stuff
class Image
{
    int width, height;
    //Image data
}

class Sprite
{
    const Image image;
}

//Graphics namespace
void renderObject()
{
    //Some rendering code...

    GLuint texId = loadTexture(someSprite.image);

    renderTexture(texId);

    unloadTexture(texId);
}
Run Code Online (Sandbox Code Playgroud)

现在,这看起来很棒,直到我们意识到每帧向图形卡发送图像数据很并且需要缓存.将GLuint图像存储在图像上是有意义的,甚至可以赋予它一个getTexture()功能.如果未设置,该函数将加载纹理并返回id.因此,图像数据将仅被发送到图形卡一次.

//Core game stuff
class Image
{
    int width, height;
    //Image data

    GLuint textureId;

  public:

    ~Image()
    {
        //...

        unloadTexture(textureId);
    }

    GLuint getTexture()
    {
        if(!textureId)
            return textureId = loadTexture();
        else
            return textureId;
    }
}

class Sprite
{
    const Image image;
}

//Graphics namespace
void renderObject()
{
    //Some rendering code...

    renderTexture(someSprite.image.getTexture());  //loadTexture() is only called once
}
Run Code Online (Sandbox Code Playgroud)

但是,由于使用了gl*函数,#include <GL/gl.h>这使得Image依赖于OpenGL,这使得我的所有游戏对象都依赖于OpenGL.此时,我的代码的服务器版本(没有OpenGL上下文或渲染)依赖于OpenGL.

你怎么建议我去解决这个问题?A #ifdef CLIENT是一种解决方案,但我想避免它.

Nic*_*las 5

您可以通过放弃整个客户端/服务器架构并正确执行来解决此问题.

服务器根本不需要了解任何有关OpenGL的信息.它不需要知道"精灵"或"图像".它甚至不需要知道特定客户端应该绘制什么.服务器需要做的就是维护世界状态,向各个客户端说明状态,并根据客户端提供的输入更新该状态.

如果您的服务器甚至加载 "图像"和"精灵",那么您的客户端/服务器就会出错.它应该加载的是这些对象具有的物理和碰撞属性.由每个客户端加载"图像"等等.

您的服务器根本不应该使用OpenGL.