webgl类型化数组

648 阅读2分钟
「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

类型化数组的出现最大的作用就是提升了数组的性能,浏览器事先知道数组中的数据类型,故而处理起来更有效率。js中Array的内部实现是链表,可以动态增大减少元素,但是元素多的话,性能会比较差,类型化数组管理的是连续内存区域,知道了这块内存的起始位置,可以通过起始位置+N * 偏移量(一次加法一次乘法操作)访问到第N个位置的元素,而Array的话就需要通过链表一个一个的找下去。

类型化数组将实现拆分为缓冲视图两部分。一个缓冲(ArrayBuffer)描述的是内存中的一段二进制数据,缓冲没有格式可言,并且不提供机制访问其内容。为了访问在缓存对象中包含的内存,你需要使用视图。视图可以将二进制数据转换为实际有类型的数组。一个缓冲可以提供给多个视图进行读取,不同类型的视图读取的内存长度不同,读取出来的数据格式也不同。缓冲和视图的工作方式如下图所示:

image.png

webgl使用的各种类型化数组

数组类型每个元素所占字节数描述
Int8Array18位整数型(signed char)
UInt8Array18位无符号整数型(unsigned char)
Int16Array216位整数型(signed short)
UInt16Array216位无符号整数型(unsigned char)
Int32Array432位整数型(signed int)
UInt32Array432位无符号整数型(unsigned char)
Float32Array4单精度32位浮点数(float)
Float64Array8双精度64位浮点数(double)

类型化数组的方法、属性和常量

方法、属性和常量描述
get(index)获取第index个元素值
set(inex,value)设置第index个元素的值为value
set(array,offset)从第offset个蒜素开始将数组array中的值填充进去数据的长度
length数组的长度
BYTES_PER_ELEMENT数组中每个元素所占的字节数

类型化数组不支持``push()pop()方法

类型化数组创建的唯一方法就是使用new运算符

var vertices = new Float32Array([
    0.0,0.5,-0.5,-0.5,0.5,-0.5
])