【rfactor2】 プラグイン開発3 – サンプル詳細2 –

今回の趣旨
 前回に引き続き、rFactor2のプラグイン例(Jan 15, 2012版)について解析をする。
 2012年3月28日現在、公開されているのはサンプルのソースコードのみ。
 プラグインのフォーラムはあまり活発ではないため、プラグインを作ったという書き込み系以外は、実際の開発のための情報情報が極めて少ない。
 そのため、自分で解析するための方法としてVisual Studio 2010(Express Edition:無料版)のデバッガを使用した。
20120328b.jpg
デバッガ情報
Launch rFactor.exeの項目
 今回の趣旨とは異なるが、rFactor2で最初のrFactorのラウンチゃー自体も、
 プラグイン用のフォルダから、下記のようにファイルを読み込んでいることを確認した。
 ※ただし、ファイル名から機能等は推測できないのと、プラグイン開発で拡張できるかも不明。
 \Plugins\Qt\Plugins\iconengines\qsvgicon4.dll’ を読み込みました。
 \Plugins\Qt\Plugins\iconengines\qsvgicon4.dll’ をアンロード
 \Plugins\Qt\Plugins\iconengines\qsvgicon4.dll’ を読み込みました。
 \Plugins\Qt\Plugins\iconengines\qsvgicon4.dll’ をアンロード
 \Plugins\Qt\Plugins\imageformats\qsvg4.dll’ を読み込みました。
 \Plugins\Qt\Plugins\imageformats\qsvg4.dll’ をアンロード
 \Plugins\Qt\Plugins\imageformats\qgif4.dll’ を読み込みました。
 \Plugins\Qt\Plugins\imageformats\qico4.dll’ を読み込みました。
 \Plugins\Qt\Plugins\imageformats\qjpeg4.dll’ を読み込みました。
 \Plugins\Qt\Plugins\imageformats\qmng4.dll’ を読み込みました。
 \Plugins\Qt\Plugins\imageformats\qtiff4.dll’ を読み込みました。
 \Plugins\Qt\Plugins\bearer\qgenericbearer4.dll’ を読み込みました。
 \Plugins\Qt\Plugins\bearer\qnativewifibearer4.dll’ を読み込みました。
 \Plugins\Qt\Plugins\codecs\qcncodecs4.dll’ を読み込みました。
 \Plugins\Qt\Plugins\codecs\qjpcodecs4.dll’ を読み込みました。
 \Plugins\Qt\Plugins\codecs\qkrcodecs4.dll’ を読み込みました。
 \Plugins\Qt\Plugins\codecs\qtwcodecs4.dll’ を読み込みました。
rFactor2.exeの起動時の項目
 ラウンチゃーからSingle Playerをクリックすると、下記のような記録がなされた。
 トラックや車を選択する画面の時点で、既にプラグイン(のDLL)はロードされているということになる。
 rFactor2.exeを起動前であれば、ラウンチゃーが起動していてもプラグインの抜き差しができるということだ。
 \Core\rFactor2.exe’ を読み込みました。
 \Core\mss32.dll’ を読み込みました。
 \Core\d3d9.dll’ を読み込みました。
 \Core\dsetup.dll’ を読み込みました。
 \Plugins\DashMeterPlugin.dll’ を読み込みました。
 \Plugins\InternalsPlugin.dll’ を読み込みました。
 \Plugins\MotecPlugin.dll’ を読み込みました。
 \Plugins\TrackIR_rF2_Plugin.dll’ を読み込みました。
 \Plugins\TrackMapPlugin.dll’ を読み込みました。
デバッグ用コード挿入
 次からのセクションは一番重要な箇所だ。詳細な動きをリアルタイムで知る必要があるため、
 ファイルに出力されるのと同じメッセージを画面に出力できるように、下記のようにコードを修正した。
 OutputDebugString関数は、デバッガに文字列を出力する関数である。
 20120328c.jpg
プラグインロード時
 void ExampleInternalsPlugin::Startup( long version )が呼び出される。
 ※”-STARTUP-\n”がデバッガのどこにも記録されていなかったが、rFactor2.exeの実行時に1回だけ開始される。
コートロード直後
 ”–STARTSESSION–“は、コースロード直後にデバッガに表示された。
 void ExampleInternalsPlugin::StartSession()関数は、コースロード直後に1回だけ呼び出される関数ということになる。
コートに出た直後
“—ENTERREALTIME—“は、コースに出た時に1回だけ呼び出されている。
 void ExampleInternalsPlugin::EnterRealtime()関数は、コースに出た時(走行可能状態)に1回だけ呼び出される
20120328a.jpg
 この時、画面の左上に上のアイコンが表示されるが、このアイコンは「今、プラグインが読み込まれました」ではなく、
 サンプルプログラムで言うところのvoid ExampleInternalsPlugin::EnterRealtime()が呼び出されましたという意味になるので、
 RACEボタンをクリックする毎にプラグインが読み込まれるということではない。
 パドックに戻った直後
 ”—EXITREALTIME—“は、コースからパドック(?)の画面に戻った時に呼び出されている。
 void ExampleInternalsPlugin::EnterRealtime()関数は、走行待ち状態に遷移した時に1回だけ呼び出される。
 RACEボタンを押したりESCでパドックに戻ると、その回数だけENTERREALTIMEとEXITREALTIMEが記録されるので、走行単位での切り分けに使用できる。
 Single Playerメニューに戻った直後
 ”–ENDSESSION–“は、パドックからトラック・コース選択メニューまで戻るときに記録されている。
 void ExampleInternalsPlugin::EndSession()は、
 レース的な意味のセッションではなく、トラック・車を選択した単位の終了時の処理ということになる。
 Single Playerモード終了時
 ”-SHUTDOWN-“は、メニューからEXITを選択し、YESでrFactor2.exeを終了するときに記録されている。
 void ExampleInternalsPlugin::Shutdown()は、Single Playerを終了するときということになる。
 その後、実際に下記のようなメッセージが記録されていた。
 \Plugins\DashMeterPlugin.dll’ をアンロード
 \Plugins\TrackIR_rF2_Plugin.dll’ をアンロード
 \Plugins\MotecPlugin.dll’ をアンロード
 \Plugins\InternalsPlugin.dll’ をアンロード
次回
 次回は”ENTERREALTIME”と”EXITREALTIME”の間の処理。
 実際にリアルタイムでデータをファイルに吐きだす処理の部分について解説する。
 この部分だけカバーすれば、Windowsプログラミングの知識が無くても、C/C++言語の入門書レベルで十分に、
 自分の欲しいデータ(MOTECプラグインで吐きだされていないデータも)が取得できるものと考えられる。
 またVisual Studio 2010のデバッガとの連携・設定についても後述予定となる。

rfactor2 Plugin Develop