echarts数据渲染性能优化 您所在的位置:网站首页 amd显卡驱动与版本不匹配的原因分析图 echarts数据渲染性能优化

echarts数据渲染性能优化

2024-07-14 11:07| 来源: 网络整理| 查看: 265

CPU通过图形API向GPU发送渲染指令,再通过硬件驱动程序发送给GPU设备,指令会放在命令缓冲区的队列中。这些指令由GPU逐一处理,知道命令缓冲区为空。只要GPU能能在下一帧开始之前跟上指令的速度和复杂度,帧率就保持不变。如果跟不上,或者CPU花费太多时间生成指令,帧速率开始下降。

GPU前端

前端是指CPU在渲染过程中处理顶点数据的部分。

从CPU接收网格数据并发出drawCall -> 收集顶点数据,对数据进行1:1修改和输出 -> 获得图元列表(三角形) -> 光栅化器获取图元,确定哪些像素需要绘制,创建片元

顶点着色器用来确定想要的输入数据和数据处理方式,并向光栅化器输出一组信息用来生成片元。

曲面细分由几何着色器(曲面细分着色器)处理,和顶点着色器不同的是,可以一对多的输出顶点,可以通过编程的方式生成其他图形

GPU后端

片元着色器往往承担更加复杂的工作,例如深度测试Alpha测试着色纹理采样光照阴影以及一些可行的后期处理方式。之后这些数据绘制到帧缓冲区,一旦当前帧渲染任务完成,图像就发送到显示设备。

在后端有两个指标往往是瓶颈的根源:填充率和内存带宽。

填充率

填充率是指GPU绘制片元的速度。如果一个片元未通过任意测试,就被丢弃。这可以大大提升性能,可以直接跳过昂贵的绘制步骤,开始处理下一个片元。每次在目标像素绘制都将消耗一个填充量。

显卡制造商经常以千兆像素每秒的形式进行宣传,但是该说法并不准确,应该是千兆片元每秒。如果以30千兆每秒来算,帧速率为60hz,每帧可以处理 30,000,000,000/60 = 5亿个片元。

过度绘制

由于渲染对象的顺序,我们总是会重绘一些相同的像素,这称为过度绘制。过度绘制的越多,覆盖片元数据浪费的填充率就越多。

可以通过Unity的Scene下面的Overdraw来观察填充率。

有两种类型的队列用于渲染:不透明队列和透明队列。不透明队列中渲染的队列可以通过Z-测试剔除片元。在透明队列不能这么做,不管有多少对象挡在前面,都不能假设它们不需要绘制,这将导致大量的过度绘制。所有Unity UI对象通常在透明队列中渲染,这也是过度绘制的主要来源。

2.内存带宽

GPU VRAM的某个部位将纹理拉入更低级别(更快)的内存中,就会消耗内存带宽。这通常发生在纹理采样时,其实片元着色器尝试选择匹配的纹理像素,以便在给定的位置绘制给定的片元。GPU包含多个内核,每个内核都可以访问显存相同区域,还都有一个小得多的本地纹理缓存,来存储GPU最近使用的纹理。这种设计允许数据向上或向下传输到不同级别的内存上。这是硬件设计的方法,内存越快,意味着制造越困难,成本越高,因此使用大容量,便宜的VRAM块,使用更快速的缓存来采样,即快速采样,又成本更低

如果需要的纹理已经在内核的本地纹理缓存中,那么采样便会非常的快速。否则就会需要从VRAM提取纹理信息,才能进行采样。这种传输会消耗一定数量的可用内存带宽,这个量相当于VRAM中存储的纹理文件的总大小。

如果内存带宽方面遇到瓶颈,GPU将继续获取必要的纹理文件,但整个过程收到限制,因为纹理缓存将等待获取数据后,才会处理给定的一批片元。GPU无法及时将数据推回到帧缓冲区,以渲染到屏幕上,整个过程被嘟塞,帧速率也会降低。

如果对内存带宽进行合理使用需要进行估算:

每个内核内存带宽为每秒96GB,目标帧速率为60帧,在到达内存带宽瓶颈之前,GPU每秒可提取1.6GB(96/60)的纹理数据。这只是一个估计值。

这个指标限制的是在同一帧可以发生的纹理交换量同一纹理可能在一帧内被来回拉动多次,主要取决于着色器使用它们的次数,对象渲染的顺序以及纹理采样的频率。由于纹理缓存的空间是有限的,因此只有少数对象可占用千兆字节的内存带宽。如果着色器需要大量的纹理



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有