太多的原生呼叫不会影响速度

时间:2012-05-09 06:54:23

标签: java opengl java-native-interface lwjgl

为什么在相同条件下运行的这两段代码在运行时间上没有差异?

代码1

static long time = 0;

static int n = 200;

static float[] vq = new float[200 * 200 * 200 * 3];
static int[] iq = new int[200 * 200 * 200];

static FloatBuffer verts = BufferUtils.createFloatBuffer(vq.length);
static IntBuffer ind = BufferUtils.createIntBuffer(iq.length);

static void draw() {

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            for (int k = 0; k < n; k++) {
                int index = (i * n * n) + (j * n) + k;
                vq[3 * index + 0] = i;
                vq[3 * index + 1] = j;
                vq[3 * index + 2] = k;

                iq[index] = index;
            }
        }
    }

    verts.put(vq);
    ind.put(iq);

    verts.flip();
    ind.flip();

    GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY);

    GL11.glVertexPointer(3, 0, verts);

    GL11.glDrawElements(GL11.GL_QUADS, ind);

    GL11.glDisableClientState(GL11.GL_VERTEX_ARRAY);

    long newTime = System.currentTimeMillis();
    System.out.println(newTime - time);
    time = newTime;
}

代码2

static int n = 200;

static long time = 0;

static void draw() {

    GL11.glBegin(GL11.GL_QUADS);

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            for (int k = 0; k < n; k++) {
                GL11.glVertex3f(i, j, k);
            }
        }
    }

    GL11.glEnd();

    long newTime = System.currentTimeMillis();
    System.out.println(newTime - time);
    time = newTime;
}

我认为代码2 应该比 Code1 慢的原因是,它有近800万次本机通话,但代码1 有只是少数,他们在结果中做同样的事情。

是什么原因,我怎样才能提高代码的性能?

2 个答案:

答案 0 :(得分:1)

代码1包括将值复制到数组中,然后将数组复制到本机内存中 - 如果n保持不变,则只需执行一次即可避免此开销。

答案 1 :(得分:0)

这里重要的是OpenGL方法的作用,因为如果代码2的glVertexPointerglDrawElements方法遍历提供的数组,那么最终会得到与您一样多的迭代和方法在代码1中,您可以自己处理迭代。我不熟悉OpenGL,但我认为glVertexPointerglDrawElements需要迭代所提供的数组,以创建相应的在每个元素上调用glVertex3f。

简而言之,无论是在java代码中还是在加载的库本身中,迭代次数和本机方法调用都大致相当。

至于改进你的代码,我无话可说,因为我从未使用过OpenGL。