Pixi.js: gl-matrixず芋なされたすか

䜜成日 2017幎06月30日  Â·  39コメント  Â·  ゜ヌス: pixijs/pixi.js

これは異端かもしれたせんが、私はここにアむデアを投げかけ、人々に血たみれの殺人を叫ばせたす...オブゞェクトベヌスではなく配列ベヌスの行列で暙準化する可胜性を考えたこずがありたすか WebGLは、ほずんどの頂点/テクスチャ/その他のAPIに配列を想定しおいたす。 プレヌンな叀い配列たたはネむティブ配列を暙準化する既存の゚コシステムモゞュヌルもたくさんありたす䟋https//github.com/toji/gl-matrix。倚くのブラりザヌがフラグの背埌でハヌドりェアSIMDをサポヌトしおいるこずを考えるず、gl-matrixは玠晎らしいでしょう。 、および間もなく利甚可胜になる予定です実際、gl-matrixは珟圚これを内郚的にサポヌトしおいたす。

これはpixiの倧芏暡なパラダむムシフトであり、䞋䜍互換性を完党に壊すこずになるず思いたす...それでも、これを捚おお、人々がどう思うか、そしお圌らがそのアむデアをどれだけ/少し嫌うかを芋たかったのです;

最も参考になるコメント

@GoodBoyDigital倚分あなたが正しいず思いたす。 私の友人倫人に頌る。 グヌグル、私はこれに出くわしたした

https://stackoverflow.com/questions/15823021/when-to-use-float32array-instead-of-array-in-javascript

最高評䟡の回答珟圚44祚は合理的で関連性があるようです。

党おのコメント39件

1SIMDは死んでいたす。 https://github.com/rwaldron/tc39-notes/blob/a66df6740eec3358d5e24f81817db99d6ee41401/es8/2017-03/mar-21.md#10if -simdjs-status-update

2単玔な6぀のフィヌルド「a、b、c、d、tx、ty」は、Float32Array9行列よりもはるかに優れたパフォヌマンスを発揮したす。 カントはテストぞのリンクを提䟛したすが、私ず@GoodBoyDigitalの䞡方がすでにそれを統合しようずしたした。

3JSは倍粟床を実行したす。これは、倧きな座暙で動䜜するアプリにずっお重芁です。 グラフィックスずスプラむトの「プロゞェクションxトランスフォヌム」は、JS偎に配眮するこずをお勧めしたす。

私はv5でFloat32Array9を䜿甚しおいたす。これは、jsperfテストでは、同じパフォヌマンスではないにしおも類䌌しおおり、toArrayや転眮操䜜を行う必芁がありたせん。

https://github.com/pixijs/pixi.js/blob/455c059e8d155c1d9a05fc2ece2c02b3bdf8bf84/plugins/core/src/math/Matrix.js

gl-matrixはSIMDIvanが述べたようにデッドスペックですを持っおいたので有益ですが、それらの実装にも欠点がありたす。 3x3行列 Float32Array(9) をGPUにヒットさせたいのですが、蚈算時間を節玄するために、2D行列であるかのように操䜜を実行したす。 gl-matrixは、そのための適切なメカニズムがありたせん。

v5バヌゞョンは、GPUに盎接アップロヌドできるストレヌゞを䜿甚するだけでなく、関心のある2Dパヌツでのみ動䜜したす。 たた、SharedArrayBuffersやその他の最適化を䜿甚できるように蚭定されおいるため、Webワヌカヌにより倚くの䜜業を行うこずができたす。 それでどこたで到達できるかを芋おいきたす。

@englercj䞀貫性を保぀ために、倚くの堎所でMath.froundを䜿甚する必芁があるのではないかず思いたす。 perfFloat64Arrayを詊しおください。

Float64Arrayにするこずもできたすが、アップロヌドするには単粟床にダりンサむズする必芁がありたす。 GPUにアップロヌドするずきは、珟圚float32を䜿甚しおいるこずにも泚意しおください。 したがっお、蚈算を2回実行しおから、1回に切り捚おたす。 これは、すべおを1぀で行うよりも正確かもしれたせんが、アップロヌドするデヌタ型ず䞀貫性を保぀ように努めたいず思いたす。 残念ながら、これはGL 4.0たでは単粟床を意味し、WebGL2はGLES3.0のみです:(

マトリックスのアップロヌドがボトルネックになるこずはありたせんでした。これらの堎所では「uniform3fv」を䜿甚したす。これは簡単な操䜜ではなく、その埌にdrawCallが続き、ほずんどの堎合、倧きなバッファヌのアップロヌドが続きたす。 重いpixiアプリは、フレヌムごずに玄400回のドロヌコヌルしか実行しおいたせん。

倧きな座暙でナヌザヌの問題に遭遇した埌、アップロヌドするたですべおを倍粟床で保存するこずを奜みたす。

たた、「a、b、c、d、tx、ty」衚蚘は、「0,1,3,4,6,7」よりも曞き蟌みず読み取りが簡単です。 脊怎でも䜿甚され、その䞊に非垞に掗緎された倉換がありたす。 マトリックスに切り替えるず、埌でコヌドをチェックするのはそれほど簡単ではありたせん。 行列挔算を想像するのが難しい人もいたすが、私はそれらを簡単に読みたす。

UPD。 たた、これは行列の倉換以䞊に圹立぀ず思いたす https 

UPD2。 しかし、3D倉換の堎合、Float32Array16の方が優れおいるので、反察する぀もりはありたせん。

私の投祚は、最高のパフォヌマンスを提䟛するものに行きたす。 最埌に、配列䞊のオブゞェクトを䜿甚しおチェックした方が高速でした。 それがただ本圓かどうかは100わかりたせんが、それはおそらく倉わったかもしれたせん

3Dの堎合、䞻にGPUに倧量にアップロヌドされるため、gl-matrixスタむルが奜きです。 Pixiでは、これは䞀般的には圓おはたりたせん。 ほずんどの操䜜はjsランドで行われたす䟋スプラむトバッチャヌ。

https://jsperf.com/obj-vs-array-view-access/1

これが私が行ったテストです。 オブゞェクトは、方法遅い通垞の配列よりもどちらも、Float32Arrayよりも遅いですuniform3fvは通垞のArrayオブゞェクトを受け入れるので、それに切り替える必芁がありたす。

線集 Array結果はたぐれだったようですが、再珟できたせんか

私の投祚は、最高のパフォヌマンスを提䟛するものに行きたす。
最埌に、配列䞊のオブゞェクトを䜿甚しおチェックした方が高速でした。

それはずおも興味深いです。 基になるvmは、オブゞェクトのセマンティクスが倧幅に削陀される可胜性があるこずを知っおいるため、倚くの最適化を実行できるはずなので、オブゞェクトが玔粋な数倀配列よりも高速であるずいうのは盎感に反しおいるようです。 _なぜ_オブゞェクトの方が速いのか、䜕かアむデアがあれば知りたいのですが。

私のコンプi7、Windows 10からの関連する結果

Chrome 59

image

Firefox 54.0.132ビット

image

Microsoft Edge 40.15063.0.0

image

Array方が速いずいう私のクロムの結果はたぐれだったようです。それが䜕であったかはわかりたせんが、今は再珟できたせん。 箄5,000侇ops / sですが、以前に行った1回の実行では5億ops / sでした。 倉...

いずれにせよ、Float32Arrayメンバヌは、すべおのブラりザヌでオブゞェクトず同じ速床たたはオブゞェクトよりも䞀貫しお高速です。 それが私がそれを切り替えた理由です、それは以前ず同じ速床たたはより速いですが、今ではアップロヌドのために配列を転眮しお埋めるこずを避けおいたす。

Float64でも同じこずができたすか :)

私は、drawcallごずに玄1぀以䞊の行列挔算よりもコヌド品質に関心がありたす。

たた、反転はあたり䜿甚したせん。 updateTransformが問題です。

私は、drawcallごずに玄1぀以䞊の行列挔算よりもコヌド品質に関心がありたす。

Float64Arrayのコヌド品質はどのように高くなっおいたすか 粟床が䞊がるこずは理解しおいたすが、ずにかく単粟床に枛らすこずを考えるず、なぜそれがそれほど重芁なのかを理解できたせん。

たた、反転はあたり䜿甚したせん。 updateTransformが問題です。

これは、デヌタストレヌゞの読み取り/曞き蟌みのベンチマヌクであり、その間の倀に察しお実行される操䜜は無関係です。

私は、drawcallごずに玄1぀以䞊の行列挔算よりもコヌド品質に関心がありたす。

私もこれに同意したす。 配列ベヌスの行列、点、ベクトルの「暙準化」は、実際にはパフォヌマンスよりもコヌド品質の向䞊に぀ながる可胜性があるこずを考慮しおください...人気のあるjs行列/ベクトルラむブラリの再利甚ず、人気のあるレンダリングモゞュヌルずの盞互運甚性の向䞊を怜蚎したす倧きなコヌド品質の勝利になるために。

これは、デヌタストレヌゞの読み取り/曞き蟌みのベンチマヌクです。
関係のない䞭間の倀に察しお実行される操䜜。

私はあなたが䞡方ずも正しいず思いたす。 これは、デヌタストレヌゞの読み取り/曞き蟌みの䞀般的なベンチマヌクです。 しかし、Ivanには本圓に良い点がありたす。 updateTransform()が圧倒的な操䜜である堎合、それを確認するこずは説埗力がありたす。

私は䞀般的にマむクロベンチマヌクに぀いお心配しおいたす。 これらの静的デヌタセットを䜿甚するず、これらのテストでjavascriptvmsのコンパむラ最適化を誀っお利甚しおしたうのではないかず思いたす。 実際のテストを実行するこずは、はるかに啓発的ですセットアップにはるかに倚くの䜜業が必芁になるずいう犠牲を払っお。

私もこれに同意したす。 配列ベヌスの行列、点、ベクトルの「暙準化」は、実際にはパフォヌマンスよりもコヌド品質の向䞊に぀ながる可胜性があるこずを考慮しおください...人気のあるjs行列/ベクトルラむブラリの再利甚ず、人気のあるレンダリングモゞュヌルずの盞互運甚性の向䞊を怜蚎したす倧きなコヌド品質の勝利になるために。

私は "a、b、c、d、tx、ty"倍粟床行列を䜿甚しおおり、アップロヌド甚にfloat32arrayに倉換され、 "posX、posY、pivotX、pivotY、scaleX、scaleY、 ShearX、shearY、rotZ "。 ずにかくフォヌクで䜿甚したすが、マスタヌpixiでも行列配列を扱いたくないです。 それが私の暙準です。

たた、jsのvec数孊に1぀たたは2぀の暙準を䜿甚させるこずが可胜かどうかも疑問です。

Float64Arrayのコヌド品質はどのように高くなっおいたすか 粟床が䞊がるこずは理解しおいたすが、ずにかく単粟床に枛らすこずを考えるず、なぜそれがそれほど重芁なのかを理解できたせん。

updateTransformでは、カメラ倉換にスプラむト倉換スクロヌル甚を掛けたす。 結果は小さい堎合にのみ画面に収たるため、最終的には数倀は小さくなりたすが、スプラむトの䜍眮ずカメラの䜍眮の䞡方が倧きくなる可胜性がありたす。 ナヌザヌ偎の゜リュヌション

1圌の偎ですべおを蚈算したす。 PIXIは比范的小さな座暙のみを扱いたす。
2䞖界を倧きな座暙を持぀チャンクに分割したす。スプラむトには比范的小さな座暙がありたすが、サブピクセルカメラでは機胜したせん=>カメラには倧きな座暙ず小さな座暙も必芁です。

倧きなプロゞェクトの堎合はナヌザヌに自分の偎でそれを匷制するこずは問題ありたせんが、小さなプロゞェクトの堎合はもう1぀頭痛がしたす。

たた、jsのvec数孊に1぀たたは2぀の暙準を䜿甚させるこずが可胜かどうかも疑問です。

意味がわかりたせんが、詳しく教えおいただけたすか

意味がわかりたせんが、詳しく教えおいただけたすか

私にはできたせん、それは私には倚すぎたす。

䜎レベルの最適化の䞡方で異なる経隓を持぀人々がいたす。 および蚀語構造、DSL-s。 あるレベルで私たち党員を満足させる暙準が必芁です。

過去2幎間で、異なる倉換を䜿甚しおpixiの2぀のフォヌクv3ずv4甚を䜜成したした。独自の高床な倉換を備えた「pixi-spine」を扱っおおり、3番目のフォヌクを䜜成しおいたす。 「過去のivan」の芳点からは、配列は最も単玔な圢匏であり、「gl-matrix」があるため、最適です。

64ビットを維持するこずが重芁であるずいう@ivanpopelyshevに同意したす。 フレヌムごずにバッファを䜜成およびコピヌせずに、これを効率的に行う方法を理解しようずしおいたす。

たぶんそれをFloat64Arrayずしお保存し、アップロヌドするずきにFloat32Arrayにコピヌしたす。 これにより、少なくずも、型付き配列をストレヌゞバッキングずしお䜿甚できるようになりたす。これにより、Webworkerずの間で簡単にコピヌできるようになりたす。

Float64Arrayは、0,1、3,4、6,7をX、Y、translateずしお䜿甚するこずを芚えおおく必芁がありたす。

すべおの興味深いスタッフ、私は私たちが提案した゜リュヌションを実際のpixiシナリオバニヌマヌクのようなものでベンチマヌクするこずを切望しおいたす。

この分野での私の経隓では、私ず@ivanpopelyshevが最埌にバニヌマヌクのgl-matrixに切り替えたずき、実行速床が倧幅に遅くなっおいるこずがわかりたした3分の1遅いように

それは少し前のこずでしたが、私はここで間違っおいるこずを本圓に望んでいたす
速床差が無芖できるようになった堎合、䞊蚘の提案されたルヌトぱヌスになるず思いたす。

Pixiは高速ですP゜リュヌションに完党にコミットする前に、テストを確認したしょう。

Float64Arrayのベンチマヌクはただ必芁です。 この実装は私には受け入れられたすが、個人的にはフォヌクで叀いマトリックスを䜿甚したす。 たた、互換性のためだけにプロパティを远加するこずを忘れないでください。

もう䞀぀は@mreinstein、私は芚えおいないstandartsの䞀぀はPaperScript、paper.jsのためにその蚀語の特別で、蚀語に盎接小数点挔算を远加したす。 JSにシンタックスシュガヌがもっずある堎合は、そのようなものも䜿甚したす。

reこの曎新されたバニヌマヌクに぀いお私が手助けできるこずはありたすか これで時間を寄付できおうれしいです。

ここで起こっおいるパフォヌマンスず䞀緒にフォロヌするこずに非垞に興味がありたす。 結果に関係なく。 配列ベヌスのものがただかなり遅いこずになった堎合、私はその背埌にある_理由_に぀いお本圓に興味がありたす。

泚意すべき点パフォヌマンステスト... chromeのv8は最近v59でタヌボファンず呌ばれるv8ぞのかなり劇的な倉曎をリリヌスしたした。 おそらく、パフォヌマンスが倧幅に向䞊しおいたす。

https://v8project.blogspot.com/2017/05/launching-ignition-and-turbofan.html

タヌボファンが存圚する前のバヌゞョンず珟圚のバヌゞョンで曎新されたバニヌマヌクを実行するのは興味深いかもしれたせん。

@GoodBoyDigitalベンチを曎新しお

https://jsperf.com/obj-vs-array-view-access/1
image

゚ッゞ䞊でのみ、オブゞェクトの速床はFloat64Arrayず䞀臎/超過し、実際に接近しおいたす。

私は自分の環境でこれをテストしたしたが、同様の結果が埗られたした...䞀䜓䜕ですか Float64配列の読み取り/曞き蟌みが同等のFloat32配列操䜜よりも倧幅に高速なのはなぜですか 頭に浮かぶ唯䞀のこずは、64ビットのフロヌトが単語の境界に敎列するこずです。 私は圓惑しおいたす。

@mreinsteinのオファヌを

最良の方法は、 pixiをフォヌクしおから、倉換をgl-matrixたたは

次に、埮調敎されたバヌゞョンができたら、ここでパフォヌマンスをテストできたす https 
さたざたな配列タむプをいじるこずができたす。

@englercjそれは玠晎らしい男です これらの結果を確実に芋るこずは励みになりたす。 v5バヌゞョンはバニヌマヌクを回転させるこずができる状態に近いですか

@mreinsteinはただの予感です、64ビット-> 32ビットからの倉換に関係しおいるのではないかず思いたす
jsの数倀は64​​ビットですよね

@GoodBoyDigital倚分あなたが正しいず思いたす。 私の友人倫人に頌る。 グヌグル、私はこれに出くわしたした

https://stackoverflow.com/questions/15823021/when-to-use-float32array-instead-of-array-in-javascript

最高評䟡の回答珟圚44祚は合理的で関連性があるようです。

あなたがいく぀かのパフォヌマンステストで私たちを助けるこずができれば

了解したした。喜んでお手䌝いさせおいただきたす。 :)

最善の方法はフォヌクピクシです

@GoodBoyDigital @englercjこの時点でフォヌクするのに最適なブランチは䜕ですか

次に、倉換をgl-matrixたたは@englercj行列クラスに眮き換えたす。
この堎合、゚ンゞン党䜓ではなく、スプラむトバッチも機胜させる必芁がありたす。

これに぀いおもう少し詳しく説明しおいただけたすか パフォヌマンスベンチを実行するためだけに゚ンゞン党䜓をgl-matrixに倉換したくありたせん... https//github.com/pixijs/bunny-markにスプラむトバッチのものがありたせんバニヌが远加されるルヌト芁玠ずしおのPIXI.Container。 pixi.container、pixi.spriteから始めお、そこから䟝存関係ツリヌを逆方向に移動しお、倉換芁玠を眮き換える必芁があるすべおの堎所を芋぀ける必芁があるず蚀っおいたすか 同意しないず蚀っおいるのではなく、䞍芁な䜜業を最小限に抑えるための戊略が正しいこずを確認したいだけです。

updateTransformには、次の2぀の行列挔算がありたす。

  1. 䜍眮、ピボット、スケヌル、回転からの構成-改善するこずはできたせん。
  2. 芪行列による乗算-改善するこずができたす。

Float64Arrayに裏打ちされた叀い「a、b、c、d、tx、ty」プロップで行列クラスを䜜成し、updateTransformを曞き盎すこずをお勧めしたす。 たた、 @ mreinsteinはコアになるのに十分なものを䜜成したした。圌を远加するこずをお勧めしたす。そうすれば、圌はブランチにアクセスしおファヌムを構築できたす。

だから圌は枝にアクセスしお蟲堎を建おるこずができたす。

誰もがそれにアクセスでき、fork + PRがすべおを行いたす。

バニヌマヌクでどのような結果が埗られるのか興味がありたす。デフォルトの100kバニヌでChromeからさたざたなブランチ開発、リリヌス、その他を詊しおみるず、䞀貫しお10〜16fpsが埗られたす。 8.75秒を超えお実行されおいるコヌドでパフォヌマンス分析を実行する

screen shot 2017-07-02 at 11 58 03 am

ほずんどすべおの時間はjavascriptの呌び出しに費やされたす。

screen shot 2017-07-02 at 11 57 50 am

javascriptに費やされたこの時間のうち、時間の倧郚分は実際にはSprite.calculateVertices()に費やされおいたす。 TransformStatic.updateTransform()費やされるよりも4倍倚い

Firefoxでは、フレヌムレヌトが玄2倍になりたすが、費やした時間の内蚳は䌌おいたす。 calculateVertices()は、䞡方のブラりザで倧郚分の時間を占めたす。 これは予想されたすか バニヌマヌクの実行でも同様の結果が埗られおいたすか

これはバニヌに期埅されおいたす。 そしお、私たちが話しおいる行列挔算は、乗算甚のupateTransformずcALLごずに1回のflushの2぀の堎所で実行されたす。 倧芏暡では問題ありたせん。

よくわかりたせん。 :(そのベンチマヌクのパフォヌマンスをどのように知るこずができたすかそれは䞻に達成された玔粋なfpsに基づいおいるずいう印象を受けたした。それが本圓なら、私のフレヌムレヌトは頂点の蚈算によっお_厳しく_抑制されおいたす。貌り付けた最初の図を芋おください。䞊蚘では、レンダリングは合蚈フレヌム時間のごく䞀郚です。頂点ず倉換の曎新は合蚈フレヌム時間を圧倒しおいたす。

それが誀りであり、fpsが私のpixiビルドのパフォヌマンスの枬定倀ではない堎合、特定のビルドを枬定するためにどのような基準を䜿甚したすか

CPUたたはGPU偎のいずれかでスロットルできたす図には瀺されおいたせん。

FPSが60をはるかに䞋回っおいるが、「アむドル」が倧きい堎合、぀たりGPUです。

アむドル状態が小さい堎合は、そのCPU。

computeVerticesには、内郚に行列挔算がありたす。4぀のコヌナヌに行列を乗算するだけです。

TSフォヌクのほんの小さなアむデア行列タむプのプロパティをむンラむン化する倉換を远加したす。 TSにはただそのような倉換がないのは残念です:(

行列倉数に泚釈を付ける方法を芋぀ければ、babelでも実行できるず思いたす。

もう䜕が起こっおいるのか理解できたせん。

Alt text

芚えおおくべきこずそもそもこのベンチマヌクの目暙は、オブゞェクトずgl-matrixの䜿甚が、予想どおり、パフォヌマンスに倧きな打撃を䞎えるかどうかを確認するこずでした。 ベンチマヌク結果の違いに関係なく、オブゞェクトのパフォヌマンスはほずんどの配列の堎合よりも悪くないこずを䞀貫しお瀺しおいるようです。

たた、バニヌマヌクのプロファむルを䜜成したので、ここでは䞀般的なpixiに関するパフォヌマンスの結論を匕き出すこずは避けたいず思いたす。 Chromeでは、プログラムの合蚈時間の50以䞊がSprite.calculateVertices() 40ishに費やされ、続いおTransformStatic.updateTransform() 11ishFirefoxの実行速床は2倍になりたすが、その比率はこれらの2぀の機胜に費やされた時間の割合は䟝然ずしお䞀貫しおいたす。

トピックから離れすぎないようにしたいのですが、このバニヌマヌクプロファむリングを行う際に、es5ゲッタヌ/セッタヌの䜿甚がクロムのパフォヌマンス䜎䞋ず関係があるのではないかず考え始めおいたす https //jsperf.com/es5-getters-setters-versus-getter-setter-methods/10

ここでたるみにぶらぶらしおいる人はいたすか ここでメッセヌゞを枡すよりも、半リアルタむムでチャットする方が簡単だず思いたす。

@mreinsteinに䜕をメヌルしたすか たるみにあなたを招埅したす👍

@englercjの発蚀に基づくず、明らかにこれは行っおいたせん。 閉鎖。

ほんの小さな曎新Float64Arrayに基づいお、 https//github.com/pixijs/pixi-projection/blob/master/src/Matrix2d.tsに3x2ではなく3x3マトリックスがあり

このスレッドは、閉じられた埌に最近のアクティビティがないため、自動的にロックされおいたす。 関連するバグに぀いおは、新しい問題を開いおください。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡