Java OpenGL(ES)——当新对象添加到ArrayList时,多边形会暂时消失
在OpenGL ES 1.x Android应用程序中,我生成了一个圆(从三角形开始),然后将其平移大约一百次以形成一个级别。除了发生某个事件导致大约15个对象立即添加到存储圆坐标的arraylist时,所有操作都有效。当此事件快速发生2次以上时,列表中的所有圆圈消失约1/5秒。除此之外,圆的动画效果也很平滑Java OpenGL(ES)——当新对象添加到ArrayList时,多边形会暂时消失,java,android,graphics,opengl-es,arraylist,Java,Android,Graphics,Opengl Es,Arraylist,在OpenGL ES 1.x Android应用程序中,我生成了一个圆(从三角形开始),然后将其平移大约一百次以形成一个级别。除了发生某个事件导致大约15个对象立即添加到存储圆坐标的arraylist时,所有操作都有效。当此事件快速发生2次以上时,列表中的所有圆圈消失约1/5秒。除此之外,圆的动画效果也很平滑 该程序与使用相同同步技术的JavaSE应用程序运行良好,我尝试了六种左右的其他同步技术,但均无效,因此我觉得问题在于openGL实现。有什么建议吗?这么说你正在修改名单?听起来您需要在Op
该程序与使用相同同步技术的JavaSE应用程序运行良好,我尝试了六种左右的其他同步技术,但均无效,因此我觉得问题在于openGL实现。有什么建议吗?这么说你正在修改名单?听起来您需要在OpenGL线程上对此列表进行任何修改。尝试
Activity.postOnUiThread(Runnable)
,其中Runnable
实现您自己的代码。可能吧。那么列表正在你的眼皮底下修改?听起来您需要在OpenGL线程上对此列表进行任何修改。尝试Activity.postOnUiThread(Runnable)
,其中Runnable
实现您自己的代码。可能。您真的必须将顶点数据存储在客户端内存中吗?如果您不修改它,我建议您使用VBO。只需将其上传到图形内存中一次,然后从那里开始绘制。它会快得多(不需要您发送每次绘制的所有顶点数据),而且我很确定您不会遇到您描述的问题
变换可以任意进行,然后只需为圆的每个实例发出绘制命令。您真的需要将顶点数据存储在客户端内存中吗?如果您不修改它,我建议您使用VBO。只需将其上传到图形内存中一次,然后从那里开始绘制。它会快得多(不需要您发送每次绘制的所有顶点数据),而且我很确定您不会遇到您描述的问题
转换可以根据您的喜好进行,然后您只需为循环中的每个实例发出draw命令。我在另一个线程中有一个逻辑后端,它包含数千行代码,因此很难将这个列表从那里迁移出去。至于同步:我使用了同步块CopyOnWriteArrayList,在opengl函数中创建了数组的深度副本(作为缓冲区)。没有技巧或单行修复?您所要做的就是创建一个runnable,传入要写入的信息,然后发布runnable。在修改数组的任何地方都要这样做。甚至为它创建一个函数。这并不难,即使有后端。听起来,如果您要在UI线程之外修改GL状态,那么从长远来看,您将受到影响。事实证明,问题是getCircleSize方法返回了一个整数,而我需要一个浮点。我花了三个小时把int改成float。但它是值得的,它总是值得的。我在另一个线程中有一个逻辑后端,它有几千行代码,并且很难将这个列表从那里迁移出去。至于同步:我使用了同步块CopyOnWriteArrayList,在opengl函数中创建了数组的深度副本(作为缓冲区)。没有技巧或单行修复?您所要做的就是创建一个runnable,传入要写入的信息,然后发布runnable。在修改数组的任何地方都要这样做。甚至为它创建一个函数。这并不难,即使有后端。听起来,如果您要在UI线程之外修改GL状态,那么从长远来看,您将受到影响。事实证明,问题是getCircleSize方法返回了一个整数,而我需要一个浮点。我花了三个小时把int改成float。但它总是值得的。VBO看起来非常有用。用户输入会对对象(其顶点数据和其他内容)进行修改,而对象会对其他对象进行修改。把它混在一起似乎不对。谢谢,伙计。VBO看起来很有用。用户输入会对对象(其顶点数据和其他内容)进行修改,而对象会对其他对象进行修改。把它混在一起似乎不对。谢谢你,伙计。