虽然在OpenGL中,我们画的是3D物体,但手机屏幕毕竟是一个平面。我们在生活中,看见的也只是一个平面。那么,一个3D物体,我们看到的应该是什么样的,取决于我们的投影矩阵如何设置。...我们用下图的方式,进行观察。 ? 下图,近处的平面,距离视点为1,远处的为10。我们画的三角平面,就在距离视点2的位置。在距离视点1处,我们的视口大小是 2ratio x 2。...三角形的高度将变为画布高度的3/4。 而远平面的视点距离,则决定了我们可以看到多远的元素。...回归模型 完成了对投影的操作后,我们将操作模式设置到模型操作。...图形和色彩数据 OpenGL并不是对堆里面的数据进行操作,而是在直接内存中(Direct Memory),即操作的数据需要保存到NIO里面的Buffer对象中。
“铺好纸”是非常关键的一步。虽然我们说GLSurfaceView就是我们作图的纸,但是“铺”好这张纸,却也非常的重要。 下面我们重点讲下,这纸该怎么铺。OpenGL这张纸可不是一般的纸啊。...near表示的是眼睛到作图平面的距离(绝对值哦!),far表示眼睛到最远可见处的平面范围。于是,默认情况下z的作图范围就是在-near到-far的位置。...这样,接下来的语句可以是跟透视相关的函数,比如glFrustum()或gluPerspective(); GL_MODELVIEW,是对模型视景的操作,接下来的语句描绘一个以模型为基础的适应,这样来设置参数...byte 数据缓冲区 不管我们的数据是整型的还是浮点型的,为了完成 BigEdian 到 LittleEdian 的转换,我们都首先需要一个 ByteBuffer。...ByteBuffer mBuffer = ByteBuffer.allocateDirect(pointCount*dimension*4); mBuffer.order(ByteOrder.nativeOrder
一、简介 现在使用 NIO 的场景越来越多,很多网上的技术框架或多或少的使用 NIO 技术,譬如 Tomcat、Jetty、Netty,学习和掌握 NIO 技术已经不是一个 Java 攻城狮的加分技能,...NIO,英文全称 Non-blocking I/O,在 Java 领域,也称为 New I/O,是一种同步非阻塞的 I/O 模型,是解决高并发、I/O 高性能的有效方式,已经被越来越多地应用到大型应用服务器中...在活动连接数不是特别高的情况下,这种编程模型还是不错的,不用过多考虑系统的过载、限流等问题。...,而这个切换不是程序员可以控制的,由底层操作系统来帮我们处理。...那是不是所有的对象都可以直接采用堆外内存呢?
前言 我们先来想一个问题,为什么Netty使用NIO,而不是AIO呢?...AIO模型 异步非阻塞 服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理, 注:AIO又称为NIO2.0,在JDK7才开始支持。...Netty整体架构是reactor模型, 而AIO是proactor模型, 混合在一起会非常混乱,把AIO也改造成reactor模型看起来是把epoll绕个弯又绕回来 AIO还有个缺点是接收数据需要预先分配缓存..., 而不是NIO那种需要接收时才需要分配缓存, 所以对连接数量非常大但流量小的情况, 内存浪费很多 Linux上AIO不够成熟,处理回调结果速度跟不到处理需求,比如外卖员太少,顾客太多,供不应求...ByteBuffer allocate(int capacity)//设置缓冲区的初始容量 public static ByteBuffer wrap(byte[] array)//把一个数组放到缓冲区中使用
通道(Channel)是 java.nio 的第二个主要创新。它们既不是一个扩展也不是一项增强,而是全新、极好的 Java I/O 示例,提供与 I/O 服务的直接连接。...Channel 用于在字节缓冲区和位于通道另一侧的实体(通常是一个文件或套接字)之间有效地传输数据。 概念 通道可以形象地比喻为银行出纳窗口使用的气动导管。...有关 FileChannel 实现的文件锁定模型的一个重要注意项是:锁的对象是文件而不是通道或线程,这意味着文件锁不适用于判优同一台 Java 虚拟机上的多个线程发起的访问。...也就是说,一个映射一旦建立之后将保持有效,直到MappedByteBuffer 对象被施以垃圾收集动作为止。同锁不一样的是,映射缓冲区没有绑定到创建它们的通道上。...具体来说,如果映射有效时文件大小变化了,那么缓冲区的部分或全部内容都可能无法访问,并将返回未定义的数据或者抛出未检查的异常。关于被内存映射的文件如何受其他线程或外部进程控制这一点,请务必小心对待。
Java 的 IO 模型 Java中的IO模型主要有三种: 1.BIO(Blocking IO):同步阻塞式IO,是比较常用的IO模型,特点是编写相对简单,分为输入流和输出流,进行网络通讯时,输入流的读操作会阻塞住线程...既然 BIO 的缺点这么明显,那么是不是其他的能把这些缺点给避免掉呢?...,成为解决高并发与大量连接、I/O处理问题的有效方式。...AIO在Java 7中被引入,提供了一种基于事件驱动的非阻塞I/O模型,用于简化异步I/O操作的开发。 AIO的核心思想是使用异步I/O模型,而不是传统的同步或阻塞I/O模型。...了不起还是劝大家,如果你不是很精通,可以慢慢学习,不能强制的去在各自的系统中使用,量力而行,毕竟总比捣鼓出bug自己解决不了强很多。 关于 IO 模型,你了解了么?
I/O 是使用多个而不是单个缓冲区来保存数据的读写方法。...一个分散的读取就像一个常规通道读取,只不过它是将数据读到一个缓冲区数组中而不是读到单个缓冲区中。 同样地,一个聚集写入是向缓冲区数组而不是向单个缓冲区写入数据。...() 方法很像标准的 read 方法,只不过它们不是取单个缓冲区而是取一个缓冲区数组。...当你将它们放入一个数组中并使用分散读取来向它们读入消息时,头部和正文将整齐地划分到这两个缓冲区中。 我们从缓冲区所得到的方便性对于缓冲区数组同样有效。...它也有接受缓冲区数组的方法: long write( ByteBuffer[] srcs ); long write( ByteBuffer[] srcs, int offset, int length
NIO主要有三个核心部分组成: buffer缓冲区 Channel管道 Selector选择器 2.1buffer缓冲区和Channel管道 在NIO中并不是以流的方式来处理数据的,而是以buffer缓冲区和...3.2非阻塞I/O模型 recvfrom从应用层到内核的时候,如果没有数据就直接返回一个EWOULDBLOCK错误,一般都对非阻塞I/O模型进行轮询检查这个状态,看内核是不是有数据到来。 ?...select/epoll的优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接。 3.4I/O模型总结 正经的描述都在上面给出了,不知道大家理解了没有。...下面我举几个例子总结一下这三种模型: 阻塞I/O: Java3y跟女朋友去买喜茶,排了很久的队终于可以点饮料了。我要绿研,谢谢。可是喜茶不是点了单就能立即拿,于是我在喜茶门口等了一小时才拿到绿研。...从一开始我们就说过了,nio的核心要素有: Buffer缓冲区 Channel通道 Selector选择器 我们在网络中使用NIO往往是I/O模型的多路复用模型!
Reactor模型是典型的事件驱动模型。在网络编程中,所谓的事件当然就是read、write、bind、connect、close等这些动作了。...Reactor模型的实现有很多种,下面介绍最基本的三种: 单线程版 多线程版 主从多线程版 Key Word:Java NIO,Reactor模型,Java并发编程,Event-Driven 单线程版本...:TCP粘包拆包问题 TCP粘包拆包问题 我们都知道TCP协议是面向字节流的,而字节流是连续的,无法有效识别应用层数据的边界。...TCP协议的基本传输单位是报文段,而每个报文段最大有效载荷是有限制的,一般以太网MTU为1500,去除IP头20B,TCP头20B,那么剩下的1460B就是传输层最大报文段的有效载荷。...下面分析下单线程版的Reactor模型的缺点: 自始自终都只有一个Reactor线程,缺点很明显:Reactor意外挂了,整个系统也就无法正常工作,可靠性太差。
从硬件设备读取的数据,应小于整个记录缓冲区。...bufferSizeInBytes 这个是最难理解又最重要的一个参数,它配置的是 AudioRecord 内部的音频缓冲区的大小,该缓冲区的值不能低于一帧“音频帧”(Frame)的大小,一帧音频帧的大小计算如下...返回值是读入缓冲区的总byte数。...只是循环查找有效的采样率。...这里设置编码器最大的缓冲区大小。
同步:在NIO模型中,虽然引入了新的机制和概念(如选择器、通道和缓冲区),但I/O操作仍然是同步的。这意味着当应用程序发起一个I/O请求时,它仍然需要等待操作系统内核处理这个请求。...当一个通道上的I/O操作不再受到阻塞的限制时(例如,可以立即返回而不是等待操作完成),我们说它是非阻塞的。...NIO模型通过引入选择器和通道,使得单个线程可以处理多个连接,从而提高了系统的吞吐量和可伸缩性。虽然NIO的编程模型相对复杂,但它为处理高并发和大数据量的场景提供了更有效的解决方案。...分配一个ByteBuffer来作为数据传输的中介。这个缓冲区的大小可以根据需要进行调整;在这里,我们选择了一个1024字节的缓冲区。 使用一个while循环来持续从源文件中读取数据,直到文件末尾。...BIO是同步阻塞的I/O模型,它简单直接但性能有限;而NIO是同步非阻塞的I/O模型,它引入了多路复用器和缓冲区的概念,提高了系统的吞吐量和性能。
三个核心部分模型图: 简单说明: 一个Thread(线程)对应一个Selector选择器,每个选择器对应着多个Channel通道,每个通道又都对应着一个缓冲区(Buffer) Selector 会根据不同的事件...但是线程池本生是有局限的的,在并发数并不是特别高的时候(小于单机1000),使用线程池搭用这种模型还是可行的,并竟线程池是一个天然的漏斗,不用过多考虑负载、限流等问题,编程也简单。...主要表现在以下几个方面: 首先线程的创建和销毁的成本相当高,并不是我们简单的看到的new Thread().start()即可了,它之后是去调用本地函数private native void start0...多路复用I/O模型 Java NIO使用的即是这种模型。 多路复用IO主要用于处理多个IO连接时候的场景。...数据是从通道读入缓冲区,从缓冲区写入到通道中的。 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存。
这套API由三个主要的部分组成:缓冲区(Buffers)、通道(Channels)和非阻塞I/O的核心类组成。...也就是说,这个时候,已经不是一个连接就要对应一个处理线程了,而是有效的请求,对应一个线程,当连接没有数据时,是没有工作线程来处理的。...这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序...模型上了解 按照《Unix网络编程》的划分,IO模型可以分为:阻塞IO、非阻塞IO、IO复用、信号驱动IO和异步IO,按照POSIX标准来划分只分为两类:同步IO和异步IO。...收到操作系统的IO模型,又不得不提select/poll/epoll/iocp。
方法 转换为CharBuffer字符缓冲区及中文的处理 设置与获得字节顺序 创建只读缓冲区 压缩缓冲区 比较缓冲区内容 复制缓冲区 对缓冲区扩容 ByteBuffer类提供了6类操作。...1):public static final ByteOrder BIG_ENDIAN:表示BIG_ENDIAN字节顺序的常量。按照此顺序,多字节值的字节顺序是从最高有效位到最低有效位的。...按照此顺序,多字节值的字节顺序是从最低有效位到最高有效位的。 order(ByteOrder bo):修改此缓冲区的字节顺序,默认情况下,字节缓冲区的初始顺序是BIG_ENDIAN。...此缓冲区内容的更改在新缓冲区可见,新缓冲区内容是只读的 byte[] byteArrIn = {1,2,3,4,5}; ByteBuffer buffer1 = ByteBuffer.wrap...ByteBuffer类的实例,如果不是,返回false; 判断remaining是否一样,不一样,返回false; 判断position和limit是否一样,有一个不一样,返回false。
之所以会出现这样的问题,是因为 NIO 编程不是单纯的一个技术点,而是涵盖了一系列相关的技术、专业知识、编程经验和编程技巧的复杂工程,所以即使你编程很多年,也仍然不大懂 NIO,这不怪你,只怪当初 Sun...如下所示是 ByteBuffer 的设计示意图,它通过分离读写的位置变量(reader index 及 writer index)简单、有效地解决了 ByteBuffer 难懂的 flip 操作问题,这样一来...上述原理听起来很简单,但实际上有很多容易陷入的“坑”,如下所述。 收到可写事件时,想要一次性地写入全部数据,而不是将剩余数据放入 Session 中,等待下次可写事件的到来。...如果仅仅到此为止,则 NIO 里的 Reactor 模型还不算是很复杂,但实际上,我们的服务器是多核心的,而且需要高速并发处理大量的客户端连接,单线程的 Reactor 模型就满足不了需求了,因此我们需要多线程的...为了更好地使用有限的内存,Mycat NIO 设计了一个“双层”的 ByteBuffer Pool 模型,全局的 ByteBufferPool 被所有 Connection 共享,而每个 Reactor
Java NIO(Java Non-Blocking IO)也就是非阻塞IO,说是非阻塞IO,其实NIO也支持阻塞IO模型(默认就是),相对于BIO来说,NIO最大的特点是支持IO多路复用模式,可以通过一个线程监控多个...每次读写缓冲区数据时都会改变(累加),为下次读写作准备 ● 上限(limit):表示缓冲区的临时读/写上限,不能对缓冲区超过上限的位置进行读写操作,上限是可以修改的(flip函数)。...如果现在想读取Buffer中的数据,需要执行一下Buffer的flip()函数,把limit置为8(position的值),position重新置为0,这时候position到limit之间的数据才是有效的...=capacity byteBuffer.compact(); // 读了一部分数据后,切换到写模式,会把未读的数据向前压缩,只留下有效数据(一般认为position~limit之间的数据为有效数据),...NIO使用了Selector,IO模型就是属于IO多路复用(同步非阻塞),可以同事检测多个IO事件,即使某一个IO事件尚未就绪,可以处理其他就绪的IO事件。
可参考之前的文章:NIO 之 ByteBuffer实现原理 下面是对之前文章的一个补充 Buffer 类 结构 对于每个非布尔原始数据类型都有一个缓冲区类。...我们将代表“abcde”字符串的 ASCII 码载入一个名为 buffer 的 ByteBuffer 对象中。当在图1 中所新建的缓冲区上执行以下代码后。...如果我们将位置值重新设为 0,通道就会从正确位置开始获取,但是它是怎样知道何时到达我们所插入数据末端的呢?这就是上界属性被引入的目的。上界属性指明了缓冲区有效内容的末端。...compact() 方法 有时,您可能只想从缓冲区中释放一部分数据,而不是全部,然后重新填充。为了实现这 一点,未读的数据元素需要下移以使第一个元素索引为 0。...所有一个byteBuffer 变动,会影响另一个 ByteBuffer。 但 position、limit、mark 都是独立的。
3.用来处理数据的线程数。 API调用 当然,使用NI0的API调用时看起来与使用I0时有所不同,但这并不意外,因为并不是仅从一个InputStream逐字节读取,而是数据必须先读入缓冲区再处理。...它们之间的继承关系如下图所示: 使用NI0读取数据 在前面我们说过,任何时候读取数据,都不是直接从通道读取,而是从通道读取到缓冲区。...阻塞I/0的通信模型示意图如下: 如果你细细分析,一定会发现阻塞I/0存在一些缺点。根据阻塞I/0通信模型,我总结了它的两点缺点: 当客户端多时,会创建大量的处理线程。...在I0多路复用模型中,事件循环将文件句柄的状态事件通知给用户线程,由用户线程自行读取数据、处理数据。...而在异步I0模型中,当用户线程收到通知时,数据已经被内核读取完毕,并放在了用户线程指定的缓冲区内,内核在I0完成后通知用户线程直接使用即可。
内存映射文件 I/O 是通过使文件中的 数据出现为 内存数组的内容来完成的,这其初听起来似乎不过就是将整个文件读到内存中,但是事实上并不是这样。...它们之间的继承关系如下图所示: ¶1.使用-nio-读取数 任何时候读取数据,都不是直接从通道读取,而是从通道读取到缓冲区。...,同样数据不是直接写入通道,而是写入缓冲区,可以分为下面三个步骤: 1.从 FileInputStream 获取 Channel。...阻塞 I/O 的通信模型示意图如下: 如果你细细分析,一定会发现阻塞 I/O 存在一些缺点。根据阻塞 I/O 通信模型,我总结了它的两点缺点: 1.当客户端多时,会创建大量的处理线程。...模型, 而 AIO 是 proactor 模型, 混合在一起会非常混乱,把 AIO 也改造成 reactor 模型看起 来是把 epoll 绕个弯又绕回来 3.AIO还有个缺点是接收数据需要预先分配缓存
例如ByteBuffer: ByteBuffer bf = ByteBuffer.allocate(1024).asReadOnlyBuffer() Flip():讲一个能够继续添加数据元素的填充状态的缓冲区翻转为一个准备读出元素的释放状态...rewind(): bf.rewind() = bf.position(0) 缓冲区不是线程安全。...Buffer.wrap(byte[], int offset, int length):offset,length只是设置了初始化状态,并不是创建只占数组子集的缓冲区,缓冲区可以可以存取数组的全部范围。...为基础缓冲区的切分,基于基础缓冲区的位置和上界(position-limit) ? 如下,ByteBuffer.asCharBuffer(): ?...从ByteBuffer的当前位置存取字节数据,根据缓冲区当前的有效字节数序,字节会被排列或打乱成原始的数据类型。 例如getInt(),从当前位置开始的四个字节会被包装成一个Int返回。如下: ?
领取专属 10元无门槛券
手把手带您无忧上云