2011-05-01 64 views
0

在OpenGL ES 1.x Android应用程序中,我生成一个圆(从三角形),然后将其翻译大约一百次以形成一个级别。除了当某个事件发生时导致大约15个对象立即添加到存储圆的坐标的数组列表时,所有东西都可以工作。当这个事件迅速发生2次以上时,列表中的所有圆圈都消失约1/5秒。除此之外,这些圈子也可以顺利进行动画。OpenGL(ES) - 当新对象添加到ArrayList中时,多边形会暂时消失

该程序运行良好,因为使用相同的同步技术的Java SE应用程序,并且我尝试了六种左右的其他同步技术无济于事,所以我觉得问题在于openGL的实现。有什么建议么?

回答

1

所以这个列表正在你的鼻子下被修改?这听起来像你需要在OpenGL线程上对这个列表进行任何修改。尝试​​,其中Runnable实现您自己的代码。有可能。

+0

我在另一个有几千行代码的线程中有一个逻辑后端,并且从这里迁移这个列表很困难。至于同步:我使用同步块CopyOnWriteArrayLists在opengl函数中创建了数组的深层副本(作为缓冲区)...。没有技巧或一线修复? – 2011-05-01 02:00:31

+1

您所要做的就是创建一个可运行的程序,传递要写入的信息,然后发布可运行程序。在你修改数组的任何地方都要这样做为它创建一个函数,甚至。这并不难,即使有后端。这听起来像是如果你从UI线程中修改GL状态,无论如何你都会受到长期的影响。 – 2011-05-01 02:54:46

+0

事实证明,问题是getCircleSize方法返回一个整数,我需要一个浮点数。我一生中花了三个小时将int变为float。但它值得,它永远是。 – 2011-05-01 03:01:18

3

您是否真的必须将顶点数据存储在客户端内存中?如果你不修改它,我建议你改用VBO。只需将它上传到图形内存一次,然后从那里抽取。它会快得多(不需要你发送每个平局的所有顶点数据),我敢肯定,你不会遇到你所描述的问题。

转换可以按照你喜欢的方式完成,那么你只需要为你的圆圈的每个实例给出绘图命令。

+0

VBO看起来非常有用。用户输入会导致对对象(它们的顶点数据和其他事物)的修改,并且这些对象会导致对其他对象进行修改。将它们混合在一起看起来不太合适。哥们,谢啦。 – 2011-05-01 02:09:11