java - 过多的native调用并不影响速度

标签 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应该比代码1慢的原因是它有近800万次本地调用,但是代码1有只是少数,但他们的结果都是一样的。

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

最佳答案

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

关于java - 过多的native调用并不影响速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10511146/

相关文章:

java - centos上liquibase安装,JNI报错

java - Solr - 在 Windows 7 64 位上使用 64 位 Java,而不是 32 位 Java

java - 我应该把上传的图片放在 java 应用程序的服务器上的什么地方?

c++ - glDrawElements 使用 VBO 提供 EXC_BAD_ACCESS

java - 如何使用jni将java中的Arraylist转换为c中的lpwstr

c++ - 使用 JNIEnv::FindClass:我需要释放返回的 jclass 引用吗?

java linkedhashmap迭代

java - 具有自定义日历系统的 Quartz 调度程序

opengl - 是否可以从 Blink 公开 WebGL 上下文?

c++ - 具有共享 OpenGL 上下文的 QOpenGLWidget?