在我写的app中,有一个提供渲染手段的类集群。当设备具备该功能时,它将解析为OpenGL ES3版本,否则将退回到OpenGL ES2版本。它看起来大致如下代码。
/* Client code */
/* `Renderer` is the class cluster instantiated like this: */
self.renderer = [Renderer rendererForAPI:self.context.API];
/* ----------- */
/* Inside `Renderer` implementation block: */
+ (instancetype)rendererForAPI:(uint)apiVersion
{
Renderer *renderer;
if (apiVersion >= 3) {
renderer = [[RendererForES3 alloc] init];
} else {
renderer = [[RendererForES2 alloc] init];
}
return renderer;
}
/* --------------- */
/*
* Both `RendererForES3` and `RendererForES2` classes
* are descendants of `Renderer`.
* One of them imports `OpenGLES.ES3`,
* and the other imports `OpenGLES.ES2`.
*/
我不希望代码过度复制。我的一些绘图方法在集群的两个成员中非常相似,并且一些方法几乎相同。 我意识到OpenGL调用,即使名称完全相同,也可以映射到不同版本标准中的不同偏移量。
所以问题是如何将代码重复保持在最低限度。 有两个明显的解决方案涌现在我的头上。 第一个是从ES2渲染器继承ES3渲染器,重写必要的方法并保留其余的。但在这种情况下,ES3 Renderer会同时收到两个OpenGL导入。我不确定在这种情况下要考虑哪些预防措施,以及它在不同硬件上的效果如何。
第二个解决方案是将重复代码保存在一个文本文件中,该文件将通过#include
指令包含在两个实现中。但这似乎妨碍了维护。
对于如何在依赖于不同版本的OpenGL标准的渲染器中重用代码,可能会有一些建议。也许这是一个架构问题,我的代码应该以其他方式设计。 我应该做出什么决定?
答案 0 :(得分:0)
目前,我选择从ES2渲染器中继承我的ES3渲染器。 它似乎工作正常,因为ES3被强调为ES2的超集。
最明显的缺点是版本100着色器和版本300着色器无法链接在一起。这意味着如果有人打算同时支持ES3和ES2,则可能需要有两个单独的着色器代码库。