У меня есть ByteBuffer, в котором хранится изображение RGBA произвольных размеров. Я пытаюсь наложить некоторые части этого изображения треугольниками одного, случайного, цвета RGBA. Тем не менее, я получаю IndexOutOfBoundsException, что не имеет смысла для меня.ByteBuffer за пределами исключения
public ByteBuffer getByteBuffer()
{
/*Creates a ByteBuffer containing an image of a single background colour. A single pixel in the image is
represented as a float array of size 4*/
ByteBuffer buffer = Helpers.getBGByteBuffer(new float[]{1f, 1f, 1f, 1f}, width * height * 4 * Float.BYTES);
ByteBuffer triBuffer;
int offset;
for(RenderTriangle triangle : triangleList)
{
offset = triangle.getOffset().y; //Indicates the offset (position) of the triangle in relation to the image
triBuffer = triangle.getByteBuffer(); //Gets the ByteBuffer of the triangle.
for(int i = 0; i < triBuffer.capacity(); i += 4 * Float.BYTES) //Float.BYTES = 4
{
byte[] rgba1 = new byte[4 * Float.BYTES];
byte[] rgba2 = new byte[4 * Float.BYTES];
triBuffer.get(rgba1, i, rgba1.length); //Throws exception for i = 16
buffer.get(rgba2, offset + i, rgba2.length);
byte[] rgbaAdded = Helpers.addBytesAsFloats(rgba1, rgba2); //Calculates resulting RGBA value
buffer = buffer.put(rgbaAdded, offset + i, rgbaAdded.length);
}
}
return buffer;
}
Приведенный выше код бросает исключение на второй итерации для-петли (так я = 16) в
triBuffer.get(rgba1, i, rgba1.length),
Некоторые соответствующие значения отладки на второй итерации, как раз перед тем исключением является брошенный:
offset = 0
i = 16
rgba1 = {byte[16]@xxx}
rgba2 = {byte[16]@xxx}
triBuffer = {[email protected]}"java.nio.HeapByteBuffer[pos=16 lim=64 cap=64]"
buffer = {[email protected]}"java.nio.HeapByteBuffer[pos=32 lim=64 cap=64]"
Это действительно была проблема, мне также пришлось перемотать «буфер» 16 байт после каждой операции получения, чтобы учесть, что позиция буфера перемещается после чтения из нее. – user1870238