グラフィックス アプリ向けの高速でピクセル精度の 2D 描画 API?
質問
クロスプラットフォームの描画プログラムを作成したいと考えています。アプリを作成するための 1 つの要件は、キャンバス上でピクセル レベルの精度があることです。たとえば、線描画アルゴリズムを他人に頼るのではなく、自分で書きたいと思っています。いかなる形式のアンチエイリアスも必要としません (やはり、ピクセル レベルの制御が必要です)。画面上でのユーザーの操作が迅速かつ応答性が高いことを望みます (高速アルゴリズムを作成できるまでは保留します)。
理想的には、これを Python で書きたいと思っていますが、第 2 の選択肢として Java を使用することもできます。最終的なアプリを簡単にクロスプラットフォームにできる機能は必須です。抽象化レイヤーを作成できる限り、必要に応じて、さまざまな OS 上のさまざまな API にサブミットします。何か案は?
補遺:絵を描く能力が必要です 画面上で. 。私が考え出したファイルに描画します。
解決
今週、ライブラリ pyglet を使用して Python から OpenGL を使用して 2D グラフィックスを実行するためのいくつかのスライドとデモ コードをまとめました。ここで私のものを見ることができます: http://tartley.com/?p=378
これは (Python としては比較的に) 非常に高速で、それぞれが約 50 個の頂点を持つ、独立して配置および配向された約 1,000 個のオブジェクトを画面上で移動させることができました。
これは非常に移植性が高く、この環境で書いたすべてのコードは、何も考えることなく Windows、Linux、Mac (さらには Pypy のような目立たない環境でも) で動作します。
アップデート: 同じトピックに関する新しい投稿もたくさんあります。 http://tartley.com/?cat=27
他のヒント
の ピグレット Python 用のライブラリがニーズに合うかもしれません。これにより、クロスプラットフォーム グラフィックス API である OpenGL を使用できるようになります。アンチエイリアシングを無効にして、画面の領域をバッファまたはファイルにキャプチャできます。さらに、イベント処理、リソースの読み込み、および画像操作システムを使用することもできます。おそらく、これを PIL (Python Image Library) に結び付けることもできます。間違いなく、人気のあるクロスプラットフォームのベクター グラフィックス ライブラリである Cairo に結び付けることもできます。
純粋な PyOpenGL の代わりに Pyglet について言及したのは、Pyglet が多くの醜い OpenGL 要素を何の努力もせずに透過的に処理するためです。
私と友人は現在、Pyglet を使用した描画プログラムに取り組んでいます。いくつかの癖があります。たとえば、OS X では OpenGL は常にダブルバッファリングされるため、表示が更新されるたびに反転されるため、すべてを 2 回描画する必要があります。1 回目は現在のフレームで、もう 1 回は他のフレームです。現在の進捗状況をご覧いただけます このSubversionリポジトリ内で. 。(トランク内の Splatterboard.py は、実行したいファイルです。) svn の使用に慣れていない場合は、最新のソースの .zip を電子メールでお送りいたします。コードを調べる場合はご自由に盗んでください。
言語を選択できる場合は、Haxe で作成された Flash ファイルを使用できる可能性があります。Haxe は無料の完全な動的プログラミング言語です。そして、関連するNekoという、Mac、Windows、Linux上で動作する仮想マシン(Java、Ruby、Parrotなど)があります。ある意味、新しく改良された Flash 形式であるため、当然のことながら描画することができます。 http://haxe.org/
C++ を使用したい場合は、QT の Canvas と QPainter がこの作業に非常に適しています。そしてそれはクロスプラットフォームです。
QT 用の Python バインディングがありますが、私はそれを使用したことがありません。
Java に関しては、SWT を使用すると、キャンバスのピクセル レベルの操作がやや難しく、時間がかかるため、お勧めしません。一方、Swing の Canvas は非常に優れており、応答性が優れています。私は AWT オプションを使用したことがありませんが、おそらくそこに行きたくないでしょう。
私がお勧めします wxPython
これは見事にクロスプラットフォームであり、ピクセルごとのコントロールを取得でき、気が変わったら pyglet や agg などのライブラリで使用できます。
ドキュメントとデモのダウンロードでは、実行しようとしている内容に役立つ例がいくつか見つかります。