LWJGL glLinkProgram需要很长时间才能处理

时间:2017-12-16 23:03:31

标签: java opengl lwjgl

我的旧电脑(联想Y40)在AMD Radeon R9 M275和一些英特尔集成显卡之间设置了双显卡,但我不确定它使用的显卡和我的新电脑(HP Spectre)有英特尔HD Graphics 620卡。我已经在我的旧电脑上创建了我自己的游戏库一段时间,从来没有任何问题。当我拿到新计算机并将代码转移过来时,它的运行速度明显变慢了。我正在使用LWJGL 3.我已经计时了,它需要大约400ms才能完成" glLinkProgram"在我的新电脑上,我的旧电脑需要大约5毫秒。它可能只是硬件差异的原因,但它真的只是图形卡之间的差异改变时间395毫秒?!我是新手使用opengl和显卡,所以我不确定。我个人不相信这里需要代码,因为这不是我自己的代码需要一段时间。它是LWJGL的GL20中的glLinkProgram方法。有什么我可以做的或者这是基于硬件的吗?

修改

代码

片段着色器

#version 330 core

layout (location = 0) out vec4 color;


in DATA
{
    vec2 tc;
    vec3 position;
} fs_in;

struct Light
{
    vec2 pos;
    float size;
    float lowLightValue;
};

uniform Light lights[100];
uniform sampler2D tex;
uniform int enabled =0;

float high = 0;
float average =0;
bool isInsideLight = false;
vec4 highcol = vec4(0);


bool greater(vec4 l, vec4 r)
{
    float lbright = sqrt(0.2126*pow(l.r,2))+(0.7152*pow(l.g,2))+(0.0722*pow(l.b,2));
    float rbright = sqrt(0.2126*pow(r.r,2))+(0.7152*pow(r.g,2))+(0.0722*pow(r.b,2));
    if(lbright > rbright)
    {
        return true;
    }
    return false;
}

void main()
{
    color = texture(tex,fs_in.tc);
    if(enabled == 1)
    {
//      float len = length(fs_in.position.xy-lights[0].pos);
//      float lenr = len/lights[0].size;
//      float llv = lights[0].lowLightValue;
//      if(len > lights[0].size)
//      {
//          color *= llv;
//      }
//      else
//      {
//          color *= 1-((1 - llv)/lights[0].size)*len;
//      }
//      vec4 color2;
        for(int i =0;i<lights.length();i++)
        {
            if(lights[i].lowLightValue != 0)
            {
                float len = length(fs_in.position.xy-lights[i].pos);
                if(len <= lights[i].size)
                {
                    isInsideLight = true;
                    break;
                }
            }
        }
        int numLights=0;
        average =0;
        for(int i = 0;i < lights.length();i++)
        {

            if(lights[i].lowLightValue != 0)
            {
                float len = length(fs_in.position.xy-lights[i].pos);
                float llv = lights[i].lowLightValue;
                if(!isInsideLight)
                {
                    average += llv;
                    numLights++;
                }
                else
                {
                    if(len <= lights[i].size)
                    {
                        float num = 1-((1-llv)/lights[i].size)*len;
                        if(num > average)//Getting the highest
                        {
                            average = num;
                        }
                    }
                }
//              if((1/lenr) > 1)
//              {
//                  lenr = 0;
//              }
//              float col = (lenr*llv)+llv;
//              vec4 ncol = color*col;
//              if(greater(ncol,highcol))
//              {
//                  highcol = ncol;
//              }
                //if(col>high)
                //{
                //  high = col;
                //}
            }
            else
            {
                break;
            }
        }

        if(!isInsideLight)
            color *= average/numLights;
        else
            color *= average;
//      color = highcol;
    }
}

顶点着色器

#version 330 core

layout (location = 0) in vec4 position;
layout (location = 1) in vec2 tc;

uniform mat4 pr_matrix;
uniform mat4 ml_matrix = mat4(1.0);
uniform mat4 vw_matrix = mat4(1.0);

out DATA
{
    vec2 tc;
    vec3 position;
} vs_out;

void main()
{
    gl_Position = pr_matrix * vw_matrix * ml_matrix * position;
    vs_out.tc = tc;
    vs_out.position = vec3(ml_matrix*position);
}

1 个答案:

答案 0 :(得分:0)

作为图形驱动程序代码一部分的GLSL编译器的实现之间肯定存在差异。英特尔编译器可能无法进行AMD的优化。这可能是因为你拥有硬件的力量。英特尔GPU仍然不是独立的GPU,因此核心数量,处理器数量和存储器数量都是有限的。所以编译器受限于它可以进行优化的方式。通过离散GPU也意味着它们没有专用的视频内存,顶点/片段/纹理处理器可以与之交谈。所有这一切都必须通过主板上的总线发生,它将占用现有RAM的一小部分作为视频内存。 (我不确定英特尔的新GPU,但那就是芯片上的GPU意味着什么)

你有一个统一的Light结构数组,里面有4个浮点数。 对于所有变量统一或属性编译器将分配一些只是一些内存位置的插槽。如果你考虑100 * 8 - >许多内存位置和100 * 8 * sizeof(浮点) - &gt;那么多实际的记忆。

当你传递这个时,统一的编译器或驱动程序不能进行任何优化,因为变量的值只能在运行时知道。因此,您可能只有2个灯仍然可以保留所有100个,我认为这是驱动程序的限制,因为硬件无法以最佳方式链接它。

您可以尝试在不同的硬件上进行配置。还尝试将光阵列的大小减小到1,并查看链接时间是否有所改善。