前回のmain関数の続きで今回はメインのwindowが表示されるまでコードリーディングをします。
(OBS StudioのVer30、windows用の処理を参照)
run_program関数
run_program関数は前回のmain関数と同様にobs-app.cpp内で処理されています。

Qtの大枠処理ではQApplicationを継承したOBSAppでexec()を実行し、
OBSのウィンドウはQMainWindowを継承したOBSBasicでshow()をそれぞれ実行しています。
クラス関係とファイル名の概要は下図。

起動処理(obs-app.cppファイル内)
以下、obs-app.cppの2320行目からの処理内容。
プロファイラ設定
実行速度計測の為、プロファイラを用意します。
プロファイラデータはユーザーフォルダ内のobs-studioフォルダ(~AppData/Roaming/obs-studio/)以下のprofiler_dataに書き込まれます。
概要のみ参照する場合はlogsフォルダ内のtxtデータにも記載されています。
profile_register_rootで”run_program_init”を設定しているので、以降はProfileScope(“関数名”)で呼び出すとroot以下に呼び出された階層と共に各処理時間が計測されていきます。
下記はログデータ内のプロファイラー結果の例。
16:00:12.735: run_program_init: 2121.05 ms
16:00:12.735: ┣OBSApp::AppInit: 60.845 ms
16:00:12.735: ┃ ┗OBSApp::InitLocale: 2.42 ms
16:00:12.735: ┗OBSApp::OBSInit: 1983.53 ms
16:00:12.735: ┣obs_startup: 4.057 ms
16:00:12.735: ┗OBSBasic::OBSInit: 1240.27 ms
Qt設定
setHighDpiScaleFactorRoundingPolicy:高DPIディスプレイ用設定
addLibraryPath:実行フォルダを登録
qputenv:Qtの最適化の無効化
- コメントに説明有。ウィジェットの交差判定を止めることでホットキー処理などを高速に処理させている。
OBSAppクラスのインスタンス作成
2387行目で変数名をprogramとしてインスタンスを作成しています。
以下ではQtアプリの大枠処理として開始関数のprogram.exec()をするため準備をしていきます。
- OBSAppコンストラクタ(1401行目~)
- 主な処理はQt設定の続き。
- 起動時のエラー処理やログファイルの作成
- ここでエラーが見つかるとQMessageBoxで警告を出す。
- OBSInit関数(1668行目~)
- 主な処理はmainウィンドウのインスタンス化
- Log記録後、1738行目でOBSBasic(QMainWindow)のインスタンスを作成。
- OBSBasicのコンストラクタ内(window-basic-main.cpp)でメインウィンドウの中にある各ドック(ウィジットウィンドウ)の設定処理を実施。
- OBSBasic::Init()の実行
- OBSBasicクラスとOBSAppクラスどちらにもOBSInit関数があるので注意
- 主な処理はコンフィグファイルの設定反映やプラグイン読み出し、ホットキーの設定etc。
- show()の実行は2172行目
- Log記録後、1738行目でOBSBasic(QMainWindow)のインスタンスを作成。
- 主な処理はmainウィンドウのインスタンス化
上記の流れでOBSBasic::Init()の実行後、2586行目でprogram.exec()が実行されます。(OBSBasicクラスの実装はwindow-basic-main.cppファイル内)