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
是一种解决方案,但我想避免它.
您可以通过放弃整个客户端/服务器架构并正确执行来解决此问题.
服务器根本不需要了解任何有关OpenGL的信息.它不需要知道"精灵"或"图像".它甚至不需要知道特定客户端应该绘制什么.服务器需要做的就是维护世界状态,向各个客户端说明状态,并根据客户端提供的输入更新该状态.
如果您的服务器甚至加载 "图像"和"精灵",那么您的客户端/服务器就会出错.它应该加载的是这些对象具有的物理和碰撞属性.由每个客户端加载"图像"等等.
您的服务器根本不应该使用OpenGL.