1

空のbyteBufferが割り当てられています

data = ByteBuffer.allocateDirect(layerSize(0, faces - 1, 0, levels - 1) * layers);

この回答に続いてarray()、次のようにメソッドを使用しようとしました

public void setData(ByteBuffer data, int layer, int face, int level) {
    int offset = offset(layer, face, level);
    int levelSize = levelSize(level);
    this.data.put(data.array(), offset, levelSize);
}

しかし、私は得る:

Caused by: java.lang.UnsupportedOperationException
    at java.nio.ByteBuffer.array(ByteBuffer.java:994)

私が使用しようとしているソースバイトバッファは、次のように読み取られます。

    File file = new File(Load.class.getResource(fileName).getFile());
    FileInputStream fileInputStream = new FileInputStream(file);
    FileChannel fileChannel = fileInputStream.getChannel();

    return loadKtx(fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, (int) file.length()));

public static Texture loadKtx(ByteBuffer byteBuffer) throws IOException {
    ...
                byteBuffer.position(offset);
                byteBuffer.limit(offset + faceSize);

                ByteBuffer data = byteBuffer.slice();
                texture.setData(data, layer, face, level);

                byteBuffer.position(0);
                byteBuffer.limit(byteBuffer.capacity());

シンプルよりも良いオプションはありますか

    for (int b = 0; b < levelSize; b++) {
        this.data.put(offset + b, data.get(b));
    }

?

ただし、興味のある人のためにここにプロジェクト全体があります。

4

3 に答える 3

6

ある部分を別の部分にコピーしようとしているだけByteBufferですか? その場合はduplicate()、コピーしたい、複製したバッファのとをコピーしたい範囲にByteBuffer設定してから、 を使用する必要があります。お気に入り:positionlimitput()

ByteBuffer src = data.duplicate();
src.position(offset);
src.limit(offset + levelSize);
dest.put(src);
于 2015-10-09T03:58:52.377 に答える