私の古いコンピュータ(Lenovo Y40)は、AMD Radeon R9 M275といくつかのIntel内蔵グラフィックスカードの間にデュアルグラフィックスカードをセットアップしましたが、使用しているグラフィックカードと新しいコンピュータ(HP Spectre)にはIntel HD Graphics 620カードが搭載されています。私は自分の古いコンピュータ上で自分のゲームライブラリをしばらく作成しており、問題は一度もありませんでした。私の新しいコンピュータを手に入れてコードを転送したとき、それはかなり遅くなった。私はLWJGL 3を使用しています。私はそれをタイムアウトしました。そして、私の新しいコンピュータで "glLinkProgram"を実行するのに約400msかかり、私の古いコンピュータでは約5msかかります。それはハードウェアの違いだけの原因かもしれませんが、実際には395msの時間を変更するグラフィックスカードの違いでしょうか?私はOpenGLとグラフィックカードを使用することに新しいので、私はよく分かりません。私は個人的にコードがここに必要であると信じていません。 LWJGLのGL20のglLinkProgramメソッドです。私は何かできるか、それともこのハードウェアをベースにしているのですか?LWJGL glLinkProgramが処理に時間がかかります
EDIT
コード
フラグメントシェーダ
#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);
}
グラフィックスドライバは、OpenGLのようなAPI呼び出しの実行時のパフォーマンスに関しては、未定義のブラックボックスです。同じベンダードライバーの複数のバージョンと異なるベンダー(AMDとIntel)で異なる動作をすることができます。ドライバは、APIコールの結果が実際に使用/必要になっているポイント(GL描画コールやスワップバッファなど)まで、実行する作業を延期することができます。シェーダコードを表示するとやや役立ちます。いくつかのドライバは、大きな均一な配列/バッファサイズの問題を抱えていることがわかりました。 – httpdigest
これは参考になります。ありがとうございました。誰かが見ているシェイダーのコードを投稿しました。私は100のサイズの均一な配列を持っていますが、私は個人的にコンピュータの容量の点でこれらを大きく呼んでいませんが、私は間違っている可能性があります。 –