在我正在编写的游戏中,我希望有一个专用服务器连接到具有 OpenGL 渲染的客户端。一切看起来都很好,除了服务器不幸地依赖于 mesa/OpenGL。理想情况下,我希望能够拥有一台专用服务器,而无需在终端上安装任何东西。
基本上,它归结为这一点。我的每个游戏对象都有一个精灵。为了渲染这个精灵,图像数据必须通过 发送到显卡glTexImage2D
,并且 aGLuint
与纹理数据相关联。要渲染纹理,您需要纹理 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);
}
现在,这看起来很棒,直到我们意识到每帧将图像数据发送到显卡很慢并且需要缓存。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
}
但是,由于使用gl*
函数和 a#include <GL/gl.h>
这使得Image
依赖于 OpenGL,这使得我所有的游戏对象都依赖于 OpenGL。此时,我的代码的服务器版本(没有 OpenGL 上下文或渲染)依赖于 OpenGL。
你建议我如何解决这个问题?A#ifdef CLIENT
将是一种解决方案,但我想避免它。