私は、単純なフラグメントシェーダにオープンGL ES2:フラグメントシェーダの最適化
precision lowp float;
uniform sampler2D u_texture_image;
uniform sampler2D u_texture_mask;
uniform lowp float u_blink;
varying lowp vec2 v_texCoords_image;
varying lowp vec2 v_texCoords_mask;
varying lowp float v_shadow;
void main() {
lowp vec4 color= vec4(texture2D(u_texture_image, v_texCoords_image));
lowp vec4 mask_color= vec4(texture2D(u_texture_mask, v_texCoords_mask));
//masking image
color = vec4(color.xyz,mask_color.a);
//blink
color =mix(color,vec4(1.0,1.0,1.0,mask_color.a),u_blink);
//check if its a shadow
color=mix(color, mask_color*0.3, v_shadow);
gl_FragColor = color;
}
を以下している私は、このコードで4400個のポリゴンを描画し、これではないので、25 fpsの(〜onDrawFrame間40msの呼び出し).Thisは十分ではありません取得全体のシーン。
このコードをどうにか最適化することはできますか?ターゲットのfpsは30です。
また、フラグメントシェーダーコード用のプロファイリングツールもありますか?
ADD:どのように私はこのシェーダは、その複合体を見ていない
private void drawPieces() {
//set my shader
piecesProgram.useProgram();
//set uniforms
piecesProgram.setUniforms(MVPMatrix, textureImageId, textureMaskId,new PointF(2f,2f),0f);
//load my vertcices with glVertexAttribPointer
piecesMesh.bindPieceData(piecesProgram,false);
//draw it with glDrawElements
piecesMesh.drawPieces(false);
piecesMesh.disableAttributes(piecesProgram);
}
についての素晴らしい記事を書いていますが、あなたが高速移動するコードでヒープメモリ(新PointF(...))を割り当てることがないようにしてください。任意のプログラミング言語、任意のプラットフォーム、任意の日に移動します。 – Andreas
フラグメントシェーダの排水性能であるかどうかをテストする一般的な方法は、2x2のビューポートを設定することです。それを行い、何が起こるかを見て、結果を伝えます。 – Andreas