Java OpenGL ES-管理视频内存

Java OpenGL ES-管理视频内存,java,optimization,opengl-es,vbo,Java,Optimization,Opengl Es,Vbo,我为一个在Vivante GPU上有1GB RAM和128MB专用视频内存的系统开发了一个嵌入式应用程序 我的应用程序是系统正在完成的工作的三维实时表示。它的方式是,基本上一辆汽车在一个无限平面类型的场上移动,并在后面画一个多边形。这个多边形可能很复杂——有缝隙和洞,而且更新得相当频繁 换句话说,我在运行时通过对从数学模块接收到的形状进行三角剖分来创建网格,并将其绘制为网格 我对渲染做了一些优化——将我的“世界”分割成正方形,并将生成的网格分割成这些正方形块,然后确定需要绘制哪些块以及哪些块位于

我为一个在Vivante GPU上有1GB RAM和128MB专用视频内存的系统开发了一个嵌入式应用程序

我的应用程序是系统正在完成的工作的三维实时表示。它的方式是,基本上一辆汽车在一个无限平面类型的场上移动,并在后面画一个多边形。这个多边形可能很复杂——有缝隙和洞,而且更新得相当频繁

换句话说,我在运行时通过对从数学模块接收到的形状进行三角剖分来创建网格,并将其绘制为网格

我对渲染做了一些优化——将我的“世界”分割成正方形,并将生成的网格分割成这些正方形块,然后确定需要绘制哪些块以及哪些块位于平截头体之外

但就内存而言——到目前为止,我只是为顶点和索引数据创建了VBO,仅此而已。我把它们留在那里,再也不碰它们了——只需在需要时使用VBO的工具渲染网格即可

我遇到的问题是,过了一段时间,我的程序开始结巴。它冻结0.5秒或更长时间,然后平稳运行几秒钟,然后再次冻结。 编辑:今天将其缩小到GPU过热和时钟降低64倍。这不是软件问题。但我还是想知道内存管理的一般技巧

我把它固定在我的网格创建上(而不是我程序中的任何其他计算)。如果我停止创建网格(即创建VBO),如果我到达一个根本不创建网格的点,问题就会被延迟或完全消除

我会注意到,在程序开始结巴的时候,我肯定不会耗尽视频内存。在那个时候,128MB太多了,我最多使用几百KB。所以我甚至不确定它是与视频内存相关还是其他什么

我的问题是——我找不到好的文章来描述我真正需要做的事情。我所知道的是,如果我停止创建VBO,问题就消失了

我不确定我可以在这里放哪些代码作为示例,所以现在我不放任何代码


有什么帮助吗?

所以你的应用程序一直在调用
glGenBuffers
,但从不调用
glDeleteBuffers
?如果是这样,那么您将消耗越来越多的内存,直到它成为一个问题。最快的解决办法是在VBO对您不再有用时删除它们。这就是问题所在——它们总是有用的。因为虽然它们可能会在平截头体外移动太远,但车辆不会掉头并在范围内向后移动,因此它们需要再次显示。显然,如果我删除网格本身,我会调用glDeleteBuffers。那我该怎么办?将缓冲区读回RAM,删除VBO,然后在相关时将其加载回GPU?如果我移动得太远,我会将VBO卸载回RAM并将其删除。在GPU上仅为范围内的网格保留VBO?