Live++ で C++ をホットリロードする
先週リリースされた JetBrains Rider 2024.3 EAP が Live++ に対応したらしい。従来の Rider は C++ のホットリロードに対応していない。この点 Rider は Visual Studio に遅れを取っていて不便だと思う。
Live++ とは何なのか
Live++ | Your hot-reload superpower
C/C++ でホットリロードを可能にする商用の開発ツールらしい。無料トライアルのあとは月 €11.90 (約2000円) が必要。本記事では Rider において Live++ を利用する内容であるが、Live++ 自体はIDEに依存しない。
導入してみる
まず、Live++ をダウンロードする。以下のページから zip をダウンロードした。内容はAPIのヘッダとDLL、実行ファイル合わせて8ファイル程度あった。
スタートガイドに沿って進める。
https://liveplusplus.tech/docs/documentation.html#compiler_settings
先ほどダウンロードしたzipの中身をプロジェクト直下に配置した。
ドキュメントに記載されていたコンパイルオプションとリンカーオプションをそれぞれ設定した。
プロジェクトに以下の C++ ファイルを
LivePP_EntryPoint.cpp
として追加した。プログラム実行時、Main が呼ばれる前に Live++ のクライアントが起動するようにしている。相対パスは各自のプロジェクトに合わせて変更する。
// include the API for Windows, 64-bit, C++ #include "../LivePP/API/x64/LPP_API_x64_CPP.h" namespace { struct LivePP_EntryPoint { lpp::LppDefaultAgent lppAgent; LivePP_EntryPoint() { // create a default agent, loading the Live++ agent from the given path, e.g. "ThirdParty/LivePP" lppAgent = lpp::LppCreateDefaultAgent(nullptr, L"../../../LivePP"); // bail out in case the agent is not valid if (!lpp::LppIsValidDefaultAgent(&lppAgent)) { return; } // enable Live++ for all loaded modules lppAgent.EnableModule( lpp::LppGetCurrentModulePath(), lpp::LPP_MODULES_OPTION_ALL_IMPORT_MODULES, nullptr, nullptr); // run the application } ~LivePP_EntryPoint() { // destroy the Live++ agent lpp::LppDestroyDefaultAgent(&lppAgent); } }; LivePP_EntryPoint s_lpp; }
以上で設定が終わった。
使ってみる
コードの変更を Ctrl + Alt + F11 でホットリロード出来た。この際、自動でファイル保存はしてくれず、手動でファイルの保存が必要であったので注意。ホットリロードが完了するとトースト通知が表示される。
ゲーム開発の場合、LppSynchronizedAgent を使うと良さそう。これは任意のタイミングでホットリロードを反映することが可能なため、予期せぬタイミングでホットリロードが適応されることによる事故を防げる。Live++ 用の Siv3D Addon · GitHub
Visual Studio ビルドインのホットリロードと比較して
- 計測はしていないが、体感では Visual Studio よりも Live++ の方がホットリロードする時間が短く快適に感じた。
- Visual Studio よりも Live++ の方がホットリロードを適応できる場面が多そうであった。例えば、Visual Studio ではラムダ式内部のホットリロードが反映されないことが多々あるのに対し、Live++ では特に問題無さそうであった。
- Visual Studio では副作用のない小さな修正であっても「この変更はホットリロードに対応していません」と弾かれてしまう現象がしばしば発生するが、Live++ ではメモリレイアウト的な変更でない限り基本的にホットリロードが出来そうであった。
- 補足すると、ユーザー側でメモリレイアウトを移行するコードを入れておくことで、メモリレイアウトを変更するホットリロードも一応可能っぽい (https://liveplusplus.tech/docs/documentation.html#API_structural_change)
Rider 2024.3 EAP との連携
冒頭の記事によると Live++ のための機能が Rider に追加されているらしいので試してみる。ドキュメントによると、Visual Studio または Rider から Live++ を起動すると自動で検知してくれるようになっているらしい。
When debugging with Visual Studio or Rider, Live++ will attempt to automate the actions necessary to put the process into a mode where it can continue to communicate with Live++. If successful, the Broker UI log will read "Automated ... debugger attached to process with PID XXXXX"; Live++ will then compile your changes and install code patches. Afterwards, the process will once again be held at the same instruction in the debugger.
しかし、やってみてもこの検知されたという旨のメッセージは表示されず、連携が出来ていないようであった。追加の設定を見直したりしてみたが結局原因が分からなかった。後日改めて確認したい。
感想
Rider で高品質なホットリロードが可能になったことにより、大幅に開発効率の向上が見込めそう。まだトライアル中であるが、Live++ に月2000円を払う価値はあると思う。
https://liveplusplus.tech/pricing.html を見ると Free educational license があるらしい。学生は無料で使えるかもしれないので問い合わせた。
追記: 大学のメールアドレスにてお問い合わせをしたところ、ライセンスキーを早速ご送付いただきました。