4

現在、NDKを使用してiOSからAndroidに3DC++ゲームを移植しています。レンダリングはGLES2で行われます。プラットフォーム固有のものをすべて書き直してゲーム全体を初めて実行したとき、レンダリングのバグに気づきました。ジオメトリの一部だけがレンダリングされることもあれば、画面全体で巨大な三角形がちらつくこともあります。

4.1.2を実行しているGalaxyNexusでテストしました。glGetError()何も返しませんでした。また、ゲームはすべてのiOSデバイスで美しく実行されました。ドライバーのバグを疑うようになり、何時間も探した後、VAO(GL_OES_vertex_array_object)を使用すると問題が発生することがわかりました。同じレンダラーはVAOなしで正常に動作し、VAOを使用してゴミを生成しました。

このバグレポートはGoogleCodeで見つけました。また、IMGフォーラムで同じレポートを見て、スタッフがそれが確かにドライバーのバグであることを確認しました。

これはすべて私に考えさせました-確認されたドライバーのバグのケースをどのように処理しますか?2つのオプションがあります。

  1. AndroidデバイスでVAOを使用しない。
  2. 特定のデバイスとドライバーリビジョンをブラックリストに登録し、これらのデバイスでVAOを使用しない。

私は両方のオプションが好きではありません。
オプション番号1は、優れたドライバーを持っているすべてのユーザーを罰します。VAOは本当にパフォーマンスを向上させます。1つのデバイスにバグがあるため、VAOを無視するのは本当に悪いことだと思います。
オプション番号2を正しく実行するのはかなり困難です。すべてのAndroidデバイスで壊れたドライバーをテストすることはできません。リストは絶えず変更されるため、追いつくのが難しくなります。

助言がありますか?すべてのデバイスを手動でテストせずに、実行時にそのようなドライバーのバグを検出する方法はおそらくありますか?

4

1 に答える 1

1

Android上のOpenGLESドライバーのバグはよく知られていることなので、ドライバーにバグがある可能性は十分にあります。特に、GL拡張機能などの高度な(あまりテストされていない)機能を使用している場合。

大規模なAndroidプロジェクトでは、通常、次のチェックリストを使用してこの問題と戦います。

  1. 独自のコードを徹底的にテストおよびデバッグし、OpenGL仕様と照合して、APIの誤用がないことを確認します。
  2. 問題のグーグル(!!!)
  3. チップセットベンダーに連絡して(通常、開発者からバグを送信するためのフォームがWebサイトにありますが、2〜3個の実際のバグを正常に送信すると、支援できる人の直接の電子メールがわかります)、コードを提示します。ドライバーにバグを見つけることもあれば、APIの誤用を見つけることもあります...
  4. この機能がいくつかのデバイスで機能しない場合は、回避策を作成するか、従来のレンダリングパスへのフォールバックを作成してください。
  5. この機能が一流のデバイスの大部分でサポートされていない場合は、使用しないでください。市場での準備ができたら、後で追加できます。
于 2013-07-03T15:05:14.423 に答える