2

私はSDL/SDL2を初めて使用し、C/C++の経験がほとんどなく、pygame、pyglet、およびPySideの経験があり、より高速な処理の代替手段を見つけることを期待してPySDL2を試しています. 処理は描画用ですが、直接ピクセルを動作させるための簡単な APIがあります。

私は昨日 PySDL2 を使い始め、単純な発砲アルゴリズムを実装するためのボイラープレート コードを 1 日中書きました。1日だけ…と笑う人もいるかもしれませんが、1日で何かを描けることがグラフィックスライブラリにとって重要だと思います。私の問題は C/C++ の経験が乏しく、関連する PySDL2 API はほとんどが C API に直接マッピングされているため、C ベースの用語と仕様の詳細を掘り下げるのは本質的に困難です。SDL2 のグラフィックス パイプラインに関する簡単な概要を見つけるのをあきらめました。

グラフィックス パイプラインは、バイトや整数が最終的に画面上のピクセルになるパスです。ほんの一例として、OpenGL の概要図がここにあります - http://duriansoftware.com/joe/An-intro-to-modern-OpenGL.-Chapter-1:-The-Graphics-Pipeline.html - そして私はSDL2 のパイプラインの詳細図を探しています。

SDL2 でピクセルがどのように描画されるかを理解する上での主な問題は、SDL2 API がこの低レベルの詳細を隠す便利なヘルパーを提供することです。ビットマップをロードしてサーフェスを取得するように。次に、サーフェスをテクスチャに移動します。次に、SDL2 は何らかの方法でテクスチャをビデオ メモリに移動します。次に、GPU にそれを画面に表示するように指示します。これは私がそれをどのように理解したかではありませんが、それが言及されている場所を提供できるリンクはありません. つまり、次のとおりです。

[data array] --> [pixel array] --> [surface] --> [texture] --> [video memory] ┐
                                                                              |
   ..made with uglihunds ascii editor..                           [screen]  <-┘
     (which haz no graphics pipeline)

私のアプリケーションでは、これは毎秒 25 回実行する必要があります。Python で書いているので、どこを最適化するかを決定するためにパイプラインを知る必要があります。しかし、パイプラインが正しいかどうか確信が持てず、API 内で少し迷っています。多くのヘルパーがあり、計算されたピクセル データがどのように見えるか、どのように見えるべきかという出発点さえありません。

だから私は知る必要があります:

  1. SDL2 がサポートする入力データの種類は何ですか (bmp、メモリ ポインタなど)
  2. 入力が変換される中間データ形式はありますか
  3. データ変換チェーンとは
  4. 変換チェーンの制御方法
  5. SDL2 がサポートする出力の種類は何ですか

  6. PySDL2 でどのように見えるか

誰かが反対票を投じたこの質問もあり、混乱しているのは私だけではないことを教えてくれます。

アップデート:

@Ancurio で指摘されているように、すでにピクセルの配列とデータの配列にあるサーフェス オブジェクトなので、図を変更して、サーフェスがピクセル配列であるという定義を提供します。

[bitmap] ----┐
[int array] -┴-> [surface] --> [texture] --> [video memory] --> [screen]

つまり、基本的にサーフェスは 1. ピクセル データを含む連続メモリ チャンク、2. ピクセルに関する情報です。ビットマップは、ディスクまたはイメージからロードするピクセル配列でもあります。しかし、SDL2 はそれを直接使用することはできません。なんで?

パイプラインの最初のステップの問題は、int およびビットマップ ピクセルがサーフェス ピクセルにどのように変換されるか、およびサーフェスがビットマップとどのように異なるかということです。私はPythonを使用していますが、明らかな直接メモリアクセスがなく、オプションが何であるかを理解する必要があります。

4

1 に答える 1

2

初めてこれを行う場合は、全体像 (つまり、グラフィックス パイプライン) にあまり注目せず、やりたいこと (ピクセル アクセス) に集中する必要があります。

古いSDLに慣れた後、SDL2を学習するときに、このトピックについてかなりの混乱がありました(私自身の質問)。解決策はMigration Guideにあることがわかりました。使用する必要がありSDL_TEXTUREACCESS_STREAMING、ピクセルを直接操作できます。

その時点で、表面について気にする必要さえありません。テクスチャ内のピクセルを更新し、それをビデオ メモリにアップロードするだけです (SDL_RenderPresent()およびその他の付随する呼び出しを使用)。

于 2014-01-28T14:15:38.763 に答える