【发布时间】:2014-09-28 20:02:52
【问题描述】:
我非常喜欢拥有一个具有适应能力的游戏引擎,不仅在于它可以做什么,还在于它如何处理新代码。最近,对于我的 graphics 子系统,我写了一个 class 被覆盖,它的工作方式如下:
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 交互。我确实意识到这里有一层间接性。人们是否被这个事实拒之门外?
这是一种广泛使用的方法吗?还有什么我可以/应该做的吗?可以选择使用 preprocessor 但这对我来说似乎很乱。有人还向我提到了模板。大家觉得呢?
【问题讨论】:
-
您的解决方案更易于阅读,而预处理器和模板可以摆脱
virtual函数。 -
@dari 确实如此。我喜欢可读性和简单性,但我也不希望间接层太慢。老实说,如果不是因为我们在这里谈论图形,我不会犹豫。
-
还可以选择仅与类的相关实现进行链接。那么你就不需要间接了。但是你失去了同时处理几个这样的能力,以及发布一个可以与这些东西的任意组合一起工作的单个 exe 的能力。
-
顺便说一句,在实现中不要使用关键字
virtual,而是使用关键字override(注意:在语法中不是同一个地方)。 -
@Cheersandhth.-Alf 正式指出。我会调查你在之前的评论中所说的内容。谢谢!
标签: c++ opengl graphics directx