2Dレトロアクセラレータのグラフィック部分がどのように機能するかを考えたことがある人なら誰でも、これらの悪名高いタイルをどのように描画するかを大まかに表しています。ちなみに、定義からは長方形である必要はありません。タイリングはタイリングについてです。はい、ほとんどの場合、iron apiの開発者はこれを理解しているため、メソッドはdrawTileではなくdrawRectと呼ばれます。どの長方形も実際にタイルにすることができますが、その逆は当てはまりません。そして、問題は醸造です:なぜ2Dアクセラレータはrectのみを永続的に加速するのですか...この質問に対する簡単な答えは、他のすべてが単純なハードウェアには複雑すぎるためです。しかし、ここで私は主張します。この基本的な抽象化の少なくとも1つの単純であるが、非常に機能的な拡張を提案することができます。
私は長い間Habrに手紙を書いていません。ずっと完璧にやりたかったので…そんな病気にかかっています。一方、Habr自身は基準を大幅に下げており、私はまだ書いていないし、書いていません。そのため、今日の記事は、友達との会話だけで準備することなく生まれました。しかし、深く徹底的に話したい友達がいます。
おそらく、私の規則性への復帰としましょう。そのようなプラスまたはマイナスの読みやすさで、急いでペイントを投げ込んでも、明確にするのに最低限十分である場合、ナレーションは詳細で過負荷になることはありませんが、それでも概念的なアクセントがあり、ランプのようなものは、かつてのように高価な読者になります。
言い換えれば、今日私はコンテンツの品質とそれに専念できる時間との間の妥協点を探しています。理解を願っています。
それでは、始めましょう…
サンプルとして、任意の長方形の領域をコピーする一般的な機能について考えてみます。これは、行と行の要素を通る単なる二重ループであることがわかります。この
コードブロックは、通常、両方のループのトラバース方向のx4の組み合わせで簡単に繰り返され、反射を実装します。
別のx2の組み合わせは、軸に沿って反射するdst [x] [y]による順序の並べ替えによって与えられます。 y = x。
途中で、反射のこれらの8つのオプションは、すべてのミラー反射を左から右に、90grの倍数で可能なすべての回転です。
それでは、最小限の追加でさえ、この基本的な要素を大幅に変更する方法を見てみましょう。
おそらく誰にも起こらなかったのかもしれませんが、たとえば、タイルをパラレルパイプにできないのはなぜですか?将来的には、この拡張機能のオーバーヘッドは最小限であると言えます。これを実装するには、行ごとに2、3の増分を追加するだけで済みます
。x/ y順列との組み合わせの結果として、常に1つの直交に沿って方向付けられた一対の辺を持つ平行パイプが得られ、他の2つは斜めになります。 ..。この安く受け取られたささいなことは私たちに何を与えますか?さて、まず、3つの固定投影を使用する機能:
増分を一定ではなく小数にすると、シフト角度が自由になる可能性があります。これは、サイドスクローラーの揺れるタイルの効果と
、等尺性の突起のスペースに壁を構築するための両方に完全に使用できます。
また、フラクショナルと言えば、必ずしもフロートサポートを意味するわけではないことを忘れないでください。現代の甘やかされて育ったプログラマーが時々忘れ始めるもの。 floatはFloatingpointで分数ですが、ここでは完全に不要です。実際、ペアの上限を個別の値として読み取ることができるダブルレジスタを備えたプロセッサは、フラクショナル固定ポイント(固定ポイント)を「サポート」しています。さらに、この場合、追加の命令は1つも追加されません。 (まあ、スロープが256ビートに設定されることを除いて)だから、それはすべて無料です、みんなを連れて行ってください!
注意深い読者が誘導的に要求する必要がある別の同様のステップは、内側のループの列挙の2番目の境界までこの関数を繰り返すことです。終了増分を個別に切り離すことができます。そして、一般的なケースでは、直交の1つに基づいて任意の台形を描くことができます(三角形の特殊なケースとして):
そして、彼らは私たちに何をあきらめましたか?考えることはできますが、そのような2回の描画呼び出しで、直交方向の六角形から平面をテクスチャリングするか、このために準備されたタイルセットから斜め方向の菱形をテクスチャリングするだけであることがすぐにわかります。ちなみに、ゲーム業界ではかなり一般的なタイリングケース。
J2MEの時代
J2ME , . , ,
アクセラレータでそれらのハードウェアサポートがあると便利です。
説明されている残りの部分は、ボーナス機能です。意図的に実装する方がよいでしょう。ただし、特に、プリミティブを色(またはフラットパターン)のみで塗りつぶすことについてのみ説明すると、既存のゲームスペースに簡単に追加
できます...同じペアの描画呼び出しで、詳細に限定されない三角形を作成できます(中央に沿った直交線によって単純に2つにカットされます)。ポイント、これは彼の古典的な描画アルゴリズムに非常に似ています)そしてこれからすでに遠近法で構造を構築することが可能です。ちなみに、例えば台形自体からは、縦に固定された形の3D投影DOOM1が基本的に安価に得られます。
必要に応じて、多かれ少なかれ大きなボクセルでも塗りつぶしでペイントしてみることができます。投影の自由度に応じて、多かれ少なかれドローコールを費やします。以下の最初の2つの透視投影は固定されていますが、それぞれに4つの対称ビューがあります(合計8つの表示角度)。 3つ目は一般的なケースで、垂直方向にのみ固定されます。垂直軸を中心に回転すると、最初と2番目が交互になります。
追加の呼び出し機能は、高価ではありませんが、外側のみのサイクルの反復に関連付けられているため、可能であれば、図を台形に分割して、カットの直交に沿ってより細長い部分にすることをお勧めします。実際、これは基本的な長方形アルゴリズムを描画する場合にも当てはまります。水平方向の描画は垂直方向の描画よりも効率的です。
これらの呼び出しでボーナス機能のパースペクティブテクスチャリングを実行することは可能ですが、フラクショナルスケーリングの実装が必要であり、srcの追加の発散係数、およびデシメーション係数の導入に関連付けられています。さらに、3Dのダイナミクスでかなり曲がりくねって計算する必要があるため、これはお勧めできません。シンプルなアーキテクチャ。
さて、私自身の利益のためにHabrの前で復讐を終えても、この増分係数の魔法が代数的にどこから来ているのかを簡単に説明せずにはいられません。学校で教えられている直線y = kx + bの式は、ここで一度に2回こんにちはを送信します。すべての係数がその場所で役に立ちました。
このようなタイルの実装を備えた2Dハードウェアアクセラレータに出くわさなかったのはなぜですか。推測することしかできません。
- タイルのコンセプトは、実際には非常に厳密に固定されたパターンであったため、もう少し多くのことができるとは誰も思っていませんでした。
- 概説された広範な結果を分析しなかったために、そのような機能に2、3クロックサイクルを費やしたいと思った人は誰もいなかったか、単純なゲームを使用した当時の開発者はそれらの需要を生み出しませんでした。それにもかかわらず、mode7(フラクショナルスケーリングをサポートするハードウェア上の長方形のスプライトの断片の出力を介して、パースペクティブテクスチャリングを実装するためのチートアルゴリズム)がありました。
- または私は十分に年をとっていません、そして私は続ける必要があります...