В игре, которую я пишу, я хотел бы, чтобы выделенный сервер подключался к клиенту с рендерингом OpenGL. Все выглядит великолепно, за исключением того, что сервер имеет несчастливую зависимость от mesa/OpenGL. В идеале, я бы хотел иметь выделенный сервер без необходимости устанавливать что-либо поверх десятикратного.Отделив зависимость OpenGL от кода клиента и кода сервера
В принципе, это сводится к этому. У каждого из моих игровых объектов есть спрайт. Чтобы сделать этот спрайт, данные изображения должны быть отправлены на графическую карту через glTexImage2D
, а GLuint
связан с данными текстуры. Чтобы сделать текстуру, вам нужен идентификатор текстуры.
Я отделяю клиента от сервера, используя два разных основных файла, которые содержат одни и те же файлы основной игры. Только графические файлы клиента #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()
. Если не задано, функция загрузит текстуру и вернет идентификатор. Таким образом, данные изображения будут отправляться только на графическую карту один раз.
//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*
функций и #include <GL/gl.h>
это делает Image
зависит от OpenGL, что делает все мои игры объектов зависит от OpenGL. На этом этапе версия сервера моего кода (без контекста OpenGL или рендеринга) зависит от OpenGL.
Как вы предлагаете мне решить это? A #ifdef CLIENT
будет одним из решений, хотя я бы хотел его избежать.
Я не думал об этом, не плохая идея. – lowq