not*_*ama 50 3d graphics optimization performance gpu
假设纹理,顶点和着色器数据已经在显卡上,您不需要向卡发送大量数据.有几个字节来识别数据,可能是一个4x4矩阵,以及一些其他各种参数.
那么所有的开销来自哪里?操作是否需要与gpu进行某种握手?
为什么发送包含一堆小模型的单个网格,在CPU上计算,通常比发送顶点id和转换矩阵更快?(第二个选项看起来应该发送更少的数据,除非模型小于4x4矩阵)
Joa*_*man 59
首先,我假设使用"绘制调用",这意味着命令告诉GPU将某组顶点渲染为具有特定状态的三角形(着色器,混合状态等).
抽奖电话不一定很贵.在早期版本的Direct3D中,许多调用需要上下文切换,这很昂贵,但在较新版本中并非如此.
减少绘制调用的主要原因是图形硬件可以比提交三角形更快地变换和渲染三角形.如果你在每次调用时都提交了几个三角形,那么你将完全被CPU限制,GPU将大部分处于空闲状态.CPU将无法足够快地提供GPU.
单张绘图调用带有两个三角形是便宜,但如果你每次调用提交数据太少,你不会有足够的CPU时间来尽可能多的几何提交给GPU,你可以有.
制作绘图调用有一些实际成本,它需要设置一堆状态(要使用哪组顶点,使用什么着色器等等),并且状态更改在硬件方面都有成本(更新一堆)寄存器)和驱动程序端(验证和转换设置状态的调用).
但是,绘制调用的主要成本仅适用于每个调用提交的数据太少的情况,因为这会导致您受CPU限制,并阻止您完全使用硬件.
就像乔希说,画的呼叫也可能导致被刷新命令缓冲区,但是当你调用SwapBuffers未提交几何体时在我的经验,通常发生.视频驱动程序通常会尝试缓冲尽可能多的缓冲(有时是几帧!)以尽可能多地挤出GPU的并行性.
您应该阅读nVidia演示文稿Batch Batch Batch!,它相当陈旧,但涵盖了这个主题.
Jos*_*osh 13
像Direct3D这样的图形API将其API级别的调用转换为与设备无关的命令,并将它们排列在缓冲区中.刷新缓冲区以执行实际工作是非常昂贵的 - 因为它意味着现在正在执行实际工作,并且因为它可能导致芯片上的用户切换到内核模式(并且再次返回),这不是廉价.
在刷新缓冲区之前,只要CPU没有发出阻塞请求(例如将数据映射回CPU),GPU就能够与CPU并行完成一些准备工作.但GPU不会 - 也不能 - 准备好所有东西,直到它需要实际绘制.仅仅因为卡上的某些顶点或纹理数据并不意味着它已经被适当地排列,并且在设置顶点布局或绑定着色器之后可能无法排列等等.大部分实际工作发生在命令刷新和绘制调用期间.
DirectX SDK有一个关于准确分析D3D性能的部分,虽然与您的问题没有直接关系,但可以提供一些关于什么是昂贵和(在某些情况下)原因的提示.
更具相关性的是此博客文章(以及此处和此处的后续帖子),它们提供了GPU的逻辑低级操作过程的良好概述.
但是,本质上(尝试直接回答你的问题),调用是昂贵的原因是不是有必然大量数据的传输,而是有一个大机构的工作超出跨越公交车只需航运数据延迟直到命令缓冲区被刷新.