0

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

代码 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;
}

我认为Code 2应该比Code1慢的原因是它有近 800 万个本机调用,但Code 1只有几个,它们在结果中做同样的事情。

原因是什么,如何提高代码的性能?

4

2 回答 2

1

代码 1 包括将您的值复制到一个数组中,然后将该数组复制到本机内存中 - 如果您的 n 保持不变,您可以通过只执行一次来避免这种开销。

于 2012-05-09T07:37:57.933 回答
0

这里重要的是 OpenGL 方法的作用,因为如果代码 2 的glVertexPointerglDrawElements方法遍历提供的数组,您最终会得到与您在自己处理迭代的代码 1 中所做的几乎一样多的迭代和方法。我不熟悉 OpenGL,但我假设glVertexPointer并且glDrawElements需要遍历提供的数组以创建等效于在每个元素上调用 glVertex3f 的内容。

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

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

于 2012-05-09T07:19:21.593 回答