Discuz! Board

标题: Android OpenGL ES 开发中的Buffer使用 [打印本页]

作者: zangcf    时间: 2016-7-25 16:23
标题: Android OpenGL ES 开发中的Buffer使用

在前面介绍Android OpenGL ES简明开发教程 说过为了提高性能,通常将顶点,颜色等值存放在java.nio 包中定义的Buffer类中。

ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);vbb.order(ByteOrder.nativeOrder());vertexBuffer = vbb.asFloatBuffer();vertexBuffer.put(vertices);vertexBuffer.position(0);

本篇简要介绍一下java.nio 包中各种Buffer的定义和用法,也为后面详细介绍Android OpenGL ES开发做点知识上的准备。

使用Java开发文件读取时经常用到的一个包是java.io ,包内定义了各种流Stream  类,将文件或是Stream看作一个byte数组,这种方法一般无法指定字节顺序(不同的计算机系统Byte order 可能不同),操作如“在文件偏移10个字节出读取一个四字节Little-endian整数“在使用Stream方式读取文件时就不十分方便。此外,Stream 方法是按一个字节一个字节方式处理的,读写性能上不是很好。

简单的说使用java.nio 中的Buffer类提供了更高的访问性能,这也是为什么OpenGL ES使用Buffer类的主要原因。

Buffer定义了三个状态变量:position, limit, capacity

[attach]223[/attach]


通常情况下这些状态变量有buffer自动管理,但也可以使用方法来重新设置这些变量。

比如: public final Bufferlimit(int newLimit) 重新设置limit

public final Bufferposition(int newPosition) 重新设置position

此外reset ,rewind mark ,clear 等在清空Buffer或是恢复Mark位置时也可修改limit ,position 的值。

get()方法

在ByteBuffer类中提供了四种get()方法用于读取:

1. byte get();
2. ByteBuffer get( byte dst[] );
3. ByteBuffer get( byte dst[], int offset, int length );
4. byte get( int index );

put() 方法

在ByteBuffer中定义了五种put()方法用于写入:

1. ByteBuffer put( byte b );
2. ByteBuffer put( byte src[] );
3. ByteBuffer put( byte src[], int offset, int length );
4. ByteBuffer put( ByteBuffer src );
5. ByteBuffer put( int index, byte b );

此外还定义了多种基本数据类型的读取写入方法:

· getByte()
· getChar()
· getShort()
· getInt()
· getLong()
· getFloat()
· getDouble()
· putByte()
· putChar()
· putShort()
· putInt()
· putLong()
· putFloat()
· putDouble()

java.nio 包中定义了基类Buffer ,还定义了和各种基本数据类型特定的Buffer类型ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer和ShortBuffer.其中ByteBuffer是其它类型的基础,因为分配内存是通过ByteBuffer的allocate来进行的,然后通过 ByteBuffer 的asXXXBuffer()转为其它类型:

可以使用下面三个方法来创建一个新的ByteBuffer:

public static ByteBuffer allocate(int capacity)
public static ByteBuffer allocateDirect(int capacity)
public static ByteBuffer wrap(byte[] array)

其中ByteBufferallocateDirect直接从OS分配内存,不受GC的限制,wrap使用已分配的数组作为buffer管理。

然后通过asXXXBuffer 转为其它类型的Buffer:

public abstract CharBuffer      asCharBuffer()
public abstract DoubleBuffer     asDoubleBuffer()
public abstract FloatBuffer     asFloatBuffer()
public abstract IntBuffer        asIntBuffer()
public abstract LongBuffer        asLongBuffer()
public abstract ShortBuffer        asShortBuffer()

以上介绍了Android OpenGL ES相关的Buffer的使用方法,将在不久的将来详细介绍OpenGL ES开发指南。











欢迎光临 Discuz! Board (http://47.89.242.157:9000/bbs/discuz/) Powered by Discuz! X3.2