首先是我的代码部分:
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)