私は RenderScript の限界を感じ取るための簡単なアプリケーションを作成し、三角形が約 65,000 に達すると、システムが追加の三角形をまったく描画しないことを発見しました。たとえば、70,000 個の三角形を含む円柱を作成すると、三角形の数が 65,000 を超える円柱に対応するウェッジが欠けています。三角形にはテクスチャが付けられており、アプリを簡単に作成できるTriangleMeshBuilder
ように、クラスを使用しただけなので、trifans や tristrips を使用するなどの実際の最適化は行われていません。ハードウェアは Samsung Galaxy Nexus です。LogCat は、約 15MB のヒープ サイズと 3% の空き領域を報告します。グラフィック システムまたは RenderScript に関するエラーや警告は表示されません。
三角形が削除された理由を説明できる人はいますか? RenderScript が正常に処理できるハードウェアの限界に達していますか?
更新は、Samsung Galaxy Nexus (4.0.3)、Samsung Galaxy Tab 7.0+ (3.2)、および Motorola Xoom (3.2) で発生します。すべて約 65,000 の三角形の同じ点にあります。これらの各デバイスには、異なる GPU が搭載されています。
更新 2 Steve Blackwell の洞察に応えて、いくつかの追加の考えがあります。
行 710-712 は実際にint
インデックスをにダウンキャストするためshort
、Steve が指摘するように 65536 は 0 になります。さらに、757 行目の「キャスト」は、最終的に RenderScript に送信されるバイナリ データの形式を RenderScript に伝えるほどのキャストではありません。Allocation
RenderScript では、Java から RenderScript ランタイムに移行するために、すべてのデータを と呼ばれる RenderScript 固有のデータ型にパックする必要があり、データ構造について通知する必要があります。これはバグであるという Steve の意見に沿って、757 行目は RenderScript にインデックス データを次のように扱うように通知します。short
(符号なし 16 ビット) しかし、32 ビットの符号付きの値を送信します (これは、チェックがないために受け入れられ、符号なしで処理され、下位 16 ビットのみが使用されるため、このしきい値と三角形を下回ると何かが描画されるのはなぜですか)行ったときに最初のインデックスに接続し直します)。
これらの値をすべて整数として受け入れてこの制限を増やすことができるかどうかを確認するためのサブクラス化TriangleMeshBuilder
は機能しませんでした。これにより、アクセスできない深いコードのどこかに、unsigned short への追加の参照があると思われます。唯一の回避策は、Steve が提案するように頂点バッファーを追加することです。これは、既存のMesh.AllocationBuilder
クラスで簡単に実行できます。また、これが実際にバグなのか意図的なものなのかを判断するために、デベロッパー ハングアウトで Google に報告します。