動的(アルゴリズム)グラフィックスの手法
-
05-07-2019 - |
質問
32ビットプロセッサ用のアプリケーションをプログラミングしています(512kフラッシュ、32k RAM)。
ディスプレイは16ビットカラーの128x160で、プロセッサでバッファリングすると通常40kのRAMを消費します。 RAMがあまりないので、画面データをその場で生成するためのテクニック、ヒント、トリック、アイデアを探しています。
役立つ可能性のあるもの:
- おそらく、この種の制限のリソースを知っているでしょう
- たぶん、あなたはその場で魅力的なグラフィックを生成したでしょう
- ディスプレイのスキャン中にプログラムメモリ内の要素(アルファブレンディングを含む)をその場で結合するために使用できる一般的なアルゴリズムはありますか
- 単純なベクターレンダリング手法(または無料(bsd / mit / apache)ソース)
- ???
乗算器はありますが、浮動小数点プロセッサはありません。ディスプレイ自体には、ディスプレイ用の非常にシンプルなコントローラーとメモリがありますが、読み取りと書き込みは高価であるため、回避できる場合はワークスペースとして使用したくありません。
-アダム
解決
ある意味では、あなたはTandys、Spectrum、初期のPCの時代とほぼ同じ状況のゲーム開発者です。だから、ここに私の推奨事項があります:
コンピュータグラフィックスに関するMichael Abrashの著作を読んでください。それらは、浮動小数点コプロセッサーがオプションのハードウェアであった時代に書かれたもので、昔の(おそらく「悪い」)ソフトウェアレンダリングされた時代に使用されていた多くの基本的なテクニック(ブレゼンハムラインなど)を記述しています。
彼の「ブラックブック」のほとんどを読むことができます。 こちら。
さらに、グラフィックプログラミングを学ぶためにほとんどの人が当時使用していた多くの古いBBSファイルをおそらく見つけることができますこちら。グラフィックス、ラインなどを検索するだけです。
役立つことを願っています!
更新: これ私が最初に画面上に物を描く試みで。その背後にある数学を理解しようとしてどれだけの時間を費やしたかわかりません(公平に言うと、当時は15歳でした)。 3Dの非常に優れた(そしてシンプルな)紹介、および変換、ポリゴンフィラー、および補間に関する非常に優れたプレミア。
他のヒント
画面にはどのようなデータが表示されますか?
写真画像でない場合は、パレットの使用を検討できます。たとえば、ピクセルあたり8ビットを使用する256カラーパレットには20kb(ルックアップテーブル用に256 x 2バイトに加えて)が必要で、少なくとも40kbよりも優れています。
この種の状況に対処するための基本的なテクニックは、画面を狭い水平ストライプに分割し、RAMにそのようなストライプを2つだけバッファリングすることだと思います。 1つのストライプが表示され、次のストライプが下にレンダリングされます。スキャンの「ビーム」が次のストライプにヒットすると(そして、キャッチするために割り込みが発生します)、2つを交換して、次のストライプの描画を開始します。
これの厄介な副作用は、各ストライプのレンダリングに費やすことができる時間にハードタイミング制限があることです。だから、退屈ではあるがスプライトのような予測可能なパフォーマンスに固執するのは魅力的だと思います。
少しオフトピックですが、これがニンテンドーDS 3Dハードウェアの仕組みです。同じy座標の周りにあまりにも多くのポリゴンをレンダリングしようとすると、それを見ることができます。スクリーンリフレッシュがレンダリングハードウェアを追い抜くと、ポリゴンがランダムにちらつき、ドロップアウトします。
また、私はあなたがパレット化されたレンダリングを使用するという他のポスターの提案を2番目にします。 16ビットピクセルで高速な計算を行うことは非常に困難ですが、パレットのレイアウト方法が賢明であれば8ビットで高速になります。
素敵なグラフィックと低メモリを組み合わせたいくつかのアイデア:
- 背景とスプライトをフラッシュに保存します。
- パレットを使用して、動的に生成されたグラフィックをRAMに半分のバイト数で保存します。
- LCDドライバーのウィンドウ機能を使用して、必要な画面の部分のみを更新します。