java中的奇数缓冲异常

时间:2014-10-15 18:44:26

标签: java buffer

首先是我的代码部分:

    public void initiate() {
    vertexData = BufferUtils.createFloatBuffer(30000);
    colorData = BufferUtils.createFloatBuffer(30000);
    normalData = BufferUtils.createFloatBuffer(30000);

    float xShift = CHUNK_WIDTH * chunkX;
    float yShift = CHUNK_HEIGHT * chunkY;
    float zShift = CHUNK_LENGTH * chunkZ;

    for(int x = 0; x < CHUNK_WIDTH; x++) {
        for(int y = 0; y < CHUNK_HEIGHT; y++) {
            for(int z = 0; z < CHUNK_LENGTH; z++) {
                if(blockMap[x][y][z] == Block.air.getID()) continue;

                float colorFactor = 0.9f + ((float) World.colorNoise.noise((xShift+x) / 50.0f, (yShift+y) / 50.0f, (zShift+z) / 50.0f)) / 10.0f;

                synchronized(Elevox.world.chunkMap.getChunkMap()) {
                    if(Elevox.world.chunkMap.getBlockAt((int)xShift+x+1, (int)yShift+y, (int)zShift+z).isTransparent()) {
                        colorData.put(new float[] {0,colorFactor,0,0, 0,colorFactor,0,0, 0,colorFactor,0,0, 0,colorFactor,0,0});
                        normalData.put(new float[] {1,0,0, 1,0,0, 1,0,0, 1,0,0});
                        vertexData.put(new float[] {x+1.0f,y+0.0f,z+0.0f, x+1.0f,y+1.0f,z+0.0f, x+1.0f,y+1.0f,z+1.0f, x+1.0f,y+0.0f,z+1.0f});
                    }
                    if(Elevox.world.chunkMap.getBlockAt((int)xShift+x-1, (int)yShift+y, (int)zShift+z).isTransparent()) {
                        colorData.put(new float[] {0,colorFactor,0,0, 0,colorFactor,0,0, 0,colorFactor,0,0, 0,colorFactor,0,0});
                        normalData.put(new float[] {-1,0,0, -1,0,0, -1,0,0, -1,0,0});
                        vertexData.put(new float[] {x+0.0f,y+0.0f,z+0.0f, x+0.0f,y+0.0f,z+1.0f, x+0.0f,y+1.0f,z+1.0f, x+0.0f,y+1.0f,z+0.0f});
                    }
                    if(Elevox.world.chunkMap.getBlockAt((int)xShift+x, (int)yShift+y+1, (int)zShift+z).isTransparent()) {
                        colorData.put(new float[] {0,colorFactor,0,0, 0,colorFactor,0,0, 0,colorFactor,0,0, 0,colorFactor,0,0});
                        normalData.put(new float[] {0,1,0, 0,1,0, 0,1,0, 0,1,0});
                        vertexData.put(new float[] {x+0.0f,y+1.0f,z+0.0f, x+0.0f,y+1.0f,z+1.0f, x+1.0f,y+1.0f,z+1.0f, x+1.0f,y+1.0f,z+0.0f});
                    }
                    if(Elevox.world.chunkMap.getBlockAt((int)xShift+x, (int)yShift+y-1, (int)zShift+z).isTransparent()) {
                        colorData.put(new float[] {0,colorFactor,0,0, 0,colorFactor,0,0, 0,colorFactor,0,0, 0,colorFactor,0,0});
                        normalData.put(new float[] {0,-1,0, 0,-1,0, 0,-1,0, 0,-1,0});
                        vertexData.put(new float[] {x+0.0f,y+0.0f,z+0.0f, x+1.0f,y+0.0f,z+0.0f, x+1.0f,y+0.0f,z+1.0f, x+0.0f,y+0.0f,z+1.0f});
                    }
                    if(Elevox.world.chunkMap.getBlockAt((int)xShift+x, (int)yShift+y, (int)zShift+z-1).isTransparent()) {
                        colorData.put(new float[] {0,colorFactor,0,0, 0,colorFactor,0,0, 0,colorFactor,0,0, 0,colorFactor,0,0});
                        normalData.put(new float[] {0,0,-1, 0,0,-1, 0,0,-1, 0,0,-1});
                        vertexData.put(new float[] {x+0.0f,y+0.0f,z+0.0f, x+0.0f,y+1.0f,z+0.0f, x+1.0f,y+1.0f,z+0.0f, x+1.0f,y+0.0f,z+0.0f});
                    }
                    if(Elevox.world.chunkMap.getBlockAt((int)xShift+x, (int)yShift+y, (int)zShift+z+1).isTransparent()) {
                        colorData.put(new float[] {0,colorFactor,0,0, 0,colorFactor,0,0, 0,colorFactor,0,0, 0,colorFactor,0,0});
                        normalData.put(new float[] {0,0,1, 0,0,1, 0,0,1, 0,0,1});
                        vertexData.put(new float[] {x+0.0f,y+0.0f,z+1.0f, x+1.0f,y+0.0f,z+1.0f, x+1.0f,y+1.0f,z+1.0f, x+0.0f,y+1.0f,z+1.0f});
                    }
                }

                if(vertexData.remaining() < 72) {
                    vertexData.flip();
                    vertexData = BufferUtils.createFloatBuffer(vertexData.capacity() + 1024).put(vertexData);
                }

                if(colorData.remaining() < 96) {
                    colorData.flip();
                    colorData = BufferUtils.createFloatBuffer(colorData.capacity() + 1024).put(colorData);
                }

                if(normalData.remaining() < 72) {
                    normalData.flip();
                    normalData = BufferUtils.createFloatBuffer(normalData.capacity() + 1024).put(normalData);
                }
            }
        }
    }

    vertexData.flip();
    colorData.flip();
    normalData.flip();

    isInitiated = true;
}

这段代码在一个线程中运行并生成VBO数据(对于LWJGL)。我的问题是缓冲区返回IllegalArgumentException或BufferOverflowException,这在技术上是不可能的,因为如果需要,他会扩展缓冲区。甚至可能.put()方法抛出IllegalArgumentException?当我使用System.out.println()输出时,这不会发生,因为它会减慢此代码的速度。这个问题以前不存在,它工作得很好,我没有触及代码,因为它有效。

编辑:

Exception in thread "Thread-1" java.lang.IllegalArgumentException
at java.nio.Buffer.position(Unknown Source)
at java.nio.DirectFloatBufferU.put(Unknown Source)
at java.nio.FloatBuffer.put(Unknown Source)
at main.Chunk.initiate(Chunk.java:104)
at main.ChunkMap.loadChunksInBounds(ChunkMap.java:111)
at main.ChunkMap$1.run(ChunkMap.java:27)
at java.lang.Thread.run(Unknown Source)

0 个答案:

没有答案