-
Notifications
You must be signed in to change notification settings - Fork 163
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
キャレット位置の文字情報をステータスバーに設定する際の再描画をまとめる #1601
Conversation
✅ Build sakura 1.0.3589 completed (commit c344aa247c by @beru) |
ざっくり2件の指摘が上がっています。
修正内容は見てるので「ええっ!」って感想も分かりますが、なるたけ対応したいです。 |
については元のコードがそういう記述内容なのでそっとしておきたいです。
に関してはもっともな指摘だと思います。ここはラムダ式を使わずに do while ループに変更します。 |
しかし このPRの本来の意図はそのメソッド等に入れた変更で再描画回数を減らして処理負荷を下げる事ですが、拡張スタイル |
✅ Build sakura 1.0.3591 completed (commit bd0eef7727 by @beru) |
✅ Build sakura 1.0.3593 completed (commit a506268168 by @beru) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
…に変更し、拡張スタイルに WS_EX_COMPOSITED を指定する事で表示のちらつきを解消
73d95c3
to
12efc8c
Compare
|
Kudos, SonarCloud Quality Gate passed! |
✅ Build sakura 1.0.3615 completed (commit 558789a3b1 by @beru) |
レビューありがとうございました。Mergeします。 |
…ow の呼び出しが必要なのに漏れていたのを修正
PR の目的
カーソルキーを押してキャレット位置を変えるとステータスバーの表示が更新されますが、その処理を効率化するのが目的です。
カテゴリ
PR の背景
開発環境(Visual Studio)のメニューの Debug > Performance Profiler で CPU Usage にチェックを付けて Start をして、どこの処理に時間が掛かっているのかを確認する事が出来ます。
キャレット位置の文字情報をステータスバーに設定する際に呼び出される
CMainStatusBar::SetStatusText
におけるStatusBar_SetText
に結構処理時間が掛かっていたので対策を行いました。PR のメリット
キャレット位置変更時にステータスバーの更新を行う際の処理が効率化されます。
処理を効率化する事でCPU使用率が下がるのではないかと思います。
PR のデメリット (トレードオフとかあれば)
記述が増える事で処理内容が読み取りにくくなります。
元々そこまで目立って重たい処理でも無いので、変更によって処理が軽くなったかを体感できるかというと出来ません。
仕様・動作説明
StatusBar_SetText
の実装はSB_SETTEXT
メッセージをSendMessage
関数で送るものです。https://docs.microsoft.com/en-us/windows/win32/controls/sb-settext#remarks
によると、
と書かれていたのでおそらく内部で
InvalidateRect
しているように思えます。このPRの変更では
WM_SETREDRAW
メッセージを使う事でステータスバーの各パートに文字列を設定する際に個々に描画を行われる事を防ぎます。また各パートに文字列が設定された場合は各パートのRECT領域を取得して結合し、後でInvalidateRect
を呼び出す事で再描画をまとめる事で表示処理の効率化を図ります。描画をまとめて行う事で、カーソルキーを押しっぱなしにした場合のステータスバーの表示のちらつきが無くなるかというと、残念ながらそんな事は無いようです。追記:拡張スタイル
WS_EX_COMPOSITED
を使う事でステータスバーの表示のちらつきを解消しました。PR の影響範囲
テスト内容
テスト1
手順
関連 issue, PR
#1592, #1265, #1246, #452
参考資料
https://docs.microsoft.com/en-us/windows/win32/controls/sb-getrect
https://docs.microsoft.com/en-us/windows/win32/controls/sb-settext
https://docs.microsoft.com/en-us/windows/win32/gdi/wm-setredraw
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-invalidaterect
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-unionrect
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-createwindowexw
https://docs.microsoft.com/en-us/windows/win32/winmsg/extended-window-styles