4

XcodeでOpenGLes2.0テンプレートを変更して、その小さなボックスをオフスクリーンテクスチャ(50 * 50)にレンダリングしてから、ビューポートをリセットし、フルスクリーンクワッドを使用してテクスチャを画面にレンダリングしました。しかし、FPSが大幅に低下したため、明らかなラグが見られました(約10)。

iPadにfillrateに関する問題があることは知っていますが、これは正しくないようです。FBOを1つだけ使用し、ループ内のtextureとrenderBufferの間のカラーアタッチメントを変更しました。これは何か影響がありますか?

その上、私はOpenGLでピクセル値を編集するオーディオビジュアライザー(Windows Media Playerのもののような)を書いていました。助言がありますか?

ここにコードがあります:

//implement the texture in -(id)init        
glGenTextures(1, &ScreenTex);  
glBindTexture(GL_TEXTURE_2D, ScreenTex);  
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, texSize, texSize, 0, GL_RGB, GL_UNSIGNED_BYTE, nil);

//And in the render loop  
//draw to the texture  
glViewport(0, 0, texSize, texSize);  
glBindTexture(GL_TEXTURE_2D, ScreenTex);  
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ScreenTex, 0);  
glClear(GL_COLOR_BUFFER_BIT);

glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices);  
glUniform1i(Htunnel, 0);  
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);  

//switch to render to render buffer here  
glViewport(0, 0, backingWidth, backingHeight);

glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);  
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,colorRenderbuffer);  
glClear(GL_COLOR_BUFFER_BIT);  

glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, texVertices);  
glUniform1i(Htunnel, 1);  
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);  

//vertex shader   
void main()  
{  
    if (tunnel==0) {  
        gl_Position = position;  
        gl_Position.y += sin(translate) / 2.0;  
        colorVarying = color;  
    }else {  
        f_texCoord = v_texCoord;  
        gl_Position = position;  
    }  
}  

//frag shader
void main()  
{  
    if (tunnel==0) {  
        gl_FragColor = colorVarying;  
    }  else {  
        gl_FragColor = texture2D(s_texture, f_texCoord);    
    }   
}  
4

1 に答える 1

3

実際のコードがなければ、ボトルネックがどこにあるかを特定するのは困難です。ただし、Instruments を使用して原因を特定することで、問題がどこにあるかを把握できます。

OpenGL ES インストゥルメントと新しい Time Profiler の両方を使用して、新しい Instruments ドキュメントを作成します。OpenGL ES インストゥルメントで、その右側にある小さなインスペクタ ボタンを押してから、[構成] ボタンをクリックします。結果のページでほぼすべてのロギング オプション、特に Tiler Utilization % と Renderer Utilization % がチェックされていることを確認します。[完了] をクリックし、これらの統計の両方がページでチェックされていることを確認しSelect statistics to listます。

レンダリング中のしばらくの間、iPad 上のアプリケーションに対してこの一連のインストゥルメントを実行します。立ち止まって数字を見てください。私の質問に対する Pivot の回答で説明されているように、OpenGL ES インストゥルメントの Tiler Utilization % が 100% に達している場合は、ジオメトリによって制限されています (ここではありそうにありません)。同様に、Renderer 使用率 % が 100% に近い場合は、フィルレートが制限されています。ログに記録した他の統計を参照して、何が起こっているのかを引き出すこともできます。

その後、Time Profiler の結果に目を向けて、速度が低下している可能性のあるコード内のホットスポットを絞り込めるかどうかを確認できます。そこのリストの一番上にある項目を見つけます。それらがコード内にある場合は、それらをダブルクリックして何が起こっているかを確認してください。それらがシステム ライブラリにある場合は、シンボル名を右クリックして、または のいずれCharge Library to Callersかを選択し、より関連性の高いものが表示されるまで結果をフィルタリングしますCharge Symbol to Caller

ある時点で、そこに OpenGL 関連のシンボルが表示され始めます。これは、GPU が何を行っているかの手がかりになるはずです。また、独自のコードの一部が処理速度を低下させていることに驚くかもしれません。

別の OpenGL ES インストルメントを試すことができますが、これは Xcode 4 ベータ版の一部であり、現在 NDA の対象となっています。詳細については、WWDC 2010 セッション ビデオをご覧ください。

于 2010-11-09T13:59:33.177 に答える