在Android中为OpenGL加载大型数组数据的正确方法

时间:2014-05-08 21:11:23

标签: android arrays opengl-es-2.0

我正在使用OpenGL ES 2.0在Android中创建游戏。我在Blender中建模了所有必需的对象,并将它们导出到OBJ文件中。 OBJ文件包含顶点数据和对象的面,类似于:

....
v 0.007322 -0.046194 -0.007322
v 0.005866 -0.046194 0.000000
v -0.000000 -0.042275 0.000000
v -0.000000 -0.040898 -0.010355
....
f 5 1 4
f 1 2 3
f 89 88 105
f 103 104 89
....

对于某些对象,此数据非常大。所以我的问题是,将它加载到我的应用程序中的最快方法是什么,以便我可以在FloatBuffer对象中使用它?

搜索不多时,我发现了以下几种方法:

  1. OBJ 文件复制到应用程序的资源文件夹中,每次在运行时解析它并将其加载到FloatBuffer对象中。
  2. 从OBJ文件中解析顶点数据,并使用ObjectOutputStream或任何其他方法将其持久存储在另一个文件中。然后将此新生成的文件复制到resources文件夹中,以便在运行时加载它。
  3. OBJ 文件中的顶点数据直接复制到应用程序代码
  4. 实施例

    public class ObjectData {
        public float[] vertices = new float[] {
            0.007322f, -0.046194f, -0.007322f, ..... // Can be more than 1000 elements!
        }
    }
    

    但是这种方法会产生另一个问题,代码有时会超出Java 64K code_length限制。

    任何人都可以给我一些关于哪种方法最合适的建议,或者是否还有其他更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:0)

这是我认为最好的方式,我也在做同样的事情。对于许多大型对象,该方法非常慢,因此在应用程序运行时可能会有一些加载时间。