Godot: ほずんどの堎合、最も遅いデヌタ構造を䜿甚したす。

䜜成日 2018幎11月26日  Â·  61コメント  Â·  ゜ヌス: godotengine/godot

私はgodotのコヌドを確認しおいたしたが、コアデヌタ構造に至るたで、あらゆる皮類のCPU偎のパフォヌマンスを完党に無芖しおいるこずがわかりたした。 リンクリストが最新のPCで䜿甚できる最も遅いデヌタ構造である堎合、どこでもリストを䜿甚したす。 特に小さなサむズの構造では、他のほずんどすべおのデヌタ構造が高速になりたす。 ラむトリストやレンダラブルのリフレクションキャプチャなど、最倧8぀のラむトのスタック配列を䞎えるのではなく、毎回3぀のポむンタを栌玍するずいう点で、特にひどいものです。それ以䞊。

RID_Ownerがハッシュマップたたはスロットマップである可胜性があるツリヌである堎合も同じです。 たた、カリングのOctree実装にもたったく同じ問題がありたす。

リンクリストの完党か぀絶察的な乱甚の背埌にある蚭蚈意図ず、コヌド内のいたるずころにある恐ろしいパフォヌマンスポむンタの重いデヌタ構造に぀いおお聞きしたいず思いたす。 それは特定の理由によるものですか ほずんどの堎合、配列のリンクリストを実行する「チャンク」リンクリストは、同じコヌドでパフォヌマンスを自動的に向䞊させたす。

これらのデヌタ構造を䜿甚するず、コヌドの適切なチャンクでのあらゆる皮類の「簡単な」䞊列凊理が防止され、キャッシュが完党に砎棄されたす。

より良いデヌタ構造を䜿甚するために、内郚の䞀郚をリファクタリングする抂念実蚌の実装に取り​​組んでいたす。 珟圚、珟圚のoctreeをバむパスし、オプションの䞊列凊理を備えたフラット配列を䜿甚するカリングコヌドの曞き盎しに取り組んでいたす。 tps-demoをベンチマヌクずしお䜿甚し、結果を返したす。実際、その八分朚で25レベル深くなるようにベンチマヌクしたした...

もう1぀の嬉しいこずに、私はコヌドスタむルの品質に非垞に感銘を受けおおり、すべおがわかりやすく、非垞によくコメントされおいたす。

discussion enhancement core

最も参考になるコメント

あなたは興味があるかもしれたせん。 私はかなり長い間掟手なフォヌクに取り組んできたした。 珟圚の結果は次のずおりです。
4コアのIntelCPUずGTX1070を搭茉した倧型ゲヌミングノヌトパ゜コンでキャプチャ
通垞のgodot
image

https://github.com/vblanco20-1/godot/tree/ECS_Refactorの私のフォヌク
image

どちらのプロファむルでも、赀は本質的に「GPUを埅぀」ものです。 openglでのドロヌコヌルが倚すぎるため、珟圚ボトルネックになっおいたす。 バルカンやレンダラヌ党䜓を曞き盎すこずなく、カントは本圓に解決されたす。

CPU偎では、13ミリ秒フレヌムから5ミリ秒フレヌムになりたす。 「高速」フレヌムは5.5ミリ秒から2.5ミリ秒になりたす
「トヌタルフレヌム」偎では、13ミリ秒から8〜9ミリ秒になりたす
〜75 FPS〜〜115 FPS

より少ないCPU時間=ゲヌムプレむにより倚くの時間を費やすこずができたす。 珟圚のgodotはCPUでボトルネックになっおいるため、ゲヌムプレむに費やす時間が長くなるずFPSが䜎くなりたすが、フォヌクはGPUにバむンドされおいるため、CPUは「無料」であるため、FPSを倉曎せずにゲヌムプレむロゞックをさらに远加できたす。かなり長い間すべおのフレヌム。

godotが最新のC ++をサポヌトし、非垞に安䟡な「小さな」タスクを可胜にするマルチスレッドシステムを備えおいれば、これらの改善点の倚くはgodotにマヌゞ可胜です。
最倧の利点は、動的オブゞェクト25013でマルチスレッドシャドりずマルチスレッドラむトマップの読み取りを実行するこずによっお行われたす。 これらは䞡方ずも同じように機胜したす。 レンダラヌの他の倚くの郚分もマルチスレッド化されおいたす。
他の利点は、godotよりも10倍から20倍速いOctreeであり、カリングリストを繰り返す代わりに、深床プリパスずノヌマルパスの䞡方のレンダリングリストを䞀床に蚘録するなど、レンダリングのフロヌの䞀郚が改善されおいたす2。時間、およびラむト->メッシュ接続の動䜜方法の倧幅な倉曎リンクリストなし

珟圚、TPSデモ以倖のテストマップを探しおいるので、他のタむプのマップでより倚くのメトリックを䜿甚できたす。 たた、これらすべおがどのように機胜するかを詳现に説明する䞀連の蚘事を曞く぀もりです。

党おのコメント61件

誰がパフォヌマンスを必芁ずしたすか ドダ顔

あなたが䜕を枬定するのか知りたいです。

それで、これは、Godotの単玔なLight2Dノヌドがコンピュヌタヌを焌き付けるこずができる理由を説明できたすか

@Ranollerそうは思いたせん。 悪いラむティングパフォヌマンスは、Godotが珟時点で2Dラむティングを実行する方法に関連しおいる可胜性がありたす。すべおのスプラむトをn回レンダリングしたすnはそれに圱響を䞎えるラむトの数です。

線集23593を参照

明確にするために、これはコヌド党䜓のCPU偎の非効率性に関するものです。 これは、godot機胜やgodotGPUレンダリング自䜓ずは䜕の関係もありたせん。

@ vblanco20-1ちょっずした接線で、あなたず私は、代わりにECS゚ンティティずしおモデル化されおいるノヌドに぀いお話したした。 トリックは、ツリヌず埐々に䞊行しお機胜する新しいentモゞュヌルを䜿甚しおgodotの機胜ブランチを実行するこずであるかどうか疑問に思いたす。 get_treeやget_registryのように。 entモゞュヌルはおそらくツリヌ/シヌンの機胜の80を芋逃したすが、テストベッドずしお、特に倚数のオブゞェクトを含む倧きな静的レベルの䜜成カリング、ストリヌミング、バッチレンダリングなどに圹立぀可胜性がありたす。 機胜性ず柔軟性が䜎䞋したすが、パフォヌマンスは向䞊したす。

完党なECSに進む前に私はそうするかもしれたせんが、実隓ずしおいく぀かのぶら䞋がっおいる果物に取り組みたいず思いたす。 埌で完党なデヌタ指向にしようずするかもしれたせん。

したがっお、最初の曎新

update_dirty_instances0.2〜0.25ミリ秒から0.1ミリ秒
octree_cullメむンビュヌ0.35ミリ秒から0.1ミリ秒

楜しい郚分は octree cullの代わりにアクセラレヌション構造を䜿甚せず、すべおのAABBを含むダム配列を反埩凊理するだけです。

さらに面癜い郚分は 新しいカリングは10行のコヌドです。 私がそれを平行にしたいのなら、それはラむンぞの単䞀の倉曎でしょう。

ラむトを䜿甚しお新しいカリングを実装し続け、スピヌドアップがどれだけ蓄積されるかを確認したす。

おそらく、マスタヌブランチにもGoogleベンチマヌクディレクトリを配眮する必芁がありたす。 それは怜蚌に圹立぀かもしれないので、人々はそれに぀いお議論する必芁はありたせん。

godotengine / godot-testsリポゞトリがありたすが、ただ倚くの人がそれを䜿甚しおいたせん。

新しいアップデヌト

image

Iveは、2぀のレベルで、かなり銬鹿げた空間加速構造を実装したした。 フレヌムごずに生成するだけです。さらに改善するず、再䜜成するのではなく、改善しお動的に曎新するこずができたす。

画像では、異なる行は異なるスコヌプであり、色付きのブロックはそれぞれタスク/コヌドのチャンクです。 そのキャプチャでは、八分朚カリングず私のカリングの䞡方を䞊べお行っお、盎接比范したす

これは、加速構造党䜓を再䜜成する方が、単䞀の叀い八分朚カリングよりも高速であるこずを瀺しおいたす。
たた、それ以䞊のカリングは、珟圚の八分朚の玄半分から3分の1になる傟向がありたす。

私のダム構造が珟圚の八分朚よりも遅いずいうケヌスは、最初の䜜成のコストを陀いお、1぀も芋぀かりたせんでした。

もう1぀の利点は、非垞にマルチスレッドに察応しおおり、䞊列凊理を䜿甚するだけで、必芁なコア数に拡匵できるこずです。

たた、メモリを完党に連続しおチェックするので、それほど面倒なこずなくSIMDを実行できるはずです。

もう1぀の重芁な詳现は、珟圚のoctreeよりもはるかに単玔で、コヌド行がはるかに少ないこずです。

あなたはゲヌム・オブ・スロヌンズの終わりよりも倚くの誇倧宣䌝を匕き起こしおいたす...

image

アルゎリズムを少し倉曎しお、C ++ 17䞊列アルゎリズムを䜿甚できるようにしたした。これにより、プログラマヌは、䞊列たたは䞊列゜ヌトを実行するように指瀺するこずができたす。
メむンの錐台カリングで玄x2のスピヌドアップがありたすが、ラむトの堎合は以前ずほが同じ速床です。

私のカラヌは、メむンビュヌのgodotoctreeよりも10倍高速になりたした。

倉曎点を確認したい堎合、䞻な重芁事項は次のずおりです。
https://github.com/vblanco20-1/godot/blob/4ab733200faa20e0dadc9306e7cc93230ebc120a/servers/visual/visual_server_scene.cpp#L387
これが新しいカリング機胜です。 加速構造はそのすぐ䞊の機胜にありたす。

これはVS2015でコンパむルする必芁がありたすか コン゜ヌルは、entt \内のファむルに関する䞀連の゚ラヌをスロヌしたす

@Ranollerはc ++ 17なので、新しいコンパむラを䜿甚しおいるこずを確認しおください

ええず、Godotはただc ++ 17に移行しおいなかったず思いたすか 少なくずも私はこのトピックに関するいく぀かの議論を思い出したすか

GodotはC ++ 03です。この動きは物議を醞すでしょう。 @ vblanco20-1が䌑日を終えたら、フアンず話すこずをお勧めしたす...この最適化は玠晎らしいものであり、すぐに「これは決しお起こらないTM」を望んでいたせん。

@ vblanco20-1

octree_cullメむンビュヌ0.35ミリ秒から0.1ミリ秒

オブゞェクトはいく぀ですか

@ nem0

@ vblanco20-1

octree_cullメむンビュヌ0.35ミリ秒から0.1ミリ秒

オブゞェクトはいく぀ですか

2200幎頃。チェックが非垞に小さい堎合、godot octreeは早期に終了するため、パフォヌマンスが向䞊したす。 ク゚リが倧きいほど、godotoctreeは私の゜リュヌションず比范しお遅くなりたす。 godot octreeがシヌンの90を早期に凊理できない堎合、オブゞェクトごずにリンクリストを本質的に反埩するため、非垞に遅くなりたすが、私のシステムは、各キャッシュラむンが倧量のAABBを保持する配列の構造であり、倧幅に削枛されたす。キャッシュミス。

私のシステムは、2぀のレベルのAABB、぀たりブロックの配列を持぀こずで機胜し、すべおのブロックが128のむンスタンスを保持できたす。

トップレベルは、ほずんどがAABBの配列+ブロックの配列です。 AABBチェックに合栌した堎合は、ブロックを繰り返したす。 ブロックは、AABB、マスク、およびむンスタンスぞのポむンタヌの構造の配列です。 このようにすべおがfaaaaastです。

珟圚、トップレベルのデヌタ構造の生成は非垞に銬鹿げた方法で行われおいたす。 より適切に生成された堎合、そのパフォヌマンスははるかに倧きくなる可胜性がありたす。 128以倖の異なるブロックサむズでいく぀かの実隓を実行しおいたす。

私はさたざたな数をチェックしたしたが、ブロックあたり128は、どういうわけかただスむヌトスポットのようです。

アルゎリズムを倉曎しお「倧きな」オブゞェクトを小さなオブゞェクトから分離するこずにより、iveは、䞻にマップの䞭心を調べおいない堎合に、さらに30の速床アップグレヌドを埗るこずができたした。 これは、倧きなオブゞェクトが小さなオブゞェクトも含むブロックAABBを肥倧化させないために機胜したす。 おそらく3぀のサむズが最適だず思いたす。

ブロック生成はただたったく最適ではありたせん。 倧きなブロックは、䞭倮を芋るずむンスタンスの玄10〜20、マップの倖偎を芋るず最倧50しかカリングしないため、必芁以䞊に倚くの远加のAABBチェックを実行したす。

おそらく、珟圚の八分朚を再利甚するが、それを「平坊化」するこずで改善されるず思いたす。

䞊列実行がなくおも、私のアルゎリズムが珟圚のoctreeず等しいかそれより悪いケヌスは1぀もありたせん。

@ vblanco20-1 releaseモヌド -O3 でコンパむルされたgodotずの比范を行っおおり、通垞の゚ディタヌビルドむンデバッグ最適化がなく、デフォルトではないず思いたす。 
ばかげた質問なら申し蚳ありたせんが、スレッドにはそのこずに぀いおの蚀及はありたせん。
ずにかくいい仕事:)

@Falessそのrelease_debugは、いく぀かの最適化を远加したす。 ゲヌムを開くこずができないため、完党な「リリヌス」をテストできたせんでしたゲヌムもビルドする必芁がありたすか

カリングをさらに改善し、すべおのフレヌムを再生成する必芁をなくし、より良い空間最適化を䜜成する方法に぀いおのアむデアがありたした。 私が䜕を詊すこずができるかわかりたす。 理論的には、そのようなものは再生を削陀し、メむンカリングのパフォヌマンスを少し改善し、カリングのパフォヌマンスを倧幅に向䞊させるポむントラむト甚の特定のモヌドを備えおいるため、コストはほがれロになりたす。 「半埄内のオブゞェクト」を取埗するための安䟡なO1に倉わりたす。

それは、私の実隓の1぀がどのように機胜したかに觊発されたした。そこでは、400.000の物理オブゞェクトが互いに跳ね返っおいたす。

image

新しいカリングが実装されたした。 ブロック生成がはるかにスマヌトになり、より高速なカリングが可胜になりたした。 ラむトの特殊なケヌスはただ実装されおいたせん。
私はそれを私のフォヌクにコミットしたした

珟圚のマスタヌブランチからのビルドでそのベンチマヌクツヌルスクリヌンショットのものを実行しお、実装が珟圚の実装に察しおどれだけのパフォヌマンスを提䟛しおいるかに぀いおの参照ポむントを提䟛できるかどうか知りたいです。 私はダミヌです、うわヌ。

@ LikeLakers2スクリヌンショットで珟圚の実装ず圌の実装の䞡方を芋るこずができたす。

圌はこれをマスタヌフォヌクで走らせたした

2018幎12月12日氎曜日には、MichiRecRoom [email protected]
曞きたした

@neikeq https://github.com/neikeq説明したすか スクリヌンショットだず思いたした
投皿されたものは、投皿がどのように行われたかを考えるず、圌の実装のみでした
スクリヌンショット付きはこれたでのずころ蚀葉で衚珟されおいたす。

—
あなたがコメントしたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/godotengine/godot/issues/23998#issuecomment-446831151 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/ADLZ9pRh9Lksse9KBfWV0z5GmHRXf5P2ks5u4crCgaJpZM4YziJp
。

このトピックに関するニュヌスはありたすか

このトピックに関するニュヌスはありたすか

私はreduzず話したした。 プロゞェクトに適合しないため、マヌゞされるこずはありたせん。 代わりに他の実隓をしに行きたした。 たぶん私は埌でカリングを4.0にアップグレヌドしたす

それが本圓に有望に芋えたこずを考えるず、それは残念です。 うたくいけば、これらの問題は時間内に取り組むでしょう。

おそらくこれは4.0マむルストヌンを䞎えられるべきですか ReduzはVulkanfor 4.0での䜜業を蚈画しおいるため、このトピックはパフォヌマンスに぀いおですが、レンダリングに焊点を圓おおいたす。少なくずもOPはそうです。

@ vblanco20-1圌はそれがどのように適合しないかを蚀いたしたか c ++ 17ぞの移行のためだず思いたすか

ただし、マむルストヌンには他にも関連する問題がありたす25013

あなたは興味があるかもしれたせん。 私はかなり長い間掟手なフォヌクに取り組んできたした。 珟圚の結果は次のずおりです。
4コアのIntelCPUずGTX1070を搭茉した倧型ゲヌミングノヌトパ゜コンでキャプチャ
通垞のgodot
image

https://github.com/vblanco20-1/godot/tree/ECS_Refactorの私のフォヌク
image

どちらのプロファむルでも、赀は本質的に「GPUを埅぀」ものです。 openglでのドロヌコヌルが倚すぎるため、珟圚ボトルネックになっおいたす。 バルカンやレンダラヌ党䜓を曞き盎すこずなく、カントは本圓に解決されたす。

CPU偎では、13ミリ秒フレヌムから5ミリ秒フレヌムになりたす。 「高速」フレヌムは5.5ミリ秒から2.5ミリ秒になりたす
「トヌタルフレヌム」偎では、13ミリ秒から8〜9ミリ秒になりたす
〜75 FPS〜〜115 FPS

より少ないCPU時間=ゲヌムプレむにより倚くの時間を費やすこずができたす。 珟圚のgodotはCPUでボトルネックになっおいるため、ゲヌムプレむに費やす時間が長くなるずFPSが䜎くなりたすが、フォヌクはGPUにバむンドされおいるため、CPUは「無料」であるため、FPSを倉曎せずにゲヌムプレむロゞックをさらに远加できたす。かなり長い間すべおのフレヌム。

godotが最新のC ++をサポヌトし、非垞に安䟡な「小さな」タスクを可胜にするマルチスレッドシステムを備えおいれば、これらの改善点の倚くはgodotにマヌゞ可胜です。
最倧の利点は、動的オブゞェクト25013でマルチスレッドシャドりずマルチスレッドラむトマップの読み取りを実行するこずによっお行われたす。 これらは䞡方ずも同じように機胜したす。 レンダラヌの他の倚くの郚分もマルチスレッド化されおいたす。
他の利点は、godotよりも10倍から20倍速いOctreeであり、カリングリストを繰り返す代わりに、深床プリパスずノヌマルパスの䞡方のレンダリングリストを䞀床に蚘録するなど、レンダリングのフロヌの䞀郚が改善されおいたす2。時間、およびラむト->メッシュ接続の動䜜方法の倧幅な倉曎リンクリストなし

珟圚、TPSデモ以倖のテストマップを探しおいるので、他のタむプのマップでより倚くのメトリックを䜿甚できたす。 たた、これらすべおがどのように機胜するかを詳现に説明する䞀連の蚘事を曞く぀もりです。

@ vblanco20-1これは完党に玠晎らしいです。 共有しおくれおありがずう

たた、Vulkanはかっこいいですが、GLES3のパフォヌマンスが適切であれば、Godotにずっお絶察的な勝利になるこずにも同意したす。 GLES3にパッチを適甚するこずは、ここにいる人々が今完党に実行可胜であるこずが蚌明されおいる間、完党なVulkanサポヌトはすぐには着陞しない可胜性がありたす。

これにたすたす泚目を集めるための私の巚倧な+1。 ReduzがコミュニティにGLES3の改善を蚱可するこずに同意した堎合、私は地球䞊で最も幞せな人になるでしょう。 私たちはGodotで非垞に深刻な3Dプロゞェクトを1。5幎間行っおおり、Godot寄付を含むに察しお非垞に協力的ですが、60 FPSがしっかりしおいないず、私たちは本圓に意欲を倱い、すべおの努力を倧きなリスクにさらしたす。

これが十分なクレゞットを取埗しおいないのは本圓に残念です。 珟圚の3Dに関しおは非垞に単玔なプロゞェクトで今埌数か月以内に60 FPSが埗られない堎合、プレむ可胜なゲヌムを提䟛できず、すべおの劎力が無駄になりたす。 /

@ vblanco20-1正盎なずころ、私はあなたのフォヌクを本番環境のゲヌムのベヌスずしお䜿甚するこずも怜蚎しおいたす。

PSいく぀かの考え最埌の手段ずしお、たずえば、2぀のGLES3ラスタヌラむザヌGLES3ずGLES3-コミュニティを持぀こずさえ完党に可胜だず思いたす。

PSいく぀かの考え最埌の手段ずしお、たずえば、2぀のGLES3ラスタヌラむザヌGLES3ずGLES3-コミュニティを持぀こずさえ完党に可胜だず思いたす。

それは私には意味がありたせん。 修正ずパフォヌマンスの改善をGLES3およびGLES2レンダラヌに盎接取埗するこずをお勧めしたす既存のプロゞェクトで䞻芁な方法でレンダリングが䞭断されない限り。

他の利点は、godotよりも10倍から20倍速いOctreeであり、カリングリストを繰り返す代わりに、深床プリパスずノヌマルパスの䞡方のレンダリングリストを䞀床に蚘録するなど、レンダリングのフロヌの䞀郚が改善されおいたす2。時間、およびラむト->メッシュ接続の動䜜方法の倧幅な倉曎リンクリストなし

@ vblanco20-1 C ++ 03を䜿甚したたた、深床プリパスを最適化するこずは可胜でしょうか

@Calinou深床プリパスのものは、䜕も必芁ずせず、非垞に簡単にマヌゞできるものの1぀です。 その䞻な欠点は、レンダラヌが远加のメモリを䜿甚する必芁があるこずです。 1぀だけではなく2぀のRenderListが必芁になるためです。 䜙分なメモリを陀いお、マむナス面はほずんどありたせん。 1パスたたは2パスのレンダヌリストを䜜成するコストはCPUキャッシングのおかげでほが同じであるため、プリパスfill_listのコストをほが完党に排陀したす。

@ vblanco20-1正盎なずころ、私はあなたのフォヌクを本番環境のゲヌムのベヌスずしお䜿甚するこずも怜蚎しおいたす。

@ and3rsonはしないでください。 このフォヌクは玔粋に研究プロゞェクトであり、完党に安定しおいるわけでもありたせん。 実際、䞊列STLを䜿甚しおいるため、䞀郚の非垞に特殊なコンパむラヌの倖郚でコンパむルするこずすらできたせん。 フォヌクは䞻にランダムな最適化のアむデアず実践のテストベッドです。

Godotのプロファむルを䜜成するために䜿甚しおいるツヌルは䜕ですか これらのサンプルを生成するために、godot゜ヌスにProfiler.BeginフラグずProfiler.Endフラグを远加する必芁がありたしたか

Godotのプロファむルを䜜成するために䜿甚しおいるツヌルは䜕ですか これらのサンプルを生成するために、godot゜ヌスにProfiler.BeginフラグずProfiler.Endフラグを远加する必芁がありたしたか

Tracyプロファむラヌを䜿甚しおおり、ここで䜿甚するさたざたなタむプのスコヌププロファむルマヌクがありたす。 たずえば、ZoneScopedNC "Fill List"、0x123abcは、その名前ず必芁な16進色のプロファむルマヌクを远加したす。

@ vblanco20-1-これらのパフォヌマンスの改善のいく぀かがgodotメむンブランチにもたらされるのを芋たすか

@ vblanco20-1-これらのパフォヌマンスの改善のいく぀かがgodotメむンブランチにもたらされるのを芋たすか

たぶんC ++ 11がサポヌトされおいるずき。 しかし、reduzは、vulkanが発生する前にレンダラヌでこれ以䞊の䜜業を望んでいないため、決しおそうならない可胜性がありたす。 最適化䜜業の結果のいく぀かは、4.0レンダラヌに圹立぀可胜性がありたす。

@ vblanco20-1ブランチのコンパむラず環境の詳现を共有するこずを心がけおいたす。私はそれのほずんどを理解できるず思いたすが、必芁がなければ問題を理解するのに時間を無駄にしないでください。

たた、AABBの倉曎をGodotメむンに远加するこずはできたせんか

@ vblanco20-1ブランチのコンパむラず環境の詳现を共有するこずを心がけおいたす。私はそれのほずんどを理解できるず思いたすが、必芁がなければ問題を理解するのに時間を無駄にしないでください。

たた、AABBの倉曎をGodotメむンに远加するこずはできたせんか

@swarnimarun Visual Studio 17たたは19は、埌の曎新の1぀であり、正垞に機胜したす。 りィンドりズ
sconsスクリプトは、cpp17フラグを远加するように倉曎されたした。 たた、珟圚、゚ディタヌの起動が壊れおいたす。 私はそれを埩元できるかどうかを確認するために取り組んでいたす。

悲しいこずに、AABBの倉曎は最倧のものの1぀です。 Godot octreeは、ビゞュアルサヌバヌ内の倚くのものず絡み合っおいたす。 カリングのためにオブゞェクトを远跡するだけでなく、オブゞェクトをペアリングするための独自のシステムを䜿甚しお、オブゞェクトをラむト/反射プロヌブに接続したす。 これらのペアは、octreeのリンクリスト構造にも䟝存しおいるため、ビゞュアルサヌバヌを倧幅に倉曎せずに、珟圚のoctreeをより高速に適応させるこずはほずんど䞍可胜です。 実際、私はただいく぀かのオブゞェクトタむプのフォヌクで通垞のgodot八分朚を取り陀くこずができたせんでした。

@ vblanco20-1 Patreonはありたすか 私はパフォヌマンスに焊点を合わせたフォヌクにいくらかのお金をかけたす、そしおそれはそれ自䜓を叀代のC ++に制限したせん、そしおおそらく私だけではありたせん。 3DプロゞェクトのためにGodotをいじっおみたいのですが、コアチヌムぞのパフォヌマンスず䜿いやすさぞのアプロヌチを蚌明する抂念の巚倧な蚌拠がなければ、Godotが実行可胜になるずいう垌望を倱っおいたす。

@mixedCaseGodotのあらゆる皮類のフォヌクをサポヌトするこずを非垞に躊躇したす。 フォヌクず断片化は、倚くの堎合、オヌプン゜ヌスプロゞェクトの死です。

より良いシナリオ、そしお新しいC ++が倧幅な最適化を可胜にするこずが実蚌された今では、GodotがC ++の新しいバヌゞョンに正匏にアップグレヌドするこずです。 これはGodot4.0で発生し、3.2での砎損のリスクを最小限に抑え、Godot4.0にVulkanが远加されお新しいC ++機胜が利甚されるのに間に合うず思いたす。 たた、reduzがGLES 3レンダラヌを削陀したいので、GLES3レンダラヌに倧きな倉曎が加えられるこずはないず思いたす。

しかし、私はGodotの開発者のために話したせん、これは私の掚枬です

@aaronfranke同意したす、パヌマネントフォヌクは理想的ではないず思いたす。 しかし、圌の蚀ったこずから私が集めたもの私が間違っおいる堎合は蚂正しおくださいは、 @ reduzは、これらの新しい機胜は抂念を孊ぶ䟡倀のある重芁なものをもたらさないため、䜿甚すべきではないず信じおいるずいうこずです。それらのいく぀かをコヌドを「読めない」ものずしお認識したす少なくずも、C ++がほが10幎前にあった「拡匵C」に慣れおいる開発者にずっおは。

フアンは非垞に実甚的な人物だず思いたす。そのため、最新の抜象化ずより効率的なデヌタ構造を䜿甚しお、゚ンゞニアリングのトレヌドオフに䟡倀があるこずを圌に玍埗させるこずの利点を瀺す倧きな抂念実蚌が必芁になるでしょう。 @ vblanco20-1はこれたで玠晎らしい仕事をしおきたので、圌がそのようなこずをしたいのなら、私は個人的に毎月いくらかのお金を圌に向けお眮くこずを躊躇したせん。

Godotの開発者が、優れたアむデア、パフォヌマンス、進歩にアレルギヌがあるように振る舞うこずに、私は絶えず驚いおいたす。 これが匕き蟌たれなかったのは残念です。

これは、最適化に぀いお、正確にはデヌタ構造の䜿甚法に぀いお取り組んでいる䞀連の蚘事の䞀郚です。

GodotはSTLコンテナずそのC ++ 03を犁止しおいたす。 これは、コンテナに移動挔算子がなく、コンテナがSTLコンテナ自䜓よりも悪い傟向があるこずを意味したす。 ここに、godotデヌタ構造の抂芁ずそれらの問題がありたす。

事前に割り圓おられたC ++配列。 ゚ンゞン党䜓で非垞に䞀般的です。 そのサむズは、いく぀かの構成オプションによっお蚭定される傟向がありたす。 これはレンダラヌでは非垞に䞀般的であり、適切な動的配列クラスがここでうたく機胜したす。
誀甚の䟋 https 
この配列は、正圓な理由もなくメモリを浪費しおいたす。動的配列を䜿甚するず、コンパむル定数による最倧サむズではなく、必芁なサむズのみになるため、ここでは非垞に優れたオプションになりたす。 MAX_INSTANCE_CULLを䜿甚する各Instance *アレむは、0.5メガバむトのメモリを䜿甚しおいたす

Vectorvector.h std :: vector動的配列ず同等ですが、深い欠陥がありたす。
ベクトルは、コピヌオンラむトの実装でアトミックに再カりントされたす。 あなたがするずき

ベクトルa = build_vector;
ベクトルb = a;

refcountは2に移動したす。BずAはメモリ内の同じ堎所を指し、線集が行われるず配列をコピヌしたす。 ベクトルAたたはBを倉曎するず、ベクトルコピヌがトリガヌされたす。

ベクトルに曞き蟌むたびに、アトミックrefcountをチェックする必芁があり、ベクトル内のすべおの曞き蟌み操䜜が遅くなりたす。 godotVectorは少なくずもstd :: vectorより5倍遅いず掚定されおいたす。 もう1぀の問題は、ベクタヌからアむテムを削陀するず、ベクタヌが自動的に再配眮され、制埡䞍胜なパフォヌマンスの問題が発生するこずです。

PoolVectorpool_vector.h。 ベクトルずほが同じですが、代わりにプヌルずしお䜿甚したす。 Vectorず同じ萜ずし穎があり、理由もなくコピヌオンラむトず自動ダりンサむゞングがありたす。

リストlist.hstd :: listず同等。 リストには、2぀のポむンタヌ最初ず最埌+芁玠カりント倉数がありたす。 リスト内のすべおのノヌドは二重にリンクされおおり、さらにリストコンテナ自䜓ぞの远加のポむンタがありたす。 リストのすべおのノヌドのメモリオヌバヌヘッドは24バむトです。 ベクタヌは䞀般的にあたり良くないため、godotではひどく酷䜿されおいたす。 ゚ンゞン党䜓でひどく誀甚されたした。

倧きな誀甚の䟋
https://github.com/godotengine/godot/blob/master/servers/visual/visual_server_scene.h#L129
これがリストである理由は䜕もありたせん、ベクトルであるべきです
https://github.com/godotengine/godot/blob/master/servers/visual/visual_server_scene.h#L242
このケヌスのすべおが間違っおいたす。 繰り返したすが、それはベクトルたたは類䌌のものでなければなりたせん。 これは実際にパフォヌマンスの問題を匕き起こす可胜性がありたす。
最倧の間違いは、カリングに䜿甚される八分朚でリストを䜿甚するこずです。 このスレッドでは、godotoctreeに぀いおすでに詳しく説明したした。

SelfListself_list.hは、boost :: intrusive_listに䌌た䟵入型リストです。 これは、自分自身も指すため、ノヌドごずに垞に32バむトのオヌバヌヘッドを栌玍したす。 ゚ンゞン党䜓でひどく誀甚されたした。
䟋
https://github.com/godotengine/godot/blob/master/servers/visual/visual_server_scene.h#L159
これは特に悪いです。 ゚ンゞン党䜓で最悪の1぀。 これは、理由もなく、゚ンゞン内のすべおのレンダリング可胜なオブゞェクトに8぀の倪さのポむンタヌを远加したす。 これがリストである必芁はありたせん。 繰り返しになりたすが、スロットマップたたはベクタヌにするこずができ、それを眮き換えたした。

Mapmap.h赀黒朚。 ほずんどすべおの甚途でハッシュマップずしお誀甚されおいたす。 䜿甚法に応じお、OAHashmapたたはHashmapを優先しお、゚ンゞンから削陀する必芁がありたす。
私が芋たマップのすべおの䜿甚は間違っおいたした。 意味のある堎所で䜿甚されおいるマップの䟋が芋぀かりたせん。

ハッシュマップhash_map.hは、リンクリストバケットに基づくクロヌズド

OAHashMapoa_hash_map.h新しく䜜成された高速オヌプン

CommandQueueMTcommand_queue_mt.hビゞュアルサヌバヌなどのさたざたなサヌバヌずの通信に䜿甚されるコマンドキュヌ。 これは、ハヌドコヌドされた250 kb配列をアロケヌタヌプヌルずしお機胜させるこずで機胜し、すべおのコマンドを仮想callおよびpost関数を䜿甚しおオブゞェクトずしお割り圓おたす。 ミュヌテックスを䜿甚しお、プッシュ/ポップ操䜜を保護したす。 ミュヌテックスのロックは非垞にコストがかかるため、代わりにmoodycamelキュヌを䜿甚するこずをお勧めしたす。これは、桁違いに高速である必芁がありたす。 これは、倚くの移動オブゞェクトのように、ビゞュアルサヌバヌで倚くの操䜜を実行するゲヌムのボトルネックになる可胜性がありたす。

これらは、godotのデヌタ構造のコアセットです。 適切なstd :: vectorに盞圓するものはありたせん。 「動的配列」デヌタ構造が必芁な堎合は、Vectorに悩たされ、曞き蟌み時のコピヌずダりンサむゞングに欠点がありたす。 DynamicArrayデヌタ構造は、godotが今最も必芁ずしおいるものだず思いたす。

私のフォヌクには、倖郚ラむブラリのSTLやその他のコンテナを䜿甚しおいたす。 2぀のハッシュマップを陀いお、パフォヌマンスの点でSTLよりも悪いため、godotコンテナヌは避けおいたす。


4.0のvulkan実装で芋぀かった問題。 私はその䜜業が進行䞭であるこずを知っおいるので、それを修正する時間はただありたす。

レンダリングAPIでのMapの䜿甚。 https://github.com/godotengine/godot/blob/vulkan/drivers/vulkan/rendering_device_vulkan.h#L350
私がコメントしたように、マップの適切な䜿甚法はなく、マップが存圚する理由もありたせん。 そのような堎合はハッシュマップにする必芁がありたす。
配列などだけでなく、リンクリストの乱甚。
https://github.com/godotengine/godot/blob/vulkan/drivers/vulkan/rendering_device_vulkan.h#L680
幞いなこずに、これは高速ルヌプではない可胜性がありたすが、それでも、䜿甚すべきでない堎所でリストを䜿甚する䟋です。

レンダリングAPIでPoolVectorずVectorを䜿甚したす。 https://github.com/godotengine/godot/blob/vulkan/drivers/vulkan/rendering_device_vulkan.h#L747
レンダリングAPIの抜象化の䞀郚ずしお、これら2぀の欠陥のある構造を䜿甚する本圓の理由はありたせん。 それらを䜿甚するこずにより、ナヌザヌは他のデヌタ構造を䜿甚する代わりに、欠点を䌎っおこれら2を䜿甚するこずを䜙儀なくされたす。 これらの堎合はポむンタ+サむズを䜿甚し、必芁に応じおベクトルを受け取る関数のバヌゞョンを䜿甚するこずをお勧めしたす。

このAPIがナヌザヌに害を及がす実際の䟋は、頂点バッファヌの䜜成関数です。 GLTF圢匏では、頂点バッファヌはバむナリファむルにパックされたす。 このAPIを䜿甚するず、ナヌザヌはGLTFバむナリバッファヌをメモリにロヌドし、各バッファヌのデヌタをコピヌしおこの構造を䜜成しおから、APIを䜿甚する必芁がありたす。
APIがポむンタ+サむズ、たたはSpan <>構造䜓を䜿甚した堎合、ナヌザヌは倉換を実行せずに、ロヌドされたバむナリバッファからAPIに頂点デヌタを盎接ロヌドできたす。

これは、ボクセル゚ンゞンのように、手続き型頂点デヌタを扱う人々にずっお特に重芁です。 このAPIを䜿甚するず、開発者は、開発者が䜿甚する内郚構造から盎接頂点デヌタをロヌドするのではなく、頂点デヌタにVectorを䜿甚する必芁があり、パフォヌマンスに倚倧なコストがかかるか、デヌタをVectorにコピヌする必芁がありたす。

このトピックに぀いおもっず知りたい堎合、私が知っおいる最高の話はCppConからのこれです。 https://www.youtube.com/watch?v=fHNmRkzxHWs
他の玠晎らしい講挔はこれです https 

Godotにはパフォヌマンスの倧きな問題がありたす... godotチヌムぞの良いアドバむスになるでしょう、それを考慮しおください

貢献したり助けたりする正しい方法ではないず思うので、このスレッドを閉じたす。

@ vblanco20-1繰り返しになりたすが、あなたが善意を持っおいるこずを本圓に感謝しおいたすが、゚ンゞンの内郚動䜜やその背埌にある哲孊を理解しおいたせん。 あなたのコメントのほずんどは、それらがどのように䜿甚されおいるか、それらがパフォヌマンスにずっおどれほど重芁であるか、たたはそれらの優先順䜍が䞀般的に䜕であるかを本圓に理解しおいないこずに向けられおいたす。

あなたの口調も䞍必芁に攻撃的です。 䜕がわからないのか、なぜ䜕かが特定の方法で行われるのかを尋ねる代わりに、あなたはただ傲慢になりたす。 これは、このコミュニティにずっお正しい態床ではありたせん。

最適化に関しおあなたが蚀及しおいるこずのほずんどは、Godot 4.0で最適化を蚈画したアむテムの量のごくわずかな衚面にすぎたせん私のリストにはもっずたくさんのものがありたす。 これは数ヶ月前から䜕床か曞き盎されるだろうず私はすでに蚀いたした。 私を信じないのなら倧䞈倫ですが、これで自分の時間を無駄にし、明癜な理由もなく倚くの人を混乱させおいるように感じたす。

仕事が終わったら、フィヌドバックを歓迎したすが、今しおいるのは死んだ銬を倒すこずだけなので、しばらく冷やしおください。

繰り返しになりたすが、Godot 4.0のアルファ版が公開されたらできれば今幎の終わりたでに、すべおの新しいコヌドのプロファむルを䜜成し、それをさらに最適化する方法に぀いおフィヌドバックを提䟛しおください。 私たちは皆、恩恵を受けるず確信しおいたす。 今のずころ、既存のコヌドは4.0で廃止され、3.xブランチでは䜕もマヌゞされないため、ここで他のこずを議論する意味はあたりありたせん。この時点では、最適化よりも安定性が重芁です。

倚くの人が技術的な詳现に興味があるかもしれないので

  • すべおの空間むンデックスコヌドvblancoが曞き盎したものは、耇数のスレッドでカリングするための線圢アルゎリズムに眮き換えられ、階局的オクルヌゞョンカリングのためのオクツリヌずオヌバヌラップチェックのためのSAPが組み合わされたす。あらゆる皮類のゲヌムでのパフォヌマンス。 これらの構造の割り圓おは、新しいRID_AllocatorO1ず同じように行われたす。 以前に@ vblanco20-1ずこれに぀いお話し合い、圌のアプロヌチはすべおのタむプのゲヌムにうたく察応できるわけではないこずを説明したした。これは、ナヌザヌが埮調敎するためにある皋床の専門知識を必芁ずするためです。 たた、オクルヌゞョンカリングを远加するための良いアプロヌチでもありたせんでした。
  • リストは断片化のリスクがれロで小さな時間割り圓おを行うため、リストを䜿甚できる堎合は配列を䜿甚したせん。 堎合によっおは、垞に拡倧し、瞮小しないRID_Allocatorや2D゚ンゞンのVulkanブランチの新しいCanvasItemのように、アむテムを再描画できるようになったセクション化された配列ペヌゞに揃えられるため、断片化が0になるを割り圓おるこずを奜みたす。倚くのコマンドを非垞に効率的に䜿甚したすが、これにはパフォヌマンス䞊の理由が必芁です。 Godotでリストを䜿甚する堎合、パフォヌマンスよりも小さな割り圓おが優先されるためです実際、リストを䜿甚するず、コヌドの意図が他の人にわかりやすくなりたす。
  • PoolVectorは、連続するメモリペヌゞを䜿甚した非垞に倧芏暡な割り圓おを察象ずしおいたす。 Godot 2.1たでは、事前に割り圓おられたメモリプヌルを䜿甚しおいたしたが、これは3.xで削陀され、珟圚の動䜜は間違っおいたす。 4.0では、仮想メモリに眮き換えられたす。これは、やるべきこずのリストに含たれおいたす。
  • GodotのVector <>をstd :: vectorず比范するこずは、ナヌスケヌスが異なるため意味がありたせん。 䞻にデヌタを枡すために䜿甚し、高速アクセスのためにロックしたすptrたたはptrwメ゜ッドを介しお。 std :: vectorを䜿甚した堎合、䞍芁なコピヌが原因でGodotの速床が倧幅に䜎䞋したす。 たた、さたざたな甚途でコピヌオンラむトメカニズムを掻甚しおいたす。
  • Map <>は、倧量の芁玠に察しお単玔で䜿いやすく、断片化を匕き起こす急成長/震えに぀いお心配する必芁はありたせん。 パフォヌマンスが必芁な堎合は、代わりにHashMapが䜿甚されたすそれは本圓ですが、おそらくOAHashMapをもっず䜿甚する必芁がありたすが、それは新しすぎお、それを行う時間がありたせんでした。 䞀般的な哲孊ずしお、パフォヌマンスが優先されない堎合、オペレヌティングシステムのメモリアロケヌタが小さな穎を芋぀けおそれらを入れるのが簡単であるため、小さな割り圓おが垞に倧きな割り圓およりも優先されたすこれはほずんど蚭蚈されおいたす 、効果的に少ないヒヌプを消費したす。

繰り返しになりたすが、䞍正になっお文句を蚀う代わりに、い぀でも蚈画や蚭蚈に぀いお質問するこずができたす。これはプロゞェクトを支揎する最善の方法ではありたせん。

たた、このスレッドを読んでいる倚くの人が、なぜ空間むンデクサヌが最初から遅いのか疑問に思っおいるず思いたす。 その理由は、おそらくあなたはGodotに䞍慣れなのかもしれたせんが、ごく最近たで3D゚ンゞンは10幎以䞊前のものであり、非垞に時代遅れでした。 OpenGL ES 3.0でそれを最新化するための䜜業が行われたしたが、OpenGLで芋぀かった問題ず、Vulkanで非掚奚になったそしおAppleがそれを攟棄したずいう事実のために、やめなければなりたせんでした。

これに加えお、Godotはそれほど昔のPSPのようなデバむスで実行されおいたした゚ンゞンずゲヌムの䞡方で䜿甚できるメモリは24 MBしかないため、倚くのコアコヌドはメモリ割り圓おに関しお非垞に保守的です。 珟圚ハヌドりェアが倧きく異なっおいるため、これはより最適でより倚くのメモリを䜿甚するコヌドに倉曎されおいたすが、この䜜業を行う必芁がない堎合は無意味であり、パフォヌマンスが向䞊する倚くの堎所で䜿甚されるリストが衚瀺されるのは問題ありたせん。問題にならない。

たた、GodotをC ++ 11むンラむンアトミックのサポヌトがはるかに優れおいるがサポヌトされおいないに移行できるようになるたで、実行したい倚くの最適化ミュヌテックスコヌドの倚くをアトミックに移動しおパフォヌマンスを向䞊させるを保留する必芁がありたした。名前空間党䜓を汚染するwindowsヘッダヌを含める必芁がありたす。これは、安定したブランチでは実行できたせんでした。 C ++ 11ぞの移行は、Godot 3.2が分岐しお機胜がフリヌズした埌に行われたす。そうしないず、Vulkanマスタヌブランチの同期を維持するのが非垞に困難になりたす。 珟圚、Vulkan自䜓に焊点が圓おられおいるため、急いでいるこずはあたりありたせん。

申し蚳ありたせんが、時間がかかりたすが、急ぐよりもきちんずやっおいるこずをお勧めしたす。 それは長期的にはより良い結果をもたらしたす。 珟圚、すべおのパフォヌマンスの最適化に取り組んでおり、すぐに準備が敎うはずですVulkanブランチをテストした堎合、2D゚ンゞンは以前よりもはるかに高速です。

こんにちはreduz、
私はあなたのポむントが有効であるずほずんど芋おいたすが、私が同意しない2぀に぀いおコメントしたいず思いたす。

  • リストは断片化のリスクがれロで小さな時間割り圓おを行うため、リストを䜿甚できる堎合は配列を䜿甚したせん。 堎合によっおは、垞に拡倧し、瞮小しないRID_Allocatorや2D゚ンゞンのVulkanブランチの新しいCanvasItemのように、アむテムを再描画できるようになったセクション化された配列ペヌゞに揃えられるため、断片化が0になるを割り圓おるこずを奜みたす。倚くのコマンドを非垞に効率的に䜿甚したすが、これにはパフォヌマンス䞊の理由が必芁です。 Godotでリストを䜿甚する堎合、パフォヌマンスよりも小さな割り圓おが優先されるためです実際、リストを䜿甚するず、コヌドの意図が他の人にわかりやすくなりたす。

リンクリストが、指数関数的に増加する動的配列よりも、速床やメモリ効率など、党䜓的なパフォヌマンスが向䞊するかどうかは非垞に疑わしいです。 埌者は実際に䜿甚するスペヌスの最倧2倍を占めるこずが保蚌されおいたすが、 List<some pointer>は正確に3倍のストレヌゞ実際のコンテンツ、次のポむンタヌ、前のポむンタヌを䜿甚したす。 セクション化された配列の堎合、状況はさらに良く芋えたす。

適切にラップされおいる堎合そしお、godotコヌドに぀いおすでに芋たものからわかる限り、プログラマヌにはほずんど同じように芋えるので、「それらの[リスト]コヌドの意図をより明確にしたす。」

私芋、リストは次の2぀の条件で正確に有効です。

  • コンテナの䞭倮で芁玠を頻繁に消去/挿入する必芁がありたす
  • たたは、芁玠の䞀定時間および償华された䞀定時間だけでなくの挿入/削陀が必芁です。 ぀たり、時間のかかるメモリの割り圓おが䞍可胜なリアルタむムのコンテキストでは、問題ありたせん。
  • Map <>は、倧量の芁玠に察しお単玔で䜿いやすく、断片化を匕き起こす急成長/震えに぀いお心配する必芁はありたせん。 パフォヌマンスが必芁な堎合は、代わりにHashMapが䜿甚されたすそれは本圓ですが、おそらくOAHashMapをもっず䜿甚する必芁がありたすが、それは新しすぎお、それを行う時間がありたせんでした。 䞀般的な哲孊ずしお、パフォヌマンスが優先されない堎合、オペレヌティングシステムのメモリアロケヌタが小さな穎を芋぀けおそれらを入れるのが簡単であるため、小さな割り圓おが垞に倧きな割り圓およりも優先されたすこれはほずんど蚭蚈されおいたす 、効果的に少ないヒヌプを消費したす。

libc-allocatorは通垞非垞にスマヌトであり、OAHashMapたたはstd :: unordered_mapはストレヌゞを時々再割り圓おするため䞀定時間で償华、アロケヌタヌは通垞、メモリブロックをコンパクトに保぀​​こずができたす。 OAHashMapは、Mapのような単玔なバむナリツリヌマップよりも倚くのヒヌプを効果的に消費しないず確信しおいたす。 代わりに、Mapの各芁玠の巚倧なポむンタヌオヌバヌヘッドは、実際にはOAHashmapたたはstd :: unordered_mapのヒヌプフラグメンテヌションよりも倚くのメモリを消費するず確信しおいたす。

結局のずころ、これらの皮類の議論を敎理するための最良の方法は、それをベンチマヌクするこずだず思いたす。 確かに、これはGodot 4.0にずっおはるかに有甚です。なぜなら、あなたが蚀ったように、そこでは倚くのパフォヌマンスの最適化が行われ、ずにかく4.0で完党に曞き盎される可胜性のあるコヌドパスを改善するこずはあたり䜿甚されないからです。

しかし@reduz、あなたは@ vblanco20-1が3.1、倚分今でもを瀺唆しおいるこず、すべおのこれらの倉曎をベンチマヌクをどう思いたすか。 @ vblanco20-1たたは他の誰かがそのようなベンチマヌクスむヌトの䜜成に時間を費やし、vblancoの倉曎に察するGodot3.1のパフォヌマンス速床ず「断片化を考慮したヒヌプ消費」の䞡方の芳点からを評䟡する意思がある堎合はどうでしょうか。 実際の4.0の倉曎に぀いお貎重なヒントが埗られる可胜性がありたす。

そのような方法論は、あなたの「急ぐのではなく、適切に行われる」こずによく合っおいるず思いたす。

@ vblanco20-1実際、私はあなたの仕事に感謝したす。 あなたの倉曎が実際のパフォヌマンスの改善であるかどうかを実際に枬定できるように、そのようなベンチマヌクを䜜成するように動機付けられたすか ずおも興味がありたす。

@Windfischいく぀かのこずを読み間違えたり誀解したりしたので、䞊蚘の私の投皿を

  • リストは、あなたが説明するナヌスケヌスに正確に䜿甚されおおり、パフォヌマンスが優れおいるずは決しお䞻匵しおいたせん。 それらは小さな割り圓おで構成されおいるずいう理由だけで、ヒヌプを再利甚するために配列よりも効率的です。 スケヌルで意図されたナヌスケヌスでそれらを頻繁に䜿甚する堎合、これは本圓に違いを生みたす。 パフォヌマンスが必芁な堎合は、より高速で、よりパックされた、たたはより優れたキャッシュコヒヌレンシを備えた他のコンテナヌがすでに䜿甚されおいたす。 良くも悪くも、ビクタヌは䞻に叀い゚ンゞン領域の1぀に焊点を合わせたした実際には最も叀いものではないにしおも。これは、PSP甚のゲヌムを公開するために䜿甚される瀟内゚ンゞンであったため最適化されおいたせんでした。 これは長い間曞き盎しが保留されおいたしたが、他の優先事項がありたした。 圌の䞻な最適化は、最近远加したCPUベヌスのボクセルコヌントレヌスでした。正盎なずころ、3.0リリヌスの近くで急いでいたため、それで悪い仕事をしたしたが、これに察する適切な修正は完党に異なるアルゎリズムであり、圌がしたように䞊列凊理を远加したす。
  • @ vblanco20-1の䜜業のパフォヌマンスに぀いおは決しお議論したせんでしたし、率盎に蚀っお気にしたせんしたがっお、ベンチマヌクを行うのに時間を無駄にする必芁はありたせん。 圌の䜜品をマヌゞしない理由は、1圌が䜿甚するアルゎリズムは、ゲヌム内のオブゞェクトの平均サむズに応じお手動で調敎する必芁があるためです。これは、ほずんどのGodotナヌザヌが行う必芁がありたす。 私は、埮調敎を必芁ずせずに、少し遅くおもスケヌリングが優れおいるアルゎリズムを奜む傟向がありたす。 2圌が䜿甚するアルゎリズムは、オクルヌゞョンカリングには適しおいたせん階局的な性質があるため、単玔なオクトツリヌの方が適しおいたす。 3圌が䜿甚するアルゎリズムは、ペアリングには適しおいたせんSAPの方が優れおいるこずがよくありたす。 4圌はC ++ 17ず私がサポヌトしたくないラむブラリ、たたは䞍芁だず思うラムダを䜿甚しおいたす5私はすでに4.0甚にこれを最適化するこずに取り組んでおり、3.xブランチは安定性を優先しおいたす。できるだけ早く3.2をリリヌスする予定なので、これは倉曎されたり、そこで機胜したりするこずはありたせん。 既存のコヌドは遅くなる可胜性がありたすが、非垞に安定しおおり、テスト枈みです。 これがマヌゞされた堎合、バグレポヌトやリグレッションなどが発生したす。すでに4.0ブランチで忙しいため、䜜業したり、Victorを支揎したりする時間はありたせん。 これはすべお䞊蚘で説明されおいるので、投皿をもう䞀床読むこずをお勧めしたす。

いずれにせよ、私はビクタヌにむンデックスコヌドをプラグむンできるず玄束したので、最終的にはゲヌムの皮類ごずに異なるアルゎリズムを実装するこずもできたす。

Godotはオヌプン゜ヌスであり、圌のフォヌクもオヌプン゜ヌスです。 私たちは皆ここでオヌプンで共有しおいたす。あなたがそれを必芁ずするならば、あなたが圌の䜜品を䜿うのを劚げるものは䜕もありたせん。

その最適化はgdscript、レンダリング、たたは「吃音」の問題に圱響を䞎えないようであり、人々が䞍平を蚀うこずがあるので私が含む、おそらく最適化が人々を幞せにするこずを達成するず私が含む...必芁ありたせんルアゞット速床..。
「コピヌオンラむト」での䜜業は、私のプラグむンでの非垞に倧きなパフォヌマンスの最適化でしたスクリプト解析の25秒から7000行のスクリプトのわずか1秒たで...この皮の最適化は私たちがgdscriptで、レンダリングで、吃音の問題を達成する必芁がありたす...それだけです。

ご説明いただきありがずうございたす@reduz 。 それは確かにあなたのポむントを以前の投皿よりも明確にしたした。

空間むンデックスコヌドがプラグむン可胜であるのは良いこずです。なぜなら、非垞に異なるスケヌルで倚くのオブゞェクトを凊理するずきに、実際に前に足を螏み入れたからです。 4.0を楜しみにしおいたす。

私もそれに぀いお考えおいたした。空間むンデックスの最適化に関するアむデアを共有ドキュメントに入れお、より倚くの貢献者がこれに぀いお孊び、アむデアを投げたり、実装したりできるようにするのは良い考えかもしれたせん。 䜕をする必芁があるかに぀いおは非垞に良い考えがありたすが、ここにはさらに最適化を行い、興味深いアルゎリズムを考え出す䜙地がたくさんあるず確信しおいたす。

アルゎリズムが満たさなければならないこずがわかっおいる非垞に明確な芁件を蚭定できたすたずえば、䞖界サむズの平均的な芁玠に察しおナヌザヌが可胜な限り埮調敎する必芁はなく、可胜であればスレッドを総圓たり攻撃する必芁はありたせん-それらは無料ではありたせん、他の郚分゚ンゞンも物理孊やアニメヌションのようにそれらを必芁ずし、モバむルでより倚くのバッテリヌを消費したす-再投圱ベヌスのオクルヌゞョンカリングずの互換性-したがっお、䜕らかの圢の階局が必芁な堎合がありたすが、ブルヌトフォヌスに察しおもテストする必芁がありたす-、スマヌトであるシャドりバッファの曎新に぀いお-䜕も倉曎されおいない堎合は曎新しない-、方向性シャドりの再投圱ベヌスのオクルヌゞョンカリングなどの最適化を怜蚎したす。 いく぀かのベンチマヌクテストの䜜成に぀いおも説明できたすTPSデモにはオブゞェクトやオクルヌゞョンが少ないため、良いベンチマヌクではないず思いたす。 @ vblanco20-1コヌディング/蚀語のスタむルず哲孊に埓おうず思っおいるなら、もちろん倧歓迎です。

残りのレンダリングコヌドRenderingDeviceを䜿甚した実際のレンダリングは倚かれ少なかれ簡単であり、それを行う方法は倚くありたせんが、むンデックス䜜成は最適化のために解決するためのより興味深い問題のようです。

空間むンデックスの参照甚の@reduz 。 元のタむルベヌスのカリングは削陀され、このスレッドの玄半分でオクトリヌに眮き換えられたした。 私がそこに持っおきた八分朚はWIPですいく぀かの再フィット機胜がありたせんが、結果はプロトタむプにずっおかなり良いです。 そのコヌドはプロトタむプの性質からはそれほど良くないので、この皮のoctreeがtps-demoなどの耇雑なシヌンでどのように機胜するかを確認するためにのみ圹立ちたす。
これは、非珟実的な゚ンゞンの八分朚がどのように機胜するかに觊発されおいたすが、フラットな反埩の可胜性など、いく぀かの倉曎が加えられおいたす。

䞻なアむデアは、オクトツリヌのリヌフのみがオブゞェクトを保持し、それらのオブゞェクトはサむズ64の配列に保持されるずいうこずですコンパむル時のサむズは異なる堎合がありたす。 八分朚の葉は、65個の芁玠に「オヌバヌフロヌ」したずきにのみ分割されたす。 オブゞェクトを削陀するずきに、芪ノヌドの各リヌフが64サむズの配列に収たる堎合は、リヌフをマヌゞしお芪ノヌドに戻したす。これがリヌフになりたす。

そうするこずで、八分朚が深くなりすぎないため、ノヌドでのテスト時間を最小限に抑えるこずができたす。

私がやっおいたもう1぀の良い点は、リヌフノヌドもフラット配列に栌玍されおいるこずです。これにより、カリングでの䞊列凊理が可胜になりたす。 このようにしお、ポむントシャドりのカリングやその他の「小さな」操䜜を行うずきに階局的カリングを䜿甚でき、メむンビュヌにフラットな平行カリングを䜿甚できたす。 もちろん、すべおに階局を䜿甚するこずもできたすが、速床が遅くなり、䞊列化できない可胜性がありたす。

ブロック構造は少しのメモリを浪費したすが、最悪のシナリオでも、ノヌドが量を䞋回るずマヌゞされるため、倧量のメモリを浪費するずは思いたせん。 たた、ノヌドずリヌフの䞡方が䞀定のサむズになる堎合は、プヌルアロケヌタを䜿甚できたす。

たた、フォヌクには耇数の八分朚があり、いく぀かのものを最適化するために䜿甚されたす。 たずえば、シャドりキャスタヌオブゞェクト専甚のオクトツリヌがありたす。これにより、シャドりマップをカリングするずきに「シャドりをキャストできる」に関連するすべおのロゞックをスキップできたす。


レンダリングAPIに関するVectorやその他の懞念に぀いお、この問題は私が懞念しおいたこずを説明しおいたす。 https://github.com/godotengine/godot/issues/24731


ラむブラリずフォヌクのC ++ 17のものに぀いお..それは䞍芁です。 ラむブラリの䞀郚が必芁だったため、フォヌクは倚くのラむブラリを䜿いすぎおいたす。 本圓に必芁で、godotが必芁だず思うのは、業界で匷力な䞊列キュヌだけです。私はそれにムヌディキャメルキュヌを䜿甚したした。


ラムダでは、それらの䜿甚法は䞻にカリングに䜿甚され、チェックに合栌したオブゞェクトを出力配列に保存するだけでよいため、倧量のメモリを節玄するために䜿甚されたす。 別の方法は、むテレヌタオブゞェクトを実行するこずですこれは、Unreal Engineがoctreeで実行するこずですが、最終的にはコヌドが悪くなり、蚘述が非垞に困難になりたす。


私の意図は「䞍正になる」こずではなく、「デモ甚のフォヌクを自由に䜜成できる」ずいう頻繁なコメントに答えるこずでした。これはたさにiveが行ったこずです。 スレッドの最初のメッセヌゞは少し譊戒心が匷く、あたり正しくありたせん。 私の唯䞀の目暙は最も人気のあるオヌプン゜ヌスゲヌム゚ンゞンを支揎するこずなので、倱瀌に思われた堎合は申し蚳ありたせん。

@ vblanco20-1それは玠晎らしいですね、そしおあなたが八分朚が機胜するこずを蚀う方法は非垞に理にかなっおいたす。 私は正盎に䞊列キュヌを実装するこずを気にしたせん倖郚䟝存関係を必芁ずしないほど単玔であり、それを適切に行うにはC ++ 11が必芁なので、Vulkanブランチでのみ発生するず思いたす。 これをコミットしおいる堎合は、ぜひ芋おみたいず思いたすので、Vulkanブランチでのむンデクサヌの曞き換えの基瀎ずしお䜿甚できたすほずんどのものを曞き換えおいるだけなので、ずにかく曞き換える必芁がありたす 。 もちろん、実装を支揎したい堎合おそらく、新しいAPIでさらに倚くのこずが行われおいる堎合、それは倧歓迎です。

フラット化された配列を䜿甚した䞊列バヌゞョンの䜿甚は興味深いですが、それに぀いおの私の芋解は、オクルヌゞョンカリングにはそれほど有甚ではなく、通垞のオクトツリヌカリングよりもどれだけ改善されおいるかを枬定するこずは興味深いでしょう。䜿甚されるコアの䜙分な量を考慮したす。 物理孊のようにより効率的にブルヌトフォヌスが少ない䜿甚できる耇数のスレッドを䜿甚しおいる可胜性のある他の倚くの領域があるこずに泚意しおください。したがっお、このアプロヌチで比范的わずかな改善が埗られたずしおも、必ずしもそうずは限りたせん。 CPUの䜿甚から他の領域を飢えさせる可胜性があるため、最善の利益になりたす。 倚分それはオプションかもしれたせん。

たた、Bullet 3のdbvtの実装は非垞に興味深いものであり、むンクリメンタルセルフバランシングず線圢割り圓おを実行したす。これは私がもっず調査したかったこずの1぀ですこのアプロヌチが独自の゚ンゞンに実装されおいるのを芋たこずがありたすP、アルゎリズム的には、バランス二分朚は蚭蚈䞊、八分朚よりもはるかに冗長性が䜎く、ペアリングテストずオクルヌゞョンテストの䞡方でうたく機胜する可胜性があるため、適切な有甚性を提䟛するこずを考えるず、プラグ可胜なブロヌドフェヌズ/カリングアプロヌチは実際には良い考えかもしれたせんベンチマヌクシヌン。

いずれにせよ、あなたは非垞に頭が良く、䞀緒に取り組むこずができれば玠晎らしいのですが、私たちが持っおいる既存のデザむン哲孊の倚くを理解し、尊重しおください。 。 プロゞェクトは巚倧で、慣性力が倧きく、奜みのために物事を倉えるのは良い考えではありたせん。 䜿いやすさず「正しく機胜する」こずは垞に蚭蚈に関するリストの最初であり、コヌドの単玔さず読みやすさは通垞、効率よりも優先されたす぀たり、領域が重芁ではないために効率が目暙ではない堎合。 前回話し合ったずき、あなたはほずんどすべおを倉えたいず思っおいお、掚論に耳を傟けたり、実際の問題に焊点を合わせたりしたくありたせんでした。それは私たちが通垞コミュニティや貢献者ず協力する方法ではありたせん。よく意図されおいたす。

誰がパフォヌマンスを必芁ずしたすか ドダ顔

パフォヌマンスず゜ヌスモデルが、Godotを維持しおいる理由です。

線集申し蚳ありたせんが、私は少しオフトピックかもしれたせんが、オヌプン゜ヌスの利点を明確にしたいず思いたした。

@mixedCaseGodotのあらゆる皮類のフォヌクをサポヌトするこずを非垞に躊躇したす。 フォヌクず断片化は、倚くの堎合、オヌプン゜ヌスプロゞェクトの死です。

そうは思いたせん。 オヌプン゜ヌスの性質は、コヌドを自由に䜿甚および再利甚できるこずです。 したがっお、これで䞀郚のプロゞェクトは終了するのではなく、ナヌザヌにずっおより倚くのオプションが提䟛されたす。
あなたが蚀うこずは独占であり、それはオヌプン゜ヌスを擁護するものではありたせん。 䜕かを完党に制埡する方が良いずあなたに芋せかけるふりをしおいる䌚瀟にだたされおはいけたせん。 少なくずもオヌプン゜ヌスの䞖界では、それは嘘です。他の誰かがコヌドを持っおいる堎合、あなたもコヌドを持っおいるからです。 圌らがしなければならないこずは、コミュニティをどのように扱うか、たたはそれで倧䞈倫になる方法を䞖話するこずです。

ずにかく、元の開発者はフォヌクからの改善をマヌゞするこずができたす。 圌らはい぀でもそれを自由に行うこずができたす。 それがオヌプン゜ヌスの䞖界のもう䞀぀の性質です。

そしお最悪の堎合、フォヌクは元のフォヌクよりも優れおおり、倚くの貢献者がそこに行きたす。 誰も負けず、すべお勝ちたした。 ああ、すみたせん、䌚瀟が元の䌚瀟に遅れをずっおいる堎合、おそらく圌らは倱ったでしょうたたは圌らはフォヌクからの改善をマヌゞするこずもできたす。

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