Questions tagged «performance»

3
什么时候计算着色器比像素着色器更有效地进行图像过滤?
图像过滤操作(例如模糊,SSAO,Bloom等)通常使用像素着色器和“聚集”操作完成,其中每个像素着色器调用都会发出许多纹理提取操作以访问相邻像素值,并计算单个像素的值结果。这种方法在理论上效率低下,因为完成了许多冗余提取:附近的着色器调用将重新提取许多相同的纹理像素。 另一种方法是使用计算着色器。这些具有的潜在优势是能够在一组着色器调用之间共享少量内存。例如,您可以让每个调用获取一个纹理元素并将其存储在共享内存中,然后从那里计算结果。这可能会或可能不会更快。 问题是在什么情况下(如果有的话)compute-shader方法实际上比pixel-shader方法更快?它是否取决于内核的大小,它是什么类型的过滤操作等?显然,答案从一个GPU型号到另一个GPU都不同,但是我很想听听是否存在任何普遍趋势。

2
改变国家的代价是什么?
程序员应该对某些操作的成本有一个很好的了解:例如,CPU上指令的成本,L1,L2或L3高速缓存未命中的成本,LHS的成本。 当涉及到图形时,我意识到我几乎不知道它们是什么。我要记住,如果我们按成本订购它们,状态更改将类似于: 着色器均匀变化。 活动顶点缓冲区更改。 活动纹理单位更改。 活动着色器程序更改。 活动帧缓冲区更改。 但这是一个很粗略的经验法则,甚至可能不正确,我不知道数量级是多少。如果我们尝试放置单位,ns,时钟周期或指令数量,那么我们在谈论多少?


1
为什么片段着色器中的这种条件如此缓慢?
我已经在WebGL中建立了一些FPS测量代码(基于此SO答案),并且发现我的片段着色器的性能有些奇怪。该代码仅在1024x1024画布上呈现一个四边形(或者说是两个三角形),因此所有魔术都发生在片段着色器中。 考虑一下这个简单的着色器(GLSL;顶点着色器只是一个传递): // some definitions void main() { float seed = uSeed; float x = vPos.x; float y = vPos.y; float value = 1.0; // Nothing to see here... gl_FragColor = vec4(value, value, value, 1.0); } 因此,这只是渲染白色画布。在我的机器上,平均速度约为30 fps。 现在,让我们增加数字运算的难度,并根据与位置相关的噪声的几个八度音程来计算每个片段: void main() { float seed = uSeed; float x = vPos.x; …

3
当游戏可以直接绘制像素时,为什么我们拥有诸如OpenGL和DirectX之类的图形框架?
游戏和其他图形密集型应用程序使用诸如OpenGL和DirectX之类的框架。此外,它们还需要像素着色器和DX12等功能。 但是,当我们可以逐像素绘制所有内容时,为什么需要所有这些框架和GPU功能? 首先,游戏必须以某种方式进行编译,以便逐像素绘制游戏。这可能会使游戏的可执行文件更大,但是会更快并且可以在任何32位彩色GPU(甚至旧的)上运行吗? 我知道最初的3D游戏是逐像素绘制的,但是为什么现在不这样做呢?

3
OpenGL中的渲染与3D动画软件之间的区别
使用OpenGL等,我可以“实时” 60 FPS渲染出一些令人惊叹的外观。但是,如果我尝试用Maya或3ds Max制作相同场景的视频,即使分辨率和FPS相同,渲染时间也要长得多。 为什么这两种类型的渲染要花相同的时间花费不同的时间? 注意:是的,我的确意识到3D动画软件可以产生比实时图像更高级的图像。但是对于这个问题,我指的是一个同样复杂的场景。

1
恒定条件是否比切换着色器更昂贵?
通常,在着色器中分支不是一个好主意。但是现在我有了一个着色器,其条件对于整个绘制调用而言是恒定的。因此,对于一个绘制调用,执行的分支始终相同。 这种分支是否仍然比拥有多个没有这些分支并在它们之间切换的着色器还要昂贵?

1
何时禁用透视校正插值(非透视)
在GLSL中,顶点属性的透视正确插值是默认设置-可以通过使用非透视限定符对特定的顶点属性禁用它。除了在后处理着色器中,我从未见过禁用透视校正的正确插值-还有其他用例吗?此外,从性能角度来看,它是否还会有所作为?

1
着色器中的循环性能
我想知道在着色器中集成动态循环功能的最佳方法是什么? 首先,似乎动态数组是不可能的。因此,创建最大大小的数组并仅填充其中一部分或使用预定义的大小定义数组会更好吗? 那么,迭代此数组的最佳方法是什么? 使用展开循环或动态循环进行4到128次迭代比较好吗?我还看到有可能将其展开到最大的预定义迭代次数,然后使用诸如的条件将其停止if (i == myCurrentMaximumIterationNumber)。

1
在片段着色器中计算纹理坐标时,为什么访问纹理要慢得多?
在GLSL中使用纹理时,最好在顶点着色器中计算最终的纹理坐标,然后使用varyings 将其移交给片段着色器。在y坐标中进行简单翻转的示例: // Vertex shader attribute vec2 texture; varying highp vec2 texCoord; // ... void main() { texCoord = vec2(texture.x, 1.0-texture.y); // ... } // Fragment shader varying highp vec2 textureCoordinates; uniform sampler2D tex; // ... void main() { highp vec4 texColor = texture2D(tex, texCoord); // ... } 如果vec2(0.5)在片段着色器中执行y坐标的翻转或什至更简单的操作(如添加到纹理坐标),则纹理访问会慢得多。为什么? 需要注意的是,例如,使用它们的加权总和来混合两个纹理在时间上要便宜得多,并且还需要针对每个像素完成,因此纹理坐标本身的计算似乎并不那么昂贵。

1
为什么AMD在GPU板上放置SSD会大大减少延迟?
AMD最近发布了一个有趣的Radeon Pro主板,上面装有几个M2 SSD。 正如一些更详细的故事(例如,此处或此处)所指出的那样,好处可能主要不是来自高带宽(M2仅在4个PCIe通道上,因此板子自己的16通道连接器应该有更多),但是低延迟。 这个故事包括声称“这将使内存访问延迟降低10倍”。 我的问题基本上是:为什么GPU板上连接PCIe的SSD的延迟要比访问系统PCIe总线上的主系统RAM或存储设备的GPU的延迟显着减少?“阻碍”的主系统有什么用,意味着板载SSD可以以更快的速度访问?

2
使用现代填充率和延迟渲染,咬合剔除是否仍然有意义?
例如,虽然它是当前最先进的GPU,但GTX 980的惊人填充率为72.1千兆像素/秒,它具有从后到前的渲染和/或Z缓冲区检查,看起来几乎是荒谬的,甚至可能4k分辨率。就多边形数量而言,如果正确地批处理和/或实例化它们,现代GPU可以无数个地处理成千上万个纹理三角形。 使用正向渲染时,着色器将要运行的片段数量可能很快变得不堪重负,但是如果使用延迟渲染,则根据分辨率的不同,代价通常或多或少是恒定的,并且我们早就通过了大多数着色或后期处理效果可以1080p实时完成。 无论哪种方式,当今的限制因素最常见的是绘制调用次数,并且着色成本(通过适当的延迟渲染和几何体批处理将着色成本都保持在较低水平),因此请记住,这不仅是去除背面和超出范围,截锥体的多边形有什么实质性的好处?成本(CPU / GPU时间,程序员时间)是否会在很多时候超过收益?

3
为什么顶点缓冲区对象可以提高性能?
根据我的基本了解,顶点缓冲区对象的工作原理如下(伪代码): 通常,如果要说画一个正方形,可以发出画线命令。 line (0, 0) -> (1, 0) line (1, 0) -> (1, 1) line (1, 1) -> (0, 1) line (0, 1) -> (0, 0) 如果我理解正确,则使用VBO会将顶点加载到VBO中。 define VBO load (0,0) -> VBO load (1,0) -> VBO load (1,1) -> VBO load (0,1) -> VBO load (0,0) -> VBO 然后,您可以发出一个绘图命令。 …

2
在现代GPU上组织顶点数据的最高效方式
说我有顶点组成的模型,每一个position,normal,tangent,和texcoord属性,其中三角形由指数三元规定。 如果我们只关注顶点属性,那么我知道两种广泛的策略:数组的结构和结构的数组。我还听说结构数组是首选的,因为它会增加给定顶点的属性的内存局部性(并因此增加高速缓存局部性)。 确实可以提高性能吗?我能想到的主要方式是通过顶点索引,该索引要求光栅化器获取早已从缓存中逐出的顶点数据。如果像这样的顶点数据访问是随机的,那么将顶点的所有属性都保留在同一缓存行上肯定会使事情变得更快,但这不是可以通过优化三角形规格的顺序来最大程度缓解的问题吗? 此外,据我了解,现代GPU在解压缩相同类型的长矢量上可能比许多类型的结构的矢量更好。如果优化了索引顺序,那么数组结构布局是否可以始终胜过相同顶点数据的结构数组布局?

1
前向渲染和延迟渲染之间的性能折衷是什么?
正向渲染是直接根据输入的几何形状和照明信息计算表面碎片的辐射值的过程。延迟渲染将该过程分为两个步骤:首先生成一个包含空间属性的屏幕空间缓冲区(包含通过光栅​​化输入几何图形而构建的材质属性)(几何缓冲区或G缓冲区),其次通过组合G-缓冲带照明信息。 延迟渲染通常是对正向渲染的优化。一种解释是,照明是相当昂贵的,并且如果您有任何透支,那么您将照明屏幕上永远不会看到的像素,而如果将材质属性存储到G缓冲区中,然后再照明,则您将仅照明将要显示的像素。实际上出现在屏幕上。假设您还可以进行深度预传递,然后再将深度测试设置为D3D11_COMPARISON_EQUAL或GL_EQUAL等效,则进行正向渲染传递,这实际上是递延的优势吗? 延迟渲染还可以在GPU上更好地进行调度。将一个较大的翘曲/波阵面拆分为一个较小的几何波阵面,然后再将较小的照明波阵面拆分,可以提高占用率(同时飞行中有更多的波阵面)。但是,最终还会占用更多带宽(将大量通道写到G缓冲区,然后在照明期间将它们读回)。显然,这里的细节在很大程度上取决于您的GPU,但是一般原则是什么? 在正向渲染和延迟渲染之间做出决定时,还有其他实际性能方面的考虑吗?(假设如有必要,我们可以使用每种技术的变体:即,我们也可以比较前向平铺和延迟的平铺。)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.