最近在学习android时遇到了与字节缓冲区有关的东西,作为一个小白遇到不懂的代码总喜欢复制黏贴问度娘,费了好大劲才大概搞清楚视图缓冲区是个什么东东。。
在byteBuffer类中,有这么六个方法来创建对应的视图缓冲区:
asDoubleBuffer()、asIntBuffer()、asLongBuffer()、asShortBuffer()、asFloatBuffer()、asCharBuffer()
这里我以我遇到的asFloatBuffer()为例,代码如下:
vertexBuffer = ByteBuffer.allocateDirect(vertexData.length * 4)
.order(ByteOrder.nativeOrder())
.asFloatBuffer()
.put(vertexData);
vertexBuffer.position(0);
.asFloatBuffer()创建此字节缓冲区的视图,作为 float 缓冲区。
新缓冲区的内容将从此缓冲区的当前位置开始。此缓冲区内容的更改在新缓冲区中是可见的,反之亦然;这两个缓冲区的位置、界限和标记值是相互独立的。
新缓冲区的位置将为零,其容量和其界限将为此缓冲区中剩余字节数的四分之一,其标记是不确定的。当且仅当此缓冲区为直接时,新缓冲区才是直接的,当且仅当此缓冲区为只读时,新缓冲区才是只读的。
返回:
新的 float 缓冲区
此段内容参考java NIO(七) 缓冲区——视图缓冲区
asFloatBuffer()为当前的ByteBuffer创建一个CharBuffer的视图。在该视图buffer中的读写操作会按照ByteBuffer的字节序作用到ByteBuffer中的数据上。
也就是说,我们可以通过asFloatBuffer()方法创建一个Float型的缓冲区,这个缓冲区基于当前的ByteBuffer实现,我们把它叫做FloatBuffer型的视图,该视图共享当前的ByteBuffer空间(不一定是全部空间)。而只是从ByteBuffer类的对象中的当前读写位置position到读写限制limit位置之间的可用空间。在这个空间范围内,不论是ByteBuffer类的对象中还是在作为视图的新缓冲区中,对数据所做的修改,对另一个来说都是可见的。除了数据本身之外,两者的读写位置、读写限制和标记位置等都是相互独立的。视图buffer的readOnly属性和direct属性与ByteBuffer的一致,而且也只有通过这种方法,才可以得到其他数据类型的direct buffer。
相关参考:
java.nio.ByteBuffer 类 缓冲区
缓冲区视图
使用asFloatBuffer()在bytebuffer创建了一个float型的缓冲区(称为Float视图缓冲区),使用该视图可以更方便的以float型数据处理缓冲区的内容。
大部分内容大佬们都总结的很清楚,了解更多Buffer戳:
ByteBuffer常用方法详解
ios-byteBuffer
[![CI状态]( Lee / ios-byteBuffer.svg?style = flat)]( Lee / ios-byteBuffer )
ByteBuffer *buffer = [ByteBuffer initWithOrder: ByteOrderLittleEndian];
#输入数据
- ( void )put:( Byte )b;
- ( void )putByteBuffer:(ByteBuffer*)bb;
- ( void )putData:( NSData *)data;
- ( void )putShort:( short )d;
- ( void )putFloat:( float )f;
- ( void )putInt:( int )i;
- ( Byte )get:( int )index;
视图缓冲器(view buffer)能让我们过某个特定的基本数据类型的视图查看其底层的ByteBuffer。换言之,就是把ByteBuffer里面的数据都看作某种primitive基本类型数据。但是视图view背后真正存储数据的地方 是ByteBuffer ,所以对view的任何操作都会作用到ByteBuffer上 。正如下面这些实例,有了view,你就能很方便地把基本类型数据primitive读...
对于HeapFloatBuffer,即由FloatBuffer.allocate或FloatBuffer.wrap创建,没有简单的解决方案.需要编写扩展ByteBuffer的自定义类.对于HotSpot 8中的直接缓冲区,这将适用于简单的情况:FloatBuffer floatBuffer = ByteBuffer.allocateDirect (...).asFloatBuffer();Byte...
需求: 在某个视图中添加对应的水印,和在某个tableView中给每一行均添加水印,并且水印均是动态生成的,以当前用户名作为水印的提示文字。
针对上述需求,即给视图添加一个水印,这个水印也不是固定的图片而是针对不同的用户展示不同的水印提示文字。则实现方法可以是绘制一张图片,并且这张图片的内容是由用户的名字填充。如果是给整个View添加水印,则直接将该图片加...
1、只读缓存模式:每次修改直接写入后端数据库,如果Redis缓存不命中,则什么都不用操作,如果Redis缓存命中,则删除缓存中的数据,待下次读取时从后端数据库中加载最新值到缓存中。
2、读写缓存模式+同步直写策略:由于Redis在淘汰数据时,直接在内部删除键值对,外部无法介入处理脏数据写回数据库,所以使用Redis作读写缓存时,只能采用同步直写策略,修改缓存的同时也要写入到后端数据库中,从而保证修改操作不被丢失。但这种方案在并发场景下会导致数据库和缓存的不一致,需要在特定业务场景下或者配合分布式锁使用。
Android沿用了J2ME的OPENGL ES API.
相比C版本的OpenGL,Opengl ES 没有glu和glut库,而且只能画三角形(多边形需要三角化)。
没有直接的drawXXX 方法,只有通过 glVertiexPointer传入顶点画图。
另外参数上,没有指针和C风格的数组,Java需要用Buffer类来代替这个。
先看android的glVertexPointer :
opengl中画图的时候要用到FloatBuffer,而点往往是存在数组中的,因此要转化一下。定义个FloatBuffer,
private FloatBuffer mTriangleBuffer;
public class BufferUtil { public static FloatBuffer mBuffer; public static Float
android OpenGL ES的书中使用了下面代码:
1)创建三个顶点
privateIntBuffertriggerBuffer=IntBuffer.wrap(newint[]{
0,one,0,
-one,-one,0,
one,-one,0,
2)然后使用triggerBuffer画...
数据从磁盘移动到进程的内存区域整个过程:进程发起read()系统调用,要求其缓冲区被填满,内核随即要求磁盘控制硬件发送命令,磁盘控制器直接将数据写入内核的内存缓冲区中,该过程通过DMA来完成,无需主CPU协助,当磁盘控制器将内核缓冲区填满,内核随即将数据复制到进程对应缓冲区中。内核空间:内核空间是操作系统所在的区域,可以直接与磁盘硬件设备通讯,控制用户区域的运行状态,所有的IO操作都直接或者间接的通过内核空间。当用户空间所需要的数据在内核空间中已经存在,那么内核无需再次向磁盘控制硬件发起系统调用,直接对内核
正如上一章节所说的,大多数的视图缓冲区都是字节缓冲区的视图;
本节我们用ByteBuffer举例;
ByteBuffer有这么六个方法来创建对应的视图缓冲区:
public abstract CharBuffer asCharBuffer()创建此字节缓冲区的视图,作为 char 缓冲区。
新缓冲区的内容将从此缓冲区的当前位置开始。此缓冲区内容的更改在新缓冲区中是可见的,反之亦然;这两个缓