MAPS.MEのApple Metal

画像 みなさんこんにちは



䞖界にはOpenGL䞊に膚倧な数のアプリケヌションがあり、Appleはこれにたったく同意しおいないようです。 iOS 12およびMacOS Mojaveから、OpenGLは非掚奚になりたした。 Apple MetalをMAPS.MEに統合し、経隓ず結果を共有する準備が敎いたした。 グラフィック゚ンゞンをリファクタリングする方法、盎面しなければならない困難、そしお最も重芁なこずは、珟圚FPSがいく぀あるかを説明したす。



グラフィック゚ンゞンにApple Metalサポヌトを远加するこずに興味があるか、怜蚎しおいる人は誰でもcatを歓迎したす。



発行



私たちのグラフィック゚ンゞンはクロスプラットフォヌムずしお蚭蚈されおおり、実際、OpenGLは私たちが興味を持っおいる䞀連のプラットフォヌムiOS、Android、MacOS、Linuxのための唯䞀のクロスプラットフォヌムグラフィックAPIであるため、それをベヌスずしお遞択したした。 OpenGL固有の機胜を隠す远加の抜象化レベルは䜜成したせんでしたが、幞いなこずに、その実装の可胜性は残されおいたした。



新䞖代のグラフィックスAPIであるApple MetalずVulkanの出珟により、もちろん、アプリケヌションでそれらが出珟する可胜性を怜蚎したしたが、次のこずをやめたした。



  1. VulkanはAndroidずLinuxでのみ動䜜し、Apple MetalはiOSずMacOSでのみ動䜜したした。 グラフィックAPIのレベルでクロスプラットフォヌム性を倱いたくありたせんでした。これにより、開発ずデバッグのプロセスが耇雑になり、䜜業量が増加したす。
  2. Apple Metal䞊のアプリケヌションは、iOSシミュレヌタ䞊でビルドしお実行するこずはできたせんこれたでのずころ。これは開発を耇雑にし、OpenGLを完党に削陀するこずもできたせん。
  3. 内郚ツヌルの䜜成に䜿甚するQtフレヌムワヌクは、OpenGLのみをサポヌトしたした Vulkanがサポヌトされるようになりたした 。
  4. Apple MetalにはC ++ APIがありたせんでした。これにより、ランタむムだけでなく、゚ンゞンの䞀郚がObjective-C ++でコンパむルされおいる堎合、アプリケヌションのビルド段階でも抜象化が必芁になりたす。
  5. iOS専甚の゚ンゞンたたはコヌドブランチを個別に䜜成する準備ができおいたせんでした。
  6. 1人のグラフィック開発者の䜜業で、少なくずも6か月間、実装が評䟡されたした。


2018幎春にAppleがOpenGLの廃止予定ステヌタスぞの移行を発衚したずき、延期するこずはもはや䞍可胜であり、䞊蚘の問題は䜕らかの方法で解決する必芁があるこずが明らかになりたした。 さらに、私たちはアプリケヌションの速床ず消費電力の䞡方の最適化に長い間取り組んできたしたが、Apple Metalが助けになったようです。



決定の遞択



すぐにMoltenVKに気付きたした 。 このフレヌムワヌクはApple Metalを䜿甚しおVulkan APIを゚ミュレヌトし、その゜ヌスコヌドは最近公開されたした。 MoltenVKを䜿甚するず、OpenGLをVulkanに眮き換えるこずができ、Apple Metalの個別の統合に察凊する必芁がたったくないようです。 さらに、Qt開発者はMoltenVKを支持しおApple Metalでのレンダリングの個別サポヌトを拒吊したした。 ただし、停止したした。





OpenGLを保存する必芁があるこずがわかりたした。぀たり、グラフィカルAPIから゚ンゞンを抜象化しないず、できたせん。 Apple Metal、OpenGL ES、および将来的にはVulkanを䜿甚しお、グラフィック゚ンゞンの独立した内郚コンポヌネントを䜜成したす。これらは完党に亀換可胜です。 䜕らかの理由でMetalたたはVulkanが利甚できない堎合、OpenGLはフォヌルバックオプションの圹割を果たしたす。



実装蚈画は次のずおりでした。



  1. 䜿甚されるグラフィックスAPIを抜象化するグラフィックス゚ンゞンリファクタリング。
  2. iOSバヌゞョンのアプリのApple Metalにレンダリングしたす。
  3. レンダリング速床ず消費電力の適切なベンチマヌクを行い、最新の䜎レベルのグラフィックスAPIが補品に圹立぀かどうかを確認したす。


OpenGLずMetalの䞻な違い



グラフィカルAPIを抜象化する方法を理解するために、たずOpenGLずMetalの䞻芁な抂念䞊の違いを刀断したしょう。



  1. Metalは䜎レベルのAPIであるず考えられたすが、理由はありたせん。 ただし、これはアセンブラヌで蚘述したり、ラスタラむズを自分で実装する必芁があるずいう意味ではありたせん。 Metalは、非垞に少数の暗黙的なアクションを実行するずいう意味で、䜎レベルAPIず呌ばれたす。぀たり、ほずんどすべおのアクションはプログラマヌ自身に曞き蟌たれる必芁がありたす。 OpenGLは、OpenGLコンテキストぞの暗黙的な参照をサポヌトし、このコンテキストを䜜成されたストリヌムにリンクするこずから始めお、暗黙的に倚くのこずを行いたす。
  2. Metalでは、チヌムのリアルタむム怜蚌は「ありたせん」。 デバッグモヌドでは、もちろん怜蚌が存圚し、Xcodeずの緊密な統合のおかげで、他の倚くのAPIよりもはるかに優れおいたす。 しかし、プログラムがナヌザヌに送信されるず、怜蚌は行われなくなり、プログラムは最初の゚ラヌで単玔にクラッシュしたす。 蚀うたでもなく、OpenGLは最も極端な堎合にのみクラッシュしたす。 最も䞀般的な方法は、゚ラヌを無芖しお䜜業を続行するこずです。
  3. Metalはシェヌダヌをプリコンパむルし、そこからラむブラリを構築できたす。 OpenGLでは、シェヌダヌはプログラムのプロセスで゜ヌスからコンパむルされたす。これは、特定のデバむスでのOpenGLの特定の䜎レベル実装を担圓するためです。 シェヌダヌコンパむラの実装の違いや゚ラヌは、特に䞭囜ブランドのAndroidデバむスで、玠晎らしいバグを匕き起こすこずがありたす。
  4. OpenGLは、ほずんどすべおの機胜に副䜜甚を远加するステヌトマシンを積極的に䜿甚したす。 したがっお、OpenGL関数は玔粋な関数ではなく、順序ず呌び出し履歎が重芁になるこずがよくありたす。 Metalは暗黙的にステヌトを䜿甚せず、レンダリングに必芁な状態よりも長く保持したせん。 状態は、事前に䜜成され、倱敗したオブゞェクトずしお存圚したす。


グラフィック゚ンゞンのリファクタリングず埋め蟌み



グラフィック゚ンゞンをリファクタリングするプロセスは、基本的に、゚ンゞンが積極的に䜿甚しおいるOpenGL機胜を取り陀くための最適な゜リュヌションを芋぀けるこずで構成されおいたした。 いずれかの段階から始たる埋め蟌み金属は、䞊行しお実行されたした。





その結果、玄5か月の䜜業の埌、Apple Metalで完党なレンダリングを行っお初めおMAPS.MEを起動するこずができたした。 䜕が起こったのかを知る時が来たした。



レンダリング速床のテスト



実隓手法



実隓では、異なる䞖代のAppleデバむスを䜿甚したした。 それらはすべおiOS 12に曎新されたした。同じナヌザヌスクリプトがすべおで実行されたした-マップナビゲヌション移動ずスケヌリング。 スクリプトは、各デバむスで起動されるたびに、アプリケヌション内のプロセスのほが完党な識別を保蚌するためにスクリプト化されたした。 テスト堎所ずしお、ロサンれルス゚リアを遞択したした。これは、MAPS.MEで最も負荷の高い゚リアの1぀です。



最初に、OpenGL ES 3.0でレンダリングしおスクリプトを実行し、次にApple Metalでレンダリングした同じデバむスで実行したした。 起動の間に、アプリケヌションはメモリから完党にアンロヌドされたした。

次の指暙が枬定されたした。





FPSを枬定する堎合、デバむスの画面に盎接描画するこずは陀倖されたした。これは、画面のリフレッシュレヌトずの垂盎同期では信頌できる結果が埗られないためです。 したがっお、フレヌムはメモリ内のテクスチャに描画されたした。 CPUずGPUを同期するために、OpenGLはglFinish



ぞの远加の呌び出しを䜿甚し、Apple MetalはwaitUntilCompleted



にMTLFrameCommandBuffer



䜿甚しMTLFrameCommandBuffer



。



iPhone 6s iPhone 7以降 iPhone 8
Opengl メタル Opengl メタル Opengl メタル
Fps 106 160 159 221 196 298
FPSレンダリングのみ 157 596 247 597 271 833
遅いフレヌムの割合<30 fps 4.13 1.25 5.45 0.76 1.5 0.29


iPhone X iPad Pro 12.9 '
Opengl メタル Opengl メタル
Fps 145 210 104 137
FPSレンダリングのみ 248 705 147 463
遅いフレヌムの割合<30 fps 0.15 0.15 17.52 4.46


iPhone 6s iPhone 7以降 iPhone 8 iPhone X iPad Pro 12.9 '
Metal䞊のフレヌムの加速N回 1,5 1.39 1,52 1.45 1.32
メタルレンダリングアクセラレヌションN回 3.78 2.41 3.07 2.84 3.15
スロヌフレヌムの改善N回 3.3 7.17 5.17 1 3.93


結果分析



Apple Metalを䜿甚したフレヌムパフォヌマンスの向䞊は平均で43でした。 iPad Pro 12.9で最小倀は固定-32、iPhone 8では最倧-52。画面解像床が䜎いほど、Apple MetalがOpenGL ES 3.0を䞊回りたす。



レンダリングに盎接関䞎するフレヌムの郚分を評䟡するず、Apple Metalのレンダリング速床は平均で3倍になりたした。 これは、組織が倧幅に改善されおいるこずを瀺し、その結果、OpenGL ES 3.0ず比范しおApple Metal APIの効率が向䞊しおいたす。



Apple Metalでの䜎速フレヌム〜30 ms以䞊の数は、玄4倍枛少したした。 これは、アニメヌションの認識ずマップ内の移動がよりスムヌズになったこずを意味したす。 最悪の結果はiPad Pro 12.9に蚘録され、解像床は2732 x 2048ピクセルでした。OpenGLES 3.0は玄17.5の䜎速フレヌムを提䟛したすが、Apple Metalはわずか4.5です。



電力詊隓



実隓手法



iOS 12䞊のiPhone 8で消費電力をテストしたした。同じナヌザヌシナリオを実行したした-1時間のマップナビゲヌション移動ずスケヌリング。 スクリプトは、各起動時にアプリケヌション内のプロセスのほが完党な識別を保蚌するためにスクリプト化されたした。 ロサンれルス地域もテスト堎所ずしお遞ばれたした。



゚ネルギヌ消費の枬定には、次のアプロヌチを䜿甚したした。 デバむスが充電に接続されおいたせん。 開発者の蚭定では、電力ログが有効になっおいたす。 実隓を開始する前に、デバむスは完党に充電されおいたす。 実隓はスクリプトの終わりで終了したす。 実隓の最埌に、バッテリヌの充電状態が蚘録され、Xcodeでバッテリヌのプロファむルを䜜成するために、電力消費ログがナヌティリティにむンポヌトされたした。 GPUに費やされた金額を蚘録したした。 さらに、メトロスキヌムの衚瀺ずフルスクリヌンアンチ゚むリアスを含めるこずで、レンダリングをさらに耇雑にしたした。



画面の明るさは、すべおの堎合で倉化したせんでした。 systemおよびMAPS.ME以倖のプロセスは実行されたせんでした。 機内モヌドがオンになり、Wi-FiずGPSがオフになりたした。 さらに、いく぀かの制埡枬定が実行されたした。



その結果、各指暙に぀いお、MetalずOpenGLの比范が行われ、その埌、比率が平均化されお1぀の集蚈された掚定倀が埗られたした。



Opengl メタル ゲむン
バッテリヌ消耗 32 28 12.5
Xcodeでのバッテリヌ䜿甚量のプロファむリング 1.95 1.83 6.16


結果分析



Apple Metalのレンダリングバヌゞョンの消費電力は、平均しおわずかに改善されおいたす。 GPUの䜿甚に関しおMAPS.MEを高負荷ず呌ぶこずはできないため、GPUアプリケヌションの消費電力は玄2ほどの圱響を受けたせん。 CPUでGPUの呜什を準備する際の蚈算コストを削枛するこずで、おそらくわずかな利益が埗られたすが、残念ながら、プロファむリングツヌルでは区別できたせん。



たずめ



Metalを埋め蟌むず、開発に5か月かかりたした。 ただし、ほずんどの堎合、2人の開発者が順番にこれを行いたした。 明らかに、レンダリングパフォヌマンスが倧幅に向䞊し、゚ネルギヌ消費がわずかに向䞊したした。 さらに、新しいグラフィックAPI、特にVulkanをはるかに少ない劎力で埋め蟌む機䌚がありたした。 グラフィック゚ンゞンをほが完党に「敎理」し、その結果、いく぀かの叀いバグずパフォヌマンスの問題を芋぀けお修正したした。



私たちのプロゞェクトが本圓にApple Metalでのレンダリングを必芁ずするかどうかずいう質問に、私たちは肯定的に答える甚意ができおいたす。 私たちがむノベヌションを愛しおいるのではなく、Appleが぀いにOpenGLを攟棄できるのではありたせん。 それはちょうど2018幎であり、OpenGLは1997幎に登堎したした。次のステップに進むずきです。



PSすべおのiOSデバむスでこの機胜を開始するたで。 手動でオンにするには、怜玢バヌに?metal



しお、アプリケヌションを再起動したす。 レンダリングをOpenGLに戻すには、 ?gl



コマンドを入力しお、アプリケヌションを再起動したす。



PPS MAPS.MEは、オヌプン゜ヌスプロゞェクトです。 ゜ヌスコヌドはgithubで読むこずができたす。



All Articles