2014-01-07 37 views
0

我的iOS应用程序在opengles视图中绘制2D曲线。场景渲染非常昂贵(可能需要1-2秒),这意味着,AFAIK,我无法更改比例,重绘和重新渲染以适应比例尺的增量变化(由于捏和 - 放大)。我目前直接在渲染到屏幕上的缓冲区中绘制。OpenGL ES 2.0以多种分辨率缩放

我认为我可以实现缩放的一种方法是渲染到给定分辨率的纹理,然后使用该纹理的一部分渲染四边形(可能以不同的比例和平移)。我的猜测是,它会使我当前使用的内存翻倍(如果我当然保持纹理的分辨率与屏幕相同)。有人可以证实吗?有没有另外一种方法可以在不重绘的情况下进行缩放,而不会使图形内存使用量加倍?

现在,如果我想保持一个像样的质量,我将不得不以不同的分辨率重新渲染。我最初的想法是“手动”创建一个mipmap,例如2级(1个纹理,100-150%变焦,另一个150-200%变焦)。这一次,我会有1个缓冲区+ 2个纹理。我当然可以在平移时重新渲染,但我认为用户体验不会很好。关于如何从用户体验和/或内存角度改进这些想法的任何想法?

回答

1

由于您已经需要很长时间来绘制场景,所以我建议您创建平铺。您可以在加载时以不同的分辨率绘制场景,并将输出保存为一些图像(将图像文件保存到某个临时目录中)。采用这种方法你应该有最小的内存消耗,用户体验应该很好。

如果你这样做,你还应该考虑如果你甚至想使用openGL来呈现场景,因为你有一些非常好的方法来在图像视图,滚动视图上呈现大图像。这样做,你可以实际跳过所有的GL - UIView绑定和呈现。您可以将所有GL工作移至某个单独的线程,这意味着如果场景发生变化,您可以在后台执行此操作,以允许用户在不中断的情况下处理当前场景。此外,如果您希望用户在场景之间“交换”,则可以保存它们并重新使用它们,而不会对性能造成任何影响。

+0

在我的场景中,我将无法使用平铺(此外,场景是动态的)。感谢您的回答,虽然 – user1727274

+0

作为一个方面说明,我有全功能的OpenGL代码。在我的情况下使用UIView没有任何意义。从辅助线程以精确的帧速率渲染也是不方便的。 – user1727274

+0

如果您的渲染需要1-2秒,则无法重新绘制场景并获得良好的用户体验。如果你有多个绘图级别,你的内存将增加更多的x2(150%缩放将意味着225%的内存增加,导致325%)。消除内存消耗并保留所有数据的唯一方法是将其放入某个文件中。一旦你在一些本地磁盘上使用它,你仍然可以使用你的“功能齐全的OpenGL代码”,这只是需要考虑的一点。长篇小说:我认为没有其他办法可以解决您的情况,满足您发布但平铺的所有要求。 –