我正在开发的应用程序显示了一个大的(大约1M个顶点)静态2D图像。由于内存限制的问题,每次用户滚动或缩放时,我都会用新数据填充VBO,给人一种整个图像“存在”的印象,尽管它并不存在。
这种方法有两个问题: 1)尽管响应性“足够好”,但如果我能让滚动缩放更快、更少波动,那就更好了。2)我一直坚持在一次绘制中可以完成的64k顶点限制,这对一次可以显示多少图像设置了硬限制。如果能看到更多的图像,甚至同时看到所有的图像,那就太好了。尽管目前的性能已经足够好了,因为我们处于原型阶段,并且已经设置了数据来处理限制,但要进入产品级别,我们必须摆脱这种限制。
最近我发现,通过使用"android:largeHeap“选项,我可以在Motorola Xoom上获得256MB的堆空间,这意味着我可以将整个图像存储在VBO中。在我的理想世界中,我会简单地将VBO传递给OpenGL引擎,并告诉它相机已经移动,或者使用glScale/glTranslate来缩放/滚动。
我的问题是:我在正确的轨道上吗?我是不是应该总是“画”出所有的区块,让OpenGl找出哪些区块是实际可见的,还是自己找出哪些区块是可见的?使用gluLookAt和glScale/glTranslate有什么区别吗?
我不关心宽高比失真(图像是数学生成的,而不是照片),它比它的高度宽得多,未来顶点的数量可能会变得更大(例如60M)。耽误您时间,实在对不起。
发布于 2011-05-19 15:13:23
永远不要让OpenGL自己弄清楚屏幕上是什么。他不会。所有的顶点都会被转换,所有不在屏幕上的顶点都会被裁剪;但你对场景的OpenGL有更好的了解。
使用huuuge 256Mo VBO会让你每次渲染整个场景,每次都会变换所有的顶点,这对性能不好。
创建一些小的VBO(例如,3x3网格在任何时候都应该是可见的),并且只显示那些可见的VBO。基于移动外推的可选预填充未来VBO...
gluLookAt和glTranslate/...之间没有区别。两个都是计算矩阵,仅此而已。
顺便说一句,如果你的图像是静态的,你不能预先计算它(就像谷歌地图一样)吗?同样,您的数据是否提供了在缩小时进行“缩小”的方法?例如,对于点云,仅显示N个点中的1个...
https://stackoverflow.com/questions/6060709
复制相似问题