パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

Apple、iOSデバイスのGPUも独自開発へ」記事へのコメント

  • PC/AT互換機でグラフィックアクセラレーターブームが起きてET4000(はアクセラレータじゃないか)とかS3とか
    わいわいやっていた頃からの生き残り。
    しかもPCではライバル他社と比べてパッとしない性能で、不人気ですぐに消えるかと思いきや、
    メモリが厳しい組み込み向けに舵を切って成功し、他のグラフィックチップメーカーがばったばったと倒れていった中、
    しぶとく今まで生き残ってきた。

    でも一番の大口顧客を失いそうで、今度こそ危ないか?

    • by taka2 (14791) on 2017年04月05日 20時59分 (#3188626) ホームページ 日記

      初代PowerVRを使い込んだことがありますが、コンセプトは良いものの、商業的には失敗して当然な流れでしたね…

      PowerVRとほぼ同時期に、DirectX3で「Direct3D というメーカーに依存しない汎用API」という新たな潮流が出てきましたけど、Direct3D自体、Zバッファレンダリングに依存したAPIの作りになっていて、他のレンダリング方式があまり想定されてないんですよね。

      PowerVRは「タイルベースレンダリング」という独自の手法で省メモリ化を実現したわけですが、そのせいでDirect3Dとものすごく相性が悪い。一応 Direct3D 対応ドライバもありましたが、あまり性能が出ませんでした。チップ性能を引き出すには独自APIの利用が必須。
      もうなんか、出だしからいきなりこけて低空飛行だったので、モバイルに舵を切ってから流行りだしたのを見た時は、「えっ、まだやってたの」って印象を持ったぐらい。

      あと、今はどうなのかわかりませんが、当時のPowerVR は「凸なトライアングル ストリップ [wikipedia.org]」に特化しているので、「いかに少ないストリップでデータを表現できるか」がそのまま描画性能に直結するので非常に重要でした。何も考えずに「1ポリゴン=1ストリップ」にすると、かなり遅くなります。
      汎用的なデータ形式としての「ポリゴン」は一つの平面上に載る必要がありますが、「1ストリップの個々の三角形」は平面に載る必要はないので、「いかに複数のポリゴンを一つのストリップに統合できるか」がキモ。
      でも、単なるトライアングルストリップではなく、「凸な」が重要なので、自動変換がかなり難しい。もう、手作業の職人芸の世界です。
      #立方体をストリップ1個で表現できてたときはちょっと感動した覚えが…(同僚が紙で立方体作っていろいろ線を引いて、パズルを解くノリで見つけてました)

      親コメント
      • 独自APIを一般には非公開にしていたから、素性が謎かった印象。
        ナントナク、大きいポリゴンを多用する場面のみ有利だった気がするする。

        親コメント
      • by Anonymous Coward on 2017年04月06日 0時45分 (#3188708)

        Triangle stripのほうが頂点データのサイズが小さくなるから効率いいのは今も昔も変わらないよ。大抵のGPUでそう。
        「1ポリゴン=1ストリップ」にすると遅くなるのも縮退三角形分無駄になってTriangle listよりサイズ大きくなるので当然

        親コメント
        • 凸な」トライアングルストリップ、というのがポイントなんですよ。

          アルゴリズムが非公開なので使ってみての推測になりますが、
          「ストリップ」単位でプライオリティ法?的な描画をしているみたいです。
          普通のZバッファなら凹なストリップでも問題ありませんが、PowerVRでは凹なストリップを描画させると描画が崩れます。

          普通のGPUでトライアングルストリップやトライアングルファンを使うのは、(頂点インデックスを使う上では)単にデータ量削減の効果ぐらいしかありません。
          一方、PowerVRはそんな生やしいものではなく、描画時間があまり「頂点数」には依存せず、「ストリップ数」に比例する感じになります。
          それこそ、「頂点数が増えてもいいからストリップ数を減らす」方が有効。しかしながら、「凸な」という条件があるので、無関係なポリゴンを縮退三角形でつないでストリップにすることもできません。

          とにかくまあ、普通の(≒Zバッファベースの)GPUとは明らかに毛色が異なる代物でした。

          親コメント
          • by Anonymous Coward

            >PowerVRでは凹なストリップを描画させると描画が崩れます。
            モバイルGPUになってからのPowerVR(今もTBDR)しか触ったことないけど、それは単にその時のPowerVRの実装が腐ってたか貴方の実装がバグってただけじゃない?

            >「頂点数が増えてもいいからストリップ数を減らす」方が有効。
            これはちょっと意味が解らない。ストリップ数を減らすって何を指してるの?ドローコールの話ならPowerVRに限らず常識だよ。そうでないなら頂点増やして減らせる物が何であるか解らない。
            で、ストリップ数というのがドローコールの事を言っていたのであれば、1ポリゴン=1ドローコールとか遅くて当たり前。

            • > その時のPowerVRの実装が腐ってたか貴方の実装がバグってただけじゃない?

              実装が腐ってたのではなく、当時はそういう制限をかけることで、「省メモリで高速なレンダリング」を実現していたんです。「凸な」というのは、SDKに明示的に指定されていました。

              > ストリップ数というのがドローコールの事を言って

              いいえ。PowerVR の独自API(SGL)では、一回のドローコールで複数のトライアングルストリップを渡すことができます。
              (ていうか、指定できるのはトライアングルストリップリストだけで、トライアングルファンやトライアングルリストを渡して描画するAPIはありません。)
              まあ、普通のGPUでトライアングルリストを渡すのと同じような使い方ですね。

              そして、頂点数(一回のドローコールのデータ量)が同じでも、その中のストリップ数が少ない方が速かったんです。

              親コメント
            • by Anonymous Coward

              いったいどうしたら知らないものに対してここまで偉そうに知ったかぶれるんだろう。

          • by Anonymous Coward

            > 普通のZバッファなら凹なストリップでも問題ありませんが、PowerVRでは凹なストリップを描画させると描画が崩れます

            掛かってるタイルの判定に失敗するからだしょ。

          • by Anonymous Coward

            ポリゴン表面の向きを利用した隠面処理をやってるんですかね
            単純計算で半分位のポリゴンは描画を省略できるので早くなるでしょう

            • > ポリゴン表面の向きを利用した隠面処理をやってるんですかね

              表向きのポリゴンだけを描く「裏面除去」は、「閉じた形状」を描画する際に有効ですが、それだけだと「凸な」という制限をする必要はありません。凹でも閉じた形状なら、裏面除去は「描画データ量の削減」という点では有効です。

              「凸な形状」の特徴は「表側のポリゴン(裏面除去後の描画対象ポリゴン)同士が重なることがない」ことにあります。
              「ある一つの凸な形状」の描画だけを見れば、単純に「表向きの全ポリゴンを描画すればいい」ということになり、隠面消去する必要はないのです。

              凹な形状だと、例えば

                    I  H
              視線  A/\/\G
               → B|    |F
                  C\__/E
                     D

              という形状の角柱(の断面図。A~Iはそれぞれがポリゴン)を描画するときに、表側のポリゴンだけ抽出すると

              視線  A/ H/ 
               → B|    
                  C\   

              という4ポリゴンを描画することになり、「AとHではAが手前」という判定が必要になりますが、
              凸な形状だと、例えば

                     H
              視線  A/ ̄ ̄\G
               → B|    |F
                  C\__/E
                     D

              という形状を描画するときに、表側のポリゴンだけ抽出すると

              視線  A/  
               → B|  
                  C\   

              という3ポリゴンを描画することになり、重なりが無いので前後判定は不要です。

              凸な形状にはそういう特徴があるため、「凸な形状(ポリゴン群)」内のポリゴン間での前後判定は不要で、複数の「凸な形状」を描画する描画処理全体では、「凸な形状」間の前後判定だけで隠面消去ができるようになります。
              実際には「凸な形状」同士の交差を考えると一筋縄ではいかないのですが、うまくはまれば大幅に前後判定の比較処理を減らすことができます。

              親コメント
        • by Anonymous Coward on 2017年04月06日 2時47分 (#3188736)

          PS2辺りまでの「とにかく流れてきた三角形を速く描くことだけがGPUのお仕事」だった時代だとtriangle strip至上なんだけど、
          最近はシェーダーでなんでもかんでも頂点を弄るのでstrip化しておけばいいってもんでもないらしい。

          親コメント
        • by Anonymous Coward

          Triangle stripのほうが頂点データのサイズが小さくなるから効率いいのは今も昔も変わらないよ。大抵のGPUでそう。 「1ポリゴン=1ストリップ」にすると遅くなるのも縮退三角形分無駄になってTriangle listよりサイズ大きくなるので当然

          私もそう思ってましたが、最近のGPUは頂点キャッシュヒット率を気にした方が良いと同僚に指摘されました。

      • by Anonymous Coward

        PowerVRというとA5(A列車で行こう5)の専用版しか印象にないんですが、確かに通常版より低スペックなPCで動作してました。

        まだ生き延びてるのがあるいみすごいですよね

      • by Anonymous Coward

        まったくですよ。
        Voodooがあっさり逝って、PowerVRが大成功するとか当時は思いもしなかった。

      • by Anonymous Coward

        PCで使われていた頃のPowerVRと、いまというかモバイルGPUのPowerVRは中身ほぼ別物ですよ。
        いまのPowerVRは普通にZバッファ法で描画していて、タイルキャッシュというタイル単位に切り出したフレームバッファとZバッファをGPUに持つようなアーキテクチャになってます。
        タイルの描画をGPU内で済ませてからメモリに書き出して次のタイルの処理に移るという感じでバスへのアクセスが少ないため、バスの遅いモバイル機器に向いています。

        まあディファードシェーディングのようにマルチパス描画が一般的に使われるようになってきたので、メリットが薄れつつあるのは否めないですが。

長期的な見通しやビジョンはあえて持たないようにしてる -- Linus Torvalds

処理中...