2

画面上に最大 200,000 の正方形を描画しようとしています。または基本的に多くの正方形。私は多くの描画呼び出しに道を譲っているだけで、アプリのパフォーマンスを損なっていると思います。正方形はボタンを押したときにのみ更新されるため、フレームごとに更新する必要はありません。

これが私が今持っているコードです:

- (void)glkViewControllerUpdate:(GLKViewController *)controller
{

//static float transY = 0.0f;
//float y = sinf(transY)/2.0f;
//transY += 0.175f;

GLKMatrix4 modelview = GLKMatrix4MakeTranslation(0, 0, -5.f);
effect.transform.modelviewMatrix = modelview;

//GLfloat ratio = self.view.bounds.size.width/self.view.bounds.size.height;
GLKMatrix4 projection = GLKMatrix4MakeOrtho(0, 768, 1024, 0, 0.1f, 20.0f);    
effect.transform.projectionMatrix = projection;
_isOpenGLViewReady = YES;
}

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
if(_model.updateView && _isOpenGLViewReady)
{

    glClear(GL_COLOR_BUFFER_BIT);
    [effect prepareToDraw];
    int pixelSize = _model.pixelSize;
    if(!_model.isReady)
        return;
    //NSLog(@"UPDATING: %d, %d", _model.rows, _model.columns);
    for(int i = 0; i < _model.rows; i++)
    {
        for(int ii = 0; ii < _model.columns; ii++)
        {
            ColorModel *color = [_model getColorAtRow:i andColumn:ii];
            CGRect rect = CGRectMake(ii * pixelSize, i*pixelSize, pixelSize, pixelSize);
            //[self drawRectWithRect:rect withColor:c];
            GLubyte squareColors[] = {
                color.red, color.green, color.blue, 255,
                color.red, color.green, color.blue, 255,
                color.red, color.green, color.blue, 255,
                color.red, color.green, color.blue, 255
            };

            // NSLog(@"Drawing color with red: %d", color.red);


            int xVal = rect.origin.x;
            int yVal = rect.origin.y;
            int width = rect.size.width;
            int height = rect.size.height;
            GLfloat squareVertices[] = {
                xVal, yVal, 1,
                xVal + width, yVal, 1,
                xVal,  yVal + height, 1,
                xVal + width,  yVal + height, 1
            };    

            glEnableVertexAttribArray(GLKVertexAttribPosition);
            glEnableVertexAttribArray(GLKVertexAttribColor);

            glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 0, squareVertices);
            glVertexAttribPointer(GLKVertexAttribColor, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, squareColors);

            glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

            glDisableVertexAttribArray(GLKVertexAttribPosition);
            glDisableVertexAttribArray(GLKVertexAttribColor);


        }
    }   
    _model.updateView = YES;
}
4

3 に答える 3

1

まず、本当に 200,000 の正方形を描く必要がありますか? ビューポートには合計 786,000 ピクセルしかありません。シーンの全体的な品質に大きな影響を与えることなく、描画されるオブジェクトの数を減らすことができる場合があります。

とはいえ、これらが小さな正方形の場合は、正方形の領域をカバーするのに十分な大きさのピクセル サイズを持つ点としてそれらを描画できます。これには、頂点シェーダーの gl_PointSize を適切なピクセル幅に設定する必要があります。その後、座標を生成し、GL_POINTS として一度に描画されるようにそれらすべてを送信できます。これにより、三角形の余分なジオメトリと、ここで使用している個々の描画呼び出しのオーバーヘッドが取り除かれます。

ポイントを使用しない場合でも、最初に必要なすべての三角形のジオメトリを計算してから、そのすべてを 1 回の描画呼び出しで送信することをお勧めします。これにより、OpenGL ES API 呼び出しのオーバーヘッドが大幅に削減されます。

他に検討できることの 1 つは、頂点バッファー オブジェクトを使用してこのジオメトリを格納することです。ジオメトリが静的な場合は、描画されたフレームごとにジオメトリを送信しないようにするか、変更された部分のみを更新することができます。フレームごとにデータを変更するだけでも、動的ジオメトリに VBO を使用すると、最新の iOS デバイスでパフォーマンスが向上すると思います。

于 2012-07-12T17:15:36.170 に答える
0

どうにか最適化してみませんか?私はグラフィック系のものにはあまり詳しくありませんが、200,000 個の正方形を描画している場合、それらすべてが実際に表示される可能性は低いと思います。描画したい正方形が実際に表示されているかどうかを判断する、何らかの isVisible タグを mySquare クラスに追加できませんか? 次に明らかな次のステップは、描画関数を変更して、正方形が表示されていない場合は描画しないようにすることです。

または、現在のコードを改善するように誰かに依頼していますか? あなたの言うようにパフォーマンスが悪い場合、上記のコードに小さな変更を加えても問題は解決しないと思います。描画方法を再考する必要があります。

于 2012-07-12T16:00:32.743 に答える
0

コードが実際にやろうとしているのは、_model.rows× _model.columns2D 画像を取得し、 で拡大して描画することのよう_model.pixelSizeです。がカラー値の配列から一度に 3 バイトを取得している場合-[ColorModel getColorAtRow:andColumn:]、そのカラー値の配列をGL_RGB/GL_UNSIGNED_BYTEデータとして OpenGL テクスチャにアップロードし、GPU がすべてのピクセルを一度に拡大できるようにすることを検討してください。

または、OpenGL ES と GLKit を使用している唯一の理由がコンテンツの拡大である場合ColorModelは、色の値を CGImage にラップし、UIKit と Core Animation に描画を任せたほうがよいかもしれません。のカラー値はどのくらいの頻度でColorModel更新されますか?

于 2012-07-15T03:05:57.073 に答える