Okay, also ich entwickle eine Android-App für ein Spiel, das ich mache (mit LibGDX). Und ich habe einen Fragment Shader und ich bemerkte, dass ich ~ 41 FPS hatte. Ich habe mit dem Code herumgespielt, um zu sehen, wo das Problem lag, und ich habe gesehen, dass die Änderung, wie ich ein Array von ArrayName [i] auf ArrayName [0] anwendete, wieder auf 60 FPS stieg, obwohl die Schleife nur einmal ausgeführt wurde diese spezifische Instanz.
Hier ist der Code:GLSL: Der Zugriff auf ein Array in einem For-Loop behindert die Leistung
#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);
}
In diesem speziellen Fall "count" ist 1.
Ist das nur eine intrinsische Eigenschaft von GLSL? Oder gibt es eine Lösung - der höchste Wert von "count" wäre 4, also könnte ich es erweitern und keine for-Schleife verwenden, aber ich denke, das ist keine sehr gute Lösung.
Also, weiß jemand, warum das passiert und/oder eine Möglichkeit, es zu beheben?
Gute Antwort. Glauben Sie, es würde ausreichen, eine zusätzliche Auswertung in der for-Schleife zu haben, zB 'i
Andreas
nein, das wird nicht helfen. siehe auch Seite 108 und weiter von https://www.khronos.org/files/opengles_shading_language.pdf. – Xoppa
Also habe ich versucht, was Sie empfohlen haben, aber es hat es noch langsamer gemacht - und ich habe sogar versucht, die #version 330 es zu entfernen und es auf die Standardversion für einen LibGDX Shader zu setzen (was ich für OpenGL 2 halte, aber ich nicht sicher, wenn es ist) und das hat immer noch nicht geholfen. – KingDolphin