gpt4 book ai didi

swift - 为什么我最简单的着色器占用最多的处理能力

转载 作者:行者123 更新时间:2023-11-30 13:24:38 27 4
gpt4 key购买 nike

所以我运行了帧捕获来查看性能。令我惊讶的是,我的全屏渲染才是罪魁祸首。看看吧

Description

这是两个 Hohog 函数。我已经禁用了全屏纹理上的纹理查找,以说明这是多么荒谬!

计划 #3垂直:

precision highp float;

attribute vec2 position;

uniform mat4 matrix;

void main()
{
gl_Position = matrix * vec4(position.xy, 0.0, 1.0);
}

碎片:

precision highp float;

uniform float alpha;
void main()
{
gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0 - alpha);
}

上下文:

                //**Set up data
glUseProgram(shade_black.progId)
glBindBuffer(GLenum(GL_ARRAY_BUFFER), black_buffer) //Bind the coordinates

//**Pass in coordinates
let aTexCoordLoc = GLuint(black_attribute_position)
glEnableVertexAttribArray(aTexCoordLoc);
glVertexAttribPointer(aTexCoordLoc, 2, GLenum(GL_FLOAT), GLboolean(GL_FALSE), 0, BUFFER_OFFSET(0)) //Send to shader

//**Pass in uniforms
glUniformMatrix4fv(black_uniform_ortho, 1, GLboolean(GL_FALSE), &orthographicMatrix) //Pass matrix
glUniform1f(black_unifrom_alpha, 0.95) //Pass alpha

counter += timedo

//**Draw (instanced)
//The number 3 is actually variable but for this purpose I set it flat out
glDrawArraysInstanced(GLenum(GL_TRIANGLE_STRIP), 0, 4, 3 )// GLsizei(timedo)) //Draw it

//**Clean up
glBindBuffer(GLenum(GL_ARRAY_BUFFER), 0) //Clean up
glBindBuffer(GLenum(GL_ARRAY_BUFFER), 0)

计划#2垂直:

precision highp float;

attribute vec4 data;

uniform mat4 matrix;
uniform float alpha;

varying vec2 v_texcoord;
varying float o_alpha;

void main()
{
gl_Position = matrix * vec4(data.xy, 0.0, 1.0);
v_texcoord = data.zw;
o_alpha = alpha;
}

碎片:

precision highp float;

uniform sampler2D s_texture;

varying float o_alpha;
varying vec2 v_texcoord;

void main()
{
//vec4 color = texture2D(s_texture, v_texcoord);
gl_FragColor = vec4(1.0);
//This line below is what it should be, but I wanted to isolate the issue, the picture results are from setting it to white.
//gl_FragColor = vec4(color.rgb, step(0.4, color.a ) * (color.a - o_alpha));
}

上下文:

func drawTexture(texture: FBO, alpha: GLfloat)
{
//**Start up
//DONE EARLIER

//**Pass in vertices
glBindBuffer(GLenum(GL_ARRAY_BUFFER), textures_buffer)
let aTexCoordLoc = GLuint(textures_attribute_data)
glEnableVertexAttribArray(aTexCoordLoc);
glVertexAttribPointer(aTexCoordLoc, 4, GLenum(GL_FLOAT), GLboolean(GL_FALSE), 0, BUFFER_OFFSET(0)) //Tell gpu where

//**Pass in uniforms
glUniform1i(textures_uniform_texture, 0)
glUniformMatrix4fv(textures_uniform_matrix, 1, GLboolean(GL_FALSE), &orthographicMatrix)
glUniform1f(textures_uniform_alpha, alpha)

//**Texture
glBindTexture(GLenum(GL_TEXTURE_2D), texture.texture)

//**Draw
glDrawArrays(GLenum(GL_TRIANGLE_STRIP), 0, 4)

//**Clean up
glBindTexture(GLenum(GL_TEXTURE_2D), 0)
glBindBuffer(GLenum(GL_ARRAY_BUFFER), 0)
}

对于其他人,你至少可以看到他们的平局召唤,但他们不会造成太大伤害。

究竟发生了什么,导致最复杂的着色器只产生不到 1% 的延迟?

注意:这两个着色器都使用在应用程序启动时创建和填充的 VBO。

最佳答案

看起来确实有点令人惊讶。以下是我尝试理解这些数字的方法(假设这些时间是这些渲染调用的 GPU 计时):

  1. 填充率在移动设备上至关重要。即使运行一个超过 300 万像素左右的简单像素着色器(iPad 视网膜)也将是一项昂贵的任务,而且您不应该感到惊讶,因为它比大量更小的粒子更昂贵。您的百​​分比加起来将达到 100%,因此,如果所有其他内容都只有几百个顶点并填充几千个像素,那么如果全屏内容相对于此而言巨大,您就不应该感到惊讶。它还说“5ms”,这很容易被认为是一个绝对数字,但请记住,当没有太多工作要做时,CPU 和 GPU 会自动开始运行得更慢,因此,即使是毫秒计时也可能会产生很大的误导。设备大部分时间处于空闲状态。
  2. 帧开头有 glClear 吗?如果没有,那么您可能会付出相当高的代价,因为 GPU 在处理图 block 时必须做的第一件事就是加载旧内容。在渲染开始时使用 glClear,它知道不需要加载旧内容。如果您没有 glClear,也许您会在第一次全屏通行证上看到该价格。

关于swift - 为什么我最简单的着色器占用最多的处理能力,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37370078/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com