-
Notifications
You must be signed in to change notification settings - Fork 165
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
メモリDCを利用しない場合はアンダーライン描画を行描画の直後に行う事でちらつきを抑える #1616
メモリDCを利用しない場合はアンダーライン描画を行描画の直後に行う事でちらつきを抑える #1616
Conversation
✅ Build sakura 1.0.3635 completed (commit 5a39b81299 by @beru) |
PR説明を読んで分からなかったことが2つあります。
アンダーセンの描画を行描画の直後に行うように「変更する」ってことは、 あとは、メモリDCを使わない、にしている人が期待する動作がどうであるのかが気になります。 メモリDCってのは、描画を最適化して高速に画面表示を行うためのオプションです。 と考えると、メモリDCを使わない場合に画面がちらつくことがあるのは、仕様じゃね?と思えてきます。 コマ落ちの原因が描画手順がマズいことに起因するなら、それは直したほうがいいと思います。 |
「ちらつく」というのがどういう現象かというのをどうわかりやすく表現するかを過去に考えて #1592 (comment) で書いたのでコピペします(問題が起きてrevertしたPRでの発言なので説得力に乏しいですが…)。 ソフトウェア側が色々と描画を行いますが、きりの良いタイミングで表示の更新が行われない場合に、本来は表示するべきではない描画途中の絵が一時的に画面表示されてしまい、それをユーザーがちらつきと感じるんだと思います。 他の言い方だと、不自然なモニタの明暗の変化が短時間に起きるのがいらつきの原因になります。:angry:
「なんか別なこと」というのは「後続行の描画」と「ルーラー描画」です。そのうちの「後続行の描画」にある程度時間が掛かるのが要因だと思います。空行が連続するテキストだと同様のPageUp/PageDown操作を行ってもアンダーライン描画のちらつきは殆どおきません。
メモリDCを使わない場合は
Desktop Window Manager (DWM) 側ではオフスクリーンバッファを持っていると思うので待ってくれていたらなと思うんですが、そこは互換性の為なのかそういう処理はしてくれないようです。なおDWMやDWMとGDIの連携内容については全く調査しておらずわかりません。 GDIの話に戻りますが、メモリDCは
コマの作画途中の絵が一時的に表示される、がより正しい表現ですかね。 メモリDCを使わない場合でも画面要素の描画順を調整する事で画面表示のちらつきを減らせる事を確認したのでPRを作りました。
メモリDCを使う場合の描画手順は元のままにしています。メモリDCを使う場合と使わない場合で処理を変えているのでソースコードの記述が増えてしまっているのは良くない点だと思います。 なおメモリDCを使う場合は描画途中の絵が画面に表示されないので、メモリDCを使わない場合と同じように描画順を変えても問題は起きないと思います。それならばメモリDCを使う場合でも使わない場合でも同じ描画手順で揃えた方が良いかもしれないですね。 共通設定の「画面キャッシュを使う」設定を有効にして使えば良いんじゃないの?と言われたら反論しにくいんですが、この設定を有効にすると少し処理が重くなる箇所もあるんですよね。例えばスクロールバーをドラッグしてスクロールする際に |
一旦整理。 1.「ちらつく」の原因
で、approveしようとしたんですが「メモリDC を使わない場合だけに影響する修正」には見えませんでした。 本当に影響がないかどうかはちゃんと見れていませんが。 |
具体的にどこの差分を見てそう思われましたか? |
sakura_core/view/CEditView_Paint.cpp
Outdated
@@ -844,16 +855,15 @@ void CEditView::OnPaint2( HDC _hdc, PAINTSTRUCT *pPs, BOOL bDrawFromComptibleBmp | |||
pPs->rcPaint.top, | |||
SRCCOPY | |||
); | |||
// From Here 2007.09.09 Moca 互換BMPによる画面バッファ | |||
// アンダーライン描画をメモリDCからのコピー前処理から後に移動 | |||
if ( m_pcEditWnd->GetActivePane() == m_nMyIndex ){ |
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.
修正3箇所中の2個目、ここがメモリDCを使う場合の処理に見えます。
- メモリDCを使わない場合の処理を追加。
- スコープ外にあった処理を移動(追加)
- スコープ外にあった処理を移動(削除)
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.
コメントありがとうございます。ちょっと紛らわしいですが、2. と 3. は合わせて移動的な変更でした。
メモリDC使わない場合のアンダーライン描画を行描画ループの中に追加したので、元のアンダーライン描画はメモリDCを使う場合にのみ実行するようにしました。そしてちょうど上の方にそのif文の記述があったのでそのスコープ内にさっさと引っ越しさせました。
変更後の動作を見ていたところ、タイプ別設定で「カーソル位置縦線」を表示させる設定をした状態で PageUp/Down 操作をすると、カーソル行より下にある縦線が消えてしまいました。 |
単に「メモリDCを使わない場合には影響しない」と書いてあったことに引っ掛かっていました。(これはぼくの気のせいかもしれません。
今見たら「動作は変わらない」になってたので問題なしです。 |
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.
少なくとも2件は今回追加(移動)したコードで発生したもので、容易に対処可能だと思います。
最初の2件は「ぼく知らねっす」で合意。
PageUp/Down で移動した先のキャレット位置に括弧がある (=対括弧の強調表示がされる) と、その場合はなぜかこの縦線が消える現象は起きませんでした。 |
対括弧の描画は、通常の描画とは別になっています。 |
行間を0以下にすると、カーソル行アンダーラインの位置が一つ下の行に含まれるようになるため、レンダリングの対象行が変わってしまい、PageUp/PageDownなどでアンダーラインが消えてしまうようです。 |
ん? 「行間を0以下にすると」 これが正しいとすると、ちらつきを抑えるのは無理だね、な結論になります。 個人的には正しくないんじゃね?と思っています。 |
どっちにしても指定桁縦線の描画に問題が出ることが分かったので、 |
僕は原理主義者ではないので「正しいか」は知りませんが…… |
カーソル位置縦線ではアルマイカ |
66f5d68 (patchunicode#713)でGetDlgItemIntの第4引数(符号付き整数とみなすかどうか)をTRUEに変更しています。 |
あーでもない、こーでもない、と考えても時間の無駄にするような気がします。 個人的には、事象を白か黒のいずれかに色分けして、「悪・即・斬」するのが分かりやすいと思います。
自分のは、あんまし深く考えたコメントではなかったです。 なんとなく「0(=行間なし)」を指定できるのは「正しい」気がします。 設定値ゼロのときにアンダーラインが次行に被るのはマズいような気がします。 メイリオ的な事情で、行間に負数を指定できたほうが都合がよいこともある、は理解しました。 みなさん優しくて、メイリオ的な事情に対して「知るかヴォケ!」とは言わない気がするので、 |
おぉ、不具合報告ありがとうございます。コメントに書いていただいた問題が起きることを確認しました。 昔も似たような不具合出したような既視感があって検索しました。おそらくhttps://github.com/sakura-editor/sakura/pull/1065#issuecomment-539565600。 |
こちらの不具合報告もありがとうございます。コメントに書いていただいた問題が起きることを確認しました。 |
行の間隔の設定値を負の値にすると行の下側が下の行に上書きされて切れてしまいますね。行単位に背景色で塗りつぶす描画を行っているからだと思いますが、テキストが切れないように重ね描きする方が奇麗な気がします。その設定に実用性があるかは置いておいて…。 |
Kudos, SonarCloud Quality Gate passed! |
✅ Build sakura 1.0.3643 completed (commit d51049c9f6 by @beru) |
ad890c4 にて、カーソル位置縦線が消える問題が解消されたことを確認しました。 |
レビューありがとうございます。Mergeします。 |
PR の目的
共通設定の全般の「画面キャッシュを使う」にチェックを入れていない場合に、PageUp/PageDownキーを押してスクロールする際にアンダーライン描画がちらつく現象が起きます。それを回避するのが目的です。
カテゴリ
PR の背景
共通設定の全般の「画面キャッシュを使う」にチェックを入れていない場合はメモリDCが使われません。メモリDCを使わないと描画途中の絵が画面に表示される事がありちらつきが起きやすいです。
このPRでは、アンダーライン位置の行の描画直後にアンダーライン描画を行う事で、同じ位置にある要素が近いタイミングで描画されるように処理を調整してちらつきが起きにくいようにしています。
PR のメリット
表示のちらつきが減る
PR のデメリット (トレードオフとかあれば)
ちらつきを減らす対処を入れた分のコードの記述が増えてしまう。
仕様・動作説明
PR の影響範囲
アンダーライン描画に影響します。
共通設定の全般の「画面キャッシュを使う」にチェックを入れている場合の動作は従来と変わりません。
テスト内容
テスト1
手順
sakura_core\CGrepAgent.cpp
を開く