9

ターゲット言語は C/C++ で、プログラムは Linux でのみ動作する必要がありますが、プラットフォームに依存しないソリューションが明らかに優先されます。私は Xorg を実行しており、XVideo と OpenGL が利用可能です。

Intel グラフィックスを搭載した Intel Core 2 Duo の 1024x768 で期待できる FPS はどれくらいですか? (描画数のみ。アレイは RAM で準備完了と見なします。正確な予測は必要ありません)

4

6 に答える 6

9

カラー トリプレットの 2D 配列を描画する最速の方法:

  1. float (バイトではなく、 double ではない) ストレージを使用します。各トリプレットは、それぞれ 0.0 から 1.0 までの 3 つの float で構成されます。これは、GPU によって最も最適に実装された形式です (ただし、GL_LUMINANCE色相が必要ない場合はグレースケール ストレージを使用してください。はるかに高速です!)
  2. 配列をテクスチャにアップロードしますglTexImage2D
  3. GL_TEXTURE_MIN_FILTERテクスチャ パラメータが に設定されていることを確認します。GL_NEAREST
  4. テクスチャを適切なクワッドにマップします。

この方法はglDrawPixels(何らかの理由で不適切に実装される傾向がある)よりもわずかに高速であり、プラットフォームのネイティブのブリッティングを使用するよりもはるかに高速です。

また、ピックスマップが変更されていない場合は、手順 2 を実行せずに手順 4 を繰り返し実行するオプションが提供されます。もちろん、これははるかに高速です。

遅いネイティブ ブリッティングのみを提供するライブラリには、次のものがあります。

  • Windows の GDI
  • X11 上の SDL (Windows では、HW_SURFACE を使用すると高速な opengl バックエンドを提供します)
  • Qt

期待できる FPS に関しては、Intel グラフィックスを搭載した Intel Core 2 Duo で 1024x768 テクスチャを描画すると、テクスチャがフレームごとに変化する場合は約 60FPS、そうでない場合は >100FPS になります。

しかし、自分でやってみてください;)

于 2009-02-02T19:02:44.063 に答える
6

しばらく前に C と OpenGL を使用してこれを行ったところ、フル スクリーン サイズのクワッドを作成し、テクスチャ マッピングを使用してビットマップをクワッドの面に転送することで、非常に優れたパフォーマンスが得られました。

以下にサンプルコードを示しますので、ご活用いただければ幸いです。

#include <GL/glut.h>
#include <GL/glut.h>

#define WIDTH 1024
#define HEIGHT 768

unsigned char texture[WIDTH][HEIGHT][3];             

void renderScene() {    

    // render the texture here

    glEnable (GL_TEXTURE_2D);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

    glTexImage2D (
        GL_TEXTURE_2D,
        0,
        GL_RGB,
        WIDTH,
        HEIGHT,
        0,
        GL_RGB,
        GL_UNSIGNED_BYTE,
        &texture[0][0][0]
    );

    glBegin(GL_QUADS);
        glTexCoord2f(0.0f, 0.0f); glVertex2f(-1.0, -1.0);
        glTexCoord2f(1.0f, 0.0f); glVertex2f( 1.0, -1.0);
        glTexCoord2f(1.0f, 1.0f); glVertex2f( 1.0,  1.0);
        glTexCoord2f(0.0f, 1.0f); glVertex2f(-1.0,  1.0);
    glEnd();

    glFlush();
    glutSwapBuffers();
}

int main(int argc, char **argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);

    glutInitWindowPosition(100, 100);
    glutInitWindowSize(WIDTH, HEIGHT);
    glutCreateWindow(" ");

    glutDisplayFunc(renderScene);

    glutMainLoop();

    return 0;
}
于 2009-02-02T18:59:28.797 に答える
1

「何fpsが期待できるか」という質問には、真剣に答えることはできません。プロセッサのレイアウトを行った人のおじいちゃんに名前を付けても、そうではありません。それは非常に多くの変数に依存します。

  • レンダリングする必要のあるトリプレットはいくつですか?
  • それらはフレーム間で変化しますか?
  • どのレートで(1秒間に30回以上の頻度で変化に気付かないでしょう)?
  • すべてのピクセルが常に変化しますか、それとも一部の領域の一部のピクセルだけが変化しますか?
  • 遠近法による歪みなしにピクセルを見ていますか?
  • あなたはいつもすべてのピクセルを見ますか?
  • openglドライバーのバージョンに応じて、異なる結果が得られます

これは永遠に続く可能性があり、答えは絶対にあなたのアルゴリズムに依存します。openglアプローチに固執する場合は、さまざまな拡張機能(http://www.opengl.org/registry/specs/NV/pixel_data_range.txtなど)を試して、ニーズに合っているかどうかを確認することもできます。すでに述べたglTexSubImage()メソッドは非常に高速ですが。

于 2009-04-30T15:50:15.453 に答える
1

ピクセルを画面にダンプしようとしている場合は、おそらくsdl の 「表面」機能を利用したいと思うでしょう。最大のパフォーマンスを得るには、入力データが出力サーフェスと同様のレイアウトになるように調整してください。可能であれば、一度に 1 つずつサーフェスにピクセルを設定することは避けてください。

SDL は、それ自体がハードウェア インターフェイスではなく、DirectX、OpenGL、DirectFB、xlib などの他の多くのディスプレイ レイヤーの上で適切に機能する移植性レイヤーであるため、非常に優れた移植性と非常に薄いレイヤーが得られます。これらのテクノロジに加えて、パフォーマンス オーバーヘッドをほとんど支払う必要はありません。

于 2009-02-02T17:28:16.783 に答える
0

1024x768でいくつのFPSを期待できますか?

その質問への答えは非常に多くの要因に依存しているので、言うことは不可能です。

于 2009-02-02T16:34:25.020 に答える