opengles java nio缓冲区

opengles java nio缓冲区,java,android,opengl-es,nio,Java,Android,Opengl Es,Nio,我的游戏有两个屏幕。每个屏幕都使用名为SpriteBatcher的类进行渲染。第一个屏幕渲染良好。第二个失败了,把上面的错误抛给了我 11-30 13:10:46.530: E/AndroidRuntime(1621): java.lang.IllegalArgumentException: Bad position (limit 0): 2 11-30 13:10:46.530: E/AndroidRuntime(1621): at java.nio.Buffer.positionImpl

我的游戏有两个屏幕。每个屏幕都使用名为SpriteBatcher的类进行渲染。第一个屏幕渲染良好。第二个失败了,把上面的错误抛给了我

 11-30 13:10:46.530: E/AndroidRuntime(1621): java.lang.IllegalArgumentException: Bad position (limit 0): 2
 11-30 13:10:46.530: E/AndroidRuntime(1621): at java.nio.Buffer.positionImpl(Buffer.java:357)
 11-30 13:10:46.530: E/AndroidRuntime(1621): at java.nio.Buffer.position(Buffer.java:351)
 11-30 13:10:46.530: E/AndroidRuntime(1621):
 atcom.rim.framework.gl.Vertices.bind(Vertices.java:66)
所以我试图在缓冲区大小为0时访问缓冲区的位置2。在我的代码中,虽然我没有看到任何bug

    this.vertexSize = (2 + (hasColor?4:0) + (hasTexCoords?2:0)) * 4;

    ByteBuffer buffer = ByteBuffer.allocateDirect(maxVertices * vertexSize); ///8 bit = 1 byte, 4 byte = 32bit float
    buffer.order(ByteOrder.nativeOrder());
    vertices = buffer.asFloatBuffer();
错误状态下的问题出现在我的绑定方法中:

    public void bind() {
    GL10 gl = glGraphics.getGL();

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    vertices.position(0);
    gl.glVertexPointer(2, GL10.GL_FLOAT, vertexSize, vertices);

    if(hasColor) {
        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
        vertices.position(2);
        gl.glColorPointer(4, GL10.GL_FLOAT, vertexSize, vertices);
    }

    if(hasTexCoords) {
        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
        vertices.position(hasColor?6:2);
        gl.glTexCoordPointer(2, GL10.GL_FLOAT, vertexSize, vertices);
    }
}
该错误是由spritebatcher.bind方法引起的。我传递了零个精灵,所以我最终渲染了null…

有一个限制和容量。限制是软限制;容量定义缓冲区实际可容纳的容量。您正试图定位超过软限制


在新创建的缓冲区上,限制将等于容量。听起来好像有什么东西把限制改成了零。您可以使用clear方法重置限制、标记和位置。

分配缓冲区时,maxVertices的值是多少?maxSprite*4 maxSprite=1000I在过去30分钟内检查我的代码。我的极限似乎很好。现在我将使用log.d检查缓冲区限制。。。