Android用のグラフィックエンジンにネイティブの2D描画関数をいくつか実装していますが、プログラムのパフォーマンスを観察すると、別の質問が出てきます。
現時点では、drawLine/drawImage 関数を実装しています。要約すると、それぞれ異なる線/画像を描画するための次の異なる値があります。
- 色
- アルファ値
- 線の幅
- 回転(画像のみ)
- サイズ/縮尺(画像も)
- ブレンド方法 (減算、加算、法線アルファ)
ここで、imageLine が描画されると、CPU が計算した頂点位置と 6 つの頂点 (2 つの三角形) の UV 値を Floatbuffer に入れ、描画用の情報 (色、アルファなど) を渡した後、drawArrays ですぐに描画します。 .) ユニフォームを介してシェーダーに。画像を描画すると、情報を渡した後、事前設定された VBO が直接描画されます。
私が認識した最初の事実は、もちろん、イメージの描画はイメージラインよりもはるかに高速です(VBOのため)だけでなく、イメージラインのVBOに頂点データを事前に配置することはできません。イメージラインには通常のイメージのような静的な形状がないためです(さまざまな線の長さ、さまざまな線幅、および x1、y1 と x2、y2 の頂点位置があまりにも頻繁に変化する) そのため、VBO の代わりに通常の Floatbuffer を使用します。
私の質問は次のとおりです。画像やその他の 2D グラフィック機能を管理するための最良の方法は何ですか。私にとっては、エンジンのユーザーがパフォーマンスをあまり落とすことなく、できるだけ多くの画像/2D グラフィックスを描画できることが重要です。
画像、画像線、四角形、四角形などを描画する関数は、 https ://github.com/Chrise55/LLama3D/blob/master/Llama3DLibrary/src/com/llama3d/object/graphics/image/ImageBase にあります。 .java
これは、多くの画像でどのように見えるかの例です(人工ニューラルネットワークのテスト)。正常に動作しますが、その多くの画像ではすでに少し遅くなります... :(