2

シンプルな OpenGL ES 実装 (2D ゲーム) を iPhone でテストしていますが、プロファイラーの使用中にレンダリングの使用率が高いことに気付きました。これらは事実です:

  • プリロードされた大きなテクスチャ( 512x512 ピクセル) を 1 つだけ 60fps で表示しており、レンダリングの使用率は約 40% です。
  • 私のテクスチャは、私が使用している唯一の GL 関数である をGL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA使用してブレンドされています。
  • テクスチャを小さくしてタイリングしようとしましたが、違いはありませんでした。
  • 1024x1024 ピクセルの PNG テクスチャ アトラスを使用しています

この1 つのテクスチャがこれほど激しい GPU 使用率を引き起こしているのは非常に奇妙です。

これは予想されることですか?私は何を間違っていますか?

編集:私のコード:

// OpenGL setup is identical to OpenGL ES template
// initState is called to setup
// timer is initialized, drawView is called by the timer

- (void) initState
{
    //usual init declarations have been omitted here        
    glEnable(GL_BLEND); 
    glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_ALPHA);     
    glEnableClientState (GL_VERTEX_ARRAY);
    glVertexPointer     (2,GL_FLOAT,sizeof(Vertex),&allVertices[0].x);          
    glEnableClientState (GL_TEXTURE_COORD_ARRAY);
    glTexCoordPointer   (2,GL_FLOAT,sizeof(Vertex),&allVertices[0].tx);     
    glEnableClientState (GL_COLOR_ARRAY);
    glColorPointer      (4,GL_UNSIGNED_BYTE,sizeof(Vertex),&allVertices[0].r);    
}    
- (void) drawView
{       
    [EAGLContext setCurrentContext:context];
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity();

    GLfloat width  = backingWidth /2.f; 
    GLfloat height = backingHeight/2.f; 

    glOrthof(-width, width, -height, height, -1.f, 1.f);
    glMatrixMode(GL_MODELVIEW);
    glClearColor(0.f, 0.f, 0.f, 1.f);
    glClear(GL_COLOR_BUFFER_BIT);       
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);       
    [context presentRenderbuffer:GL_RENDERBUFFER_OES];      
    [self checkGLError];        
}

編集:いくつかの改善を行いましたが、レンダリングの使用率を下げることはできませんでした。テクスチャを 32x32 の部分に分割し、座標のタイプとテクスチャ座標を GLfloat から GLshort に変更し、縮退三角形の頂点を追加しました。

アップデートは次のとおりです。

initState: (頂点とテクスチャ ポインターは GL_SHORT になりました)

glMatrixMode(GL_TEXTURE);
glScalef(1.f / 1024.f, 1.f / 1024.f, 1.f / 1024.f);
glMatrixMode(GL_MODELVIEW);
glScalef(1.f / 16.f, 1.f/ 16.f, 1.f/ 16.f);

drawView:

glDrawArrays(GL_TRIANGLE_STRIP, 0, 1536); //(16*16 parts * 6 vertices)  
4

5 に答える 5

1

GL_SRC_ALPHA、GL_ONE_MINUS_SRC_ALPHA を使用して、2D 環境で 5 つの 512x512 テクスチャを重ねて表示するアプリを作成しています。約 14 fps を取得できます。本当に60fpsが必要ですか?ゲームとしては、24-30 で十分だと思います。また、可能であれば PVR テクスチャ圧縮を使用してください。SDK に含まれている例があります。

于 2009-06-28T21:43:41.873 に答える
1
  1. GL_BLENDまだ必要でない場合は、無効にすることを忘れていないことを願っています。
  2. メモリ帯域幅の最適化を試みることができます - 16 bpp 形式または PVRTC を使用してください。テクスチャ サイズのテクスチャ キャッシュを使用した IMHO はまったく役に立ちません。
  3. フレームバッファが iPhone UI によってテクスチャとして使用されていることを忘れないでください。32 ビット RGBA として作成された場合は、もう一度アルファ ブレンドされます。最適なパフォーマンスを得るには、16 ビット 565 フレームバッファが最適です (ただし、グラフィックスの品質は低下します)。

キャッシュ サイズなどの詳細はすべてわかりませんが、テクスチャ ピクセルはビデオ メモリにアップロードされた時点ですでにスウィズルされており、三角形は PVR タイル エンジンによって分割されていると思われます。したがって、独自の分割は冗長に見えます。

そして最後に。これは単なるモバイル用の低電力 GPU であり、巨大な画面や高いフィルレート向けには設計されていません。アルファ ブレンディングはコストがかかり、PowerVR チップではおそらく 3 ~ 4 倍の違いがあります。

于 2009-12-02T11:46:26.263 に答える
0

問題は正確には何ですか?
シルクのように滑らかな 60 fps が得られます。

レンダリング使用率が 40% であっても、誰が気にしますか?

于 2009-06-28T21:39:08.577 に答える
0

この問題は、iPhone のテクスチャ キャッシュ サイズが原因である可能性があります。状態をどのように設定しているかに応じて、個々の三角形、四角形、またはトライストリップにどれだけのテクスチャがあるかということになります。

これを試してください: クワッドを細分化して、テストを繰り返します。したがって、1 クワッドの場合は 4 にします。次に 16 にします。というように、それが役立つかどうかを確認します。重要なのは、各プリミティブが参照する実際のピクセル数を減らすことです。

テクスチャ キャッシュが壊れると、ハードウェアはメイン メモリから各ピクセルのテクスチャ バッファ用に確保されている vram にテクスチャ ルックアップをスラッシュします。これにより、パフォーマンスが大幅に低下する可能性があります。

または - 私は iPhone ハードウェアを本当に知らないので、完全に間違っています。また、PVR チップは、私が慣れ親しんだもの (PS2、PSP) と比較して奇妙な獣であることも知っています。それでも試してみるのは簡単なテストであり、それが役立つかどうか興味があります.

于 2009-06-28T21:53:33.477 に答える
0

この投稿を読んでください。

512x512 は、iPhone が対処するにはおそらく少し楽観的すぎるでしょう。

編集:

あなたはすでにこれを読んでいると思いますが、そうでない場合は、iPhone での最適な OpenGl ES パフォーマンスに関する Apple のガイドを確認してください。

于 2009-05-16T15:02:17.170 に答える