Я большой поклонник создания игрового движка, способного адаптироваться не только в том, что он может сделать, но и в том, как он может обрабатывать новый код. В последнее время для моей графической подсистемы, я написал class
быть переопределен, который работает следующим образом:Wrapper over Graphics APIs
class LowLevelGraphicsInterface {
virtual bool setRenderTarget(const RenderTarget* renderTarget) = 0;
virtual bool setStreamSource(const VertexBuffer* vertexBuffer) = 0;
virtual bool setShader(const Shader* shader) = 0;
virtual bool draw(void) = 0;
//etc.
};
Моя идея состояла в том, чтобы создать список функций, которые являются универсальными среди большинства графических API. Тогда для DirectX11 Я бы просто создать новый дочерний class
:
class LGI_DX11 : public LowLevelGraphicsInterface {
virtual bool setRenderTarget(const RenderTarget* renderTarget);
virtual bool setStreamSource(const VertexBuffer* vertexBuffer);
virtual bool setShader(const Shader* shader);
virtual bool draw(void);
//etc.
};
Каждая из этих функций будет затем взаимодействовать с DX11
напрямую. Я понимаю, что здесь есть слой косвенности. Люди отключены этим фактом?
Является ли это широко используемым методом? Есть ли что-то еще, что я мог/должен был делать? Существует возможность использования препроцессора , но это кажется мне грязным. Кто-то также упомянул шаблоны для меня. Ребята, что вы думаете?
Ваше решение легче читается, а препроцессоры и шаблоны могут избавиться от 'виртуальных' функций. – dari
@ dari Действительно. Мне нравится читаемость и простота, но я также не хочу, чтобы слой косвенности слишком медленно замедлял работу.Честно говоря, я бы не колебался, если бы не тот факт, что мы говорим о графике здесь. –
Существует также возможность просто связываться с соответствующей реализацией класса. Тогда вам не нужна косвенность. Но вы теряете способность обрабатывать несколько таких одновременно, а также возможность отправлять один exe, который работает с любой комбинацией таких вещей. –