纠纷奇闻社交美文家庭
投稿投诉
家庭城市
爱好生活
创业男女
能力餐饮
美文职业
心理周易
母婴奇趣
两性技能
社交传统
新闻范文
工作个人
思考社会
作文职场
家居中考
兴趣安全
解密魅力
奇闻笑话
写作笔记
阅读企业
饮食时事
纠纷案例
初中历史
说说童话
乐趣治疗

你学废了吗?WebGL与Node。js中的Buffer

6月18日 萌嘟嘟投稿
  WebGL和Node。js中都有Buffer的使用,简单对比记录一下两个完全不相干的领域中Buffer异同,加强记忆。
  Buffer是用来存储二进制数据的缓冲区,其本身的定义和用途在任何技术领域都是一致的,跟WebGL和Node。js没有直接关系,两者唯一的共同点就是都使用JavaScript。
  在ES6将TypedArray(二进制类型数组)正式加入ECMA标准之前,JavaScript语言本身并没有标准的处理二进制数据的能力,Buffer就是为了弥补这一缺陷。
  TypedArray成为ECMA标准之前就已经在WebGL领域广泛使用了。
  Node。js加入Buffer的作用主要是为了处理stream,比如网络流、文件流等等。Buffer占用预申请的一整片内存,stream被消费的速度如果低于接收速度,就会被暂存在缓冲区内,然后被消费者从缓存区依序取出消费。
  Node。js中的Buffer是Uint8Array的子类,Uint8Array是ECMA标准中TypedArray中的一种数据类型。console。log(Buffer。proto)打印〔Function:Uint8Array〕
  其实Node。js中的Buffer与ECMA标准的TypedArray并没有直接关系,Node。js很早期的版本(v0。10。0)版本就支持了Buffer。Uint8Array,或者说ECMA标准中所有的TypedArray都是JavaScript引擎提供的一种API,早期未被加入ECMA标准的时候就已经有不少引擎实现了这些API,而最早使用二进制类型数组的场景就是WebGL。
  话说回来,ECMA标准做的不就是集百家之长(修辞手法反讽)的事吗哈哈
  然后说到WebGL中的Buffer。
  WebGL有两种Buffer类型:ARRAYBUFFER:顶点属性数据的Buffer,用来传递任何跟顶点相关的数据,比如坐标、颜色等等。这些数据一般是浮点数,最常用的类型是Float32AELEMENTARRAYBUFFER:元素索引数据的Buffer,用来传递读取ARRAYBUFFER元素的顺序。每个元素必须是整数,使用Uint8Array,这一点跟Node。js中的Buffer一致。此buffer是可选项,如果不使用的话,ARRAYBUFFER的元素会被按照index依序读取。
  虽然WebGL中没有stream的概念(严格来说是从开发者的认知层面没有stream,底层OpenGL处理buffer数据的流程中是有stream的),但Buffer的作用跟Node。js是一致的,都是将数据暂存在一整片预申请的内存中,供后续进程逻辑消费,区别是消费者不同。
  在WebGL渲染管线中,但从CPU到GPU完整的数据传输链路中,有以下几种buffer:VBO,VertexBufferObject,顶点缓冲对象储存顶点属性数据,消费者是shader,严格的说是FBO,FragmentBufferObject,帧缓冲对象可以简单理解为一个指针集合体,附着RBO、颜色、纹理等用于渲染的所有信息;RBO,RenderingBufferObject,渲染缓冲对象储存depth(深度)、stencil(模板)值。
  FBO与RBO、纹理的关系如下图:
  另外一点需要了解的是buffer对象从CPU流转到GPU的过程,这个过程涉及到总线通讯,虽然这些跟Node。js没有一毛钱关系,但是其中的一些实现跟Node。js常见八股文面试题跨进程通信有一些相同的理念。
  WebGL中buffer最初被创建和寄存在CPU内存中,如何让GPU访问CPU内存呢?回答这个问题之前先介绍几个基本概念:CPU的内存一般称为mainmemoryGPU自己的储存称为localmemory
  在WebGLOpenGL中,顶点数据被创建被寄存在mainmemory中,GPU需要得到这部分数据进行渲染,但是mainmemory和localmemory是绝对隔离的,不能互相访问。
  对于集成显卡来说,GPU和CPU共享总线,GPU没有自己独立的储存空间,一般是从CPU储存中分配出一块空间给GPU使用,我们把这部分空间姑且叫做显存(严格来说集成显卡没有显存的概念)。为了实现GPU和CPU数据的共享,业内引入了一种叫做GART(GraphicAddressRemappingTable)的技术,GART简单说就是一个映射mainmemory和localmemory地址的表。集成显卡的显存一般很小,必然是小于内存的(一般默认上限是内存总量的14),OS将整个localmemory空间映射到mainmemory,维护一个GART。此时buffer数据的流转如下图所示:
  但是这套流程在独立显卡中是行不通的,因为独立显卡的显存非常大,如果使用GART将显存空间完全映射到CPU内存中会占用非常大的内存空间,32位系统的整个内存空间也就仅仅4GB,如果分出2GB给显存映射,那就别干啥了。
  这下明白为啥64位系统玩游戏更爽了吧
  所以对于独立显卡需要另外一套CPU与GPU的数据共享机制。目前比较普遍的方式是在内存中单独划出一块物理空间用于CPU和GPU之间的数据交换中转,这部分内存空间叫做pinnedmemory(锁定内存)。buffer数据首先会被从mainmemory中拷贝到pinnedmemory中,然后通过DMA(DirectMemoryAccess,直接内存访问)机制将数据传输到GPU,整个过程如下:
  请注意,pinnedmemory是一块物理内存而不是虚拟内存,这样能够保证DMA的传输性能。
  这下明白为啥打游戏一定要加大内存了吧
  独立显卡的这套数据交换机制跟Node。js八股文跨进程通信的共享内存理念很接近,不过复杂度更高一些。
  上面这些内容大都是OpenGL和计算机底层的机制,对WebGL开发者来说是无感知的,具体到涉及Buffer的代码层面,WebGL需要比Node。js更谨慎的处理Buffer的内存管理。
  Node。js中Buffer在分配内存时采用了slab预先申请、事后分配机制,这是在底层C的逻辑,开发者不可控。这套机制能够提高Node。js需要频繁申请buffer内存场景下的性能表现。而WebGL中并没有这套机制,需要开发者自行处理。一般的做法是预申请一个容量很大的buffer,然后使用gl。bufferSubData(类似Node。js的Buffer。fill)局部更新数据,这样能避免频繁申请内存空间造成的性能损耗。
投诉 评论 转载

面对平台互联互通,阿里表态坚决,腾讯面露难色互相屏蔽长达8年的微信和淘宝终于有望打通,但腾讯和阿里巴巴的态度耐人寻味。日前,工信部信管局召开屏蔽网址链接问题行政指导会,要求即时通信软件解除屏蔽外部网址链接,9月17……你学废了吗?WebGL与Node。js中的BufferWebGL和Node。js中都有Buffer的使用,简单对比记录一下两个完全不相干的领域中Buffer异同,加强记忆。Buffer是用来存储二进制数据的缓冲区,其本身的定……维业股份深化产业链战略布局,多重因素驱动有望持续释放增长潜力10月27日晚间,维业股份(300621。SZ)发布2021年三季度报告,报告显示,2021年前三季度公司实现营业收入约65。56亿元,同比增加207。13;归属于上市公司股东……松下PanasonicRFB50电路分析松下B50收音机是著名的B20的大哥,存量似乎比B20少,电路设计与B20相比更为原始完善,以下做简单分析。B50发布于80年代,是索尼7600A的竞争机型,日本原产,做……里约热内卢拟将市政收入1投资加密货币巴西第二大城市里约热内卢的市长爱德华多帕埃斯(EduardoPaes)近日宣布,计划效仿美国迈阿密市市长的做法,推出里约币,并将里约热内卢市政收入的1投资于加密货币,从而成为巴……业界首款立体3D素皮工艺realmeGT大师探索版曝光7月21日,realme将举行新品空中发布会,由设计大师深泽直人操刀的realmeGT大师系列将正式登场。随着发布会的临近,官方也抓紧开启了对新机的各种预热。此前real……两个月前被淹没的郑州服装批发市场,如今重焕新生两个月前,一场大雨淹没了整个郑州。有史以来最强的降雨量,将中部最大的服装批发市场郑州银基服装批发市场直接淹没。负一负二楼近千家商铺全部被淹,所有设备所有商品悉数被这场大雨冲毁。……CIO的需求与零代码解决方案CIO的需求与零代码软件开发平台解决方案软件企业负责人往往会关注开发平台是否能够提升开发效率、适配多种平台数据库,以及更换新开发平台的成本与风险等等。VDevSuite帮……五部最耐用的手机,你见过几个?手机是我们日常使用频率最高的电子产品,手机可以帮助日常工作生活,在迷失方向的时候给我们提供指引,并且日常与亲朋好友联系也是通过手机。不过因为现在的手机都是直面屏或是曲面屏的设计……聚光灯EN60598检测报告标准和要求聚光灯EN60598检测报告标准和要求。所谓聚光灯就是一种使用反射镜或者三年后聚光镜头等等来制作达到聚成一种可见光的灯具,因此,聚光灯又被人们称作是反射灯,聚光灯是一种点光型比……深圳瑞捷上半年盈利增68。30,初步验证高增长能力8月23日晚间,深圳瑞捷(300977。SZ)发布2021年半年度报告,上半年实现营业收入31,998。92万元,同比增长62。49;实现归母净利润4,984。72万元,同比增……王文京,用友软件创始人,堪称中国的软件大王王文京,用友软件创始人,1964年出生在江西省上饶县。父亲是煤矿工人,母亲是农民,读书和放牛伴随了他的童年。1979年,15岁的王文京考上江西财经大学,毕业后被分配到国务院机关……
鸿蒙新版本更新!解锁华为手机多机位模式全新玩法Zen3要大改?AMD锐龙CPU首次出现10核20线程Linux入门基础和帮助手册56页纯干货整理分享理想汽车赴港上市获批,与蔚来小鹏开启新角逐一加9rt对比一加9r,双十一换机选哪款?让自己心情舒畅的方式找个天气好的清晨自驾遛弯去乳业市场或迎变革简爱酸奶夏海通以品质缔造安心蓝图文剑居士谈音乐和器材之十,NE20梁建章呼吁更多公司效仿混合办公有利于提升生育率,缓解女性家长vivoX70Pro上手体验,能否颠覆你对vivoX系列的认常用的PHP试用工具有哪些续航超400km,这台MPV可上绿牌,还能当货车用
同程旅行推出公益活动助力高校学子暑期返乡家乡的戴西湖作文多伦多公交车管窥历史上最强大的十个帝国蒙古帝国征服整个世界我真的很耐得住寂寞吗?打造热销款,要在宝贝主图和细节图上下功夫用哪个成语形容最合适法学专业大学应届毕业生自我鉴定创业六次成功六次对他来说赚钱是简单的小事厨房中的物理常识盘点为什么德国战败桌布造句用桌布造句大全

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找美丽时装彩妆资讯历史明星乐活安卓数码常识驾车健康苹果问答网络发型电视车载室内电影游戏科学音乐整形