2017-12-16 40 views
0

私の古いコンピュータ(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); 
} 
+0

グラフィックスドライバは、OpenGLのようなAPI呼び出しの実行時のパフォーマンスに関しては、未定義のブラックボックスです。同じベンダードライバーの複数のバージョンと異なるベンダー(AMDとIntel)で異なる動作をすることができます。ドライバは、APIコールの結果が実際に使用/必要になっているポイント(GL描画コールやスワップバッファなど)まで、実行する作業を延期することができます。シェーダコードを表示するとやや役立ちます。いくつかのドライバは、大きな均一な配列/バッファサイズの問題を抱えていることがわかりました。 – httpdigest

+0

これは参考になります。ありがとうございました。誰かが見ているシェイダーのコードを投稿しました。私は100のサイズの均一な配列を持っていますが、私は個人的にコンピュータの容量の点でこれらを大きく呼んでいませんが、私は間違っている可能性があります。 –

答えて

0

グラフィックスドライバコードの一部であるGLSLコンパイラの実装間には明確な違いがあります。インテル®コンパイラーは、AMDが行う最適化を行うことができない場合があります。これはあなたが持っているハードウェアの力が原因である可能性があります。 Intels GPUはまだGPUを解体していないので、コア数、プロセッサ数、メモリ数には限界があります。したがって、コンパイラは最適化を行う方法によって制限されています.GPUを記述すると、頂点/フラグメント/テクスチャプロセッサが話すことができる専用のビデオメモリがないということも意味します。だから、これはマザーボード上で利用可能なバスを通して起こらなければならず、ビデオメモリとして既存のラムのほんの一部を占めるでしょう。 (私は新しいGPUについて知りませんが、GPUが意味することは何ですか)

内部的に4つの浮動小数点型の均一な配列を持っています。 すべての変数に対して、uniformコンパイラーまたは属性コンパイラーは、いくつかのメモリー位置だけであるスロットを割り振ります。 100 * 8 - >多くのメモリ位置と100 * 8 * sizeof(float) - >それほど実際のメモリを考慮すると、

これを統一コンパイラまたはドライバとして渡すので、変数の値のみが実行時に分かるので、任意の最適化を行うことはできません。だから、あなたは100台全てが予約されているので、まだ2つのライトしか置いていないかもしれません。これは、ハードウェアが最適にリンクできないためにドライバの制限だと思います。

異なるハードウェアでプロファイルすることができます。また、ライト配列のサイズをわずか1に減らし、リンク時間が改善するかどうかを確認してください。

関連する問題