さて、私は(LibGDXで)作っているゲームのアンドロイドアプリを開発しています。そして私は断片シェイダーを持っており、私は〜41 FPSを持っていることに気付きました。私は問題がどこにあるのかを知るためにコードを使っていましたが、arrayName [i]からarrayName [0]に配列をアクセスする方法を変更すると、ループは60 FPSに戻りました。この特定のインスタンス。
はここのコードです:この特定の場合にはGLSL:forループの配列にアクセスすると、パフォーマンスが低下する
#version 300 es
precision highp float;
uniform sampler2D u_texture;
in vec2 vTexCoord0;
struct BlackHole {
vec2 position;
float radius;
float deformRadius;
};
uniform vec2 screenSize;
uniform vec3 cameraPos;
uniform float cameraZoom;
uniform BlackHole blackHole[4];
uniform int count;
out vec4 fragColor;
void main() {
vec2 pos = vTexCoord0;
bool doSample = true;
for (int i = 0; i < count; i++) {
BlackHole hole = blackHole[i]; // <-------- blackHole is the array, and changing from [i] to [0]
vec2 position = (hole.position - cameraPos.xy)/cameraZoom + screenSize*0.5;
float radius = hole.radius/cameraZoom;
float deformRadius = hole.deformRadius/cameraZoom;
vec2 deltaPos = vec2(position.x - gl_FragCoord.x, position.y - gl_FragCoord.y);
float dist = length(deltaPos);
if (dist <= radius) {
fragColor = vec4(0, 0, 0, 1);
doSample = false;
break;
} else if (dist <= radius + 1.0) {
fragColor = vec4(1);
doSample = false;
} else if (dist <= deformRadius) {lensing
float distToEdge = deformRadius - dist;
pos += distToEdge * normalize(deltaPos)/screenSize;
}
}
if (doSample)
fragColor = texture(u_texture, pos);
}
、「カウントが」1
はGLSLのこのちょうど固有の特性ですか?または、いくつかの修正があります - "count"の最高値は4になるので、それを拡張してforループを使用することはできませんが、それは非常に良い解決策ではないように感じます。
なぜ、これが起こっているのか、それを修正する方法を知っていますか?
forループで追加の評価が必要だと思いますか? 'i
Andreas
いいえ、それは役に立たないでしょう。さらに108ページおよびhttps://www.khronos.org/files/opengles_shading_language.pdfを参照してください。 – Xoppa
だから私はあなたがお勧めしたものを試しましたが、それはさらに遅くなりました - そして、私は#version 330 esを削除して、LibGDXシェーダのデフォルトバージョンに移そうとしました(OpenGL 2だと思います。もしそれが本当なら、それはまだ助けにならなかった)。 – KingDolphin