Ticket #39721

macOS版 ディスプレイリンク対応

Open Date: 2019-11-04 21:50 Last Update: 2019-11-07 01:30

Reporter:
Owner:
Status:
Closed
Priority:
5 - Medium
Severity:
5 - Medium
Resolution:
Fixed
File:
None

Details

独自スレッドによる描画処理から、ディスプレイリンクを用いた描画処理に移行する。

ディスプレイリンク移行の背景は以下チケット参照。

  • #39720 macOS版 開発環境をXcode 10に移行

Ticket History (3/4 Histories)

2019-11-04 21:50 Updated by: yknk
  • New Ticket "macOS版 ディスプレイリンク対応" created
2019-11-04 21:52 Updated by: yknk
Comment

対策1:メインビューの独自描画スレッド廃止とディスプレイリンク導入

フレームワーク追加

利用するフレームワークに CoreVideo.framework を追加する。

Targets / MIDITrail / General
Linked Frameworks and Libraries

MTMainView

メンバ変数にOpenGLコンテキストとディスプレイリンクを追加(m_pOpenGLContext, m_DisplayLinkRef)。 FPS算出用メンバ変数を追加(m_PrevFPSUpdateTime, m_DrawCount)。

MTMainView::initWithFrame

追加したメンバ変数の初期化処理を追加。

MTMainView::dealloc

ディスプレイリンクの解放処理を追加。

MTMainView::prepareOpenGL

基底クラスのメソッド呼び出し [super prepareOpenGL] を追加。これまで呼び出し忘れていた。 ディスプレイリンクの生成と初期設定の処理を追加。

MTMainView::startScene

描画スレッド起動処理を削除して、ディスプレイリンク開始処理を追加。 FPS算出用メンバ変数初期化処理を追加。

MTMainView::stopScene

描画スレッドへのメッセージ送信処理を削除して、ディスプレイリンク停止処理を追加。

MTMainView::pauseScene

シーン一時停止メソッドを追加。 ディスプレイリンク処理を停止する。

MTMainView::resumeScene

シーン再開メソッドを追加。 ディスプレイリンク処理を開始する。 FPS算出用メンバ変数初期化処理を追加。

DisplayLinkCallback

ディスプレイリンクコールバック関数を追加。 ディスプレイリンクのスレッドから呼び出される。 シーン描画処理を実行する。

MTMainView::thread_DrawScene

これまで独自スレッドでシーン描画処理のループを行なっていたが、 ループを取りやめ、描画処理を1回実施するだけで終了とする。 OpenGLコンテキストのロックとコンテキストの取得を、シーン描画処理の最上位に位置する本メソッドで行う。

MTMainView::thread_DrawProc

OpenGLコンテキストのロックとコンテキストの取得を上位メソッドに移管するため、本メソッドから削除する。

MTMainView::thread_ExecSceneMsg

シーン停止のメッセージ対応処理を削除。 ディスプレイリンクの停止により、描画スレッドを停止することができるようになったため。

MTMainView::thread_WaitInterval

独自スレッドでループする際の待機メソッドを削除。

MTMainView::thread_UpdateFPS

独自スレッドを廃止したことに伴い、FPSの算出ロジックを変更。

(Edited, 2019-11-04 22:06 Updated by: yknk)
2019-11-04 21:54 Updated by: yknk
Comment

対策2:フルスクリーン表示の修正ほか

MTMainWindowCtrl::windowWillEnterFullScreen

フルスクリーン開始前にシーンの一時停止メソッド呼び出しを追加する。(ディスプレイリンク停止)

MTMainWindowCtrl::windowDidEnterFullScreen

フルスクリーン開始後にシーンの再開メソッド呼び出しを追加する。(ディスプレイリンク開始)

MTMainWindowCtrl::windowWillExitFullScreen

フルスクリーン終了前にシーンの一時停止メソッド呼び出しを追加する。(ディスプレイリンク停止)

MTMainWindowCtrl::windowDidExitFullScreen

フルスクリーン終了後にシーンの再開メソッド呼び出しを追加する。(ディスプレイリンク開始)

MTMainWindowCtrl::timerControl

スペルミスを修正(リファクタリング)。ただしこの処理が呼び出されることはない。

変更前:pTitle = @"MIDItrail";
変更後:pTitle = @"MIDITrail";

MTSceneMsgStopScene

シーン停止メッセージクラスを削除。

(Edited, 2019-11-04 21:57 Updated by: yknk)
2019-11-07 01:30 Updated by: yknk
  • Status Update from Open to Closed
  • Resolution Update from None to Fixed

Attachment File List

No attachments

Edit

Please login to add comment to this ticket » Login