-
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
PageUp, PageDown 時に描画する必要が無い場合は描画しないようにする判定を追加 #1320
Conversation
❌ Build sakura 1.0.2856 failed (commit be9cd3a04e by @beru) |
✅ Build sakura 1.0.2857 completed (commit be9cd3a04e by @beru) |
/azp run |
Azure Pipelines successfully started running 1 pipeline(s). |
なんかビルドが完了してなかったみたいなので放置していました。 |
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.
空の Azure Pipelines ビルドが登録されてしまってるようなのでビルド完了は無理そうです。
ざっと見た感じ、とくに問題はなさそうに見えます。
おそらく本質的な問題は RedrawAll
を呼び出す実装になってることなので、SetDrawSwitch(false)
をやめる方向の修正にしたら分岐とか必要なくなる気がしました。
質問1点と修正提案2件がありますので対応よろしくです。
CLayoutInt nViewTopLine = m_pCommanderView->GetTextArea().GetViewTopLine(); | ||
const bool bDrawSwitchOld = m_pCommanderView->SetDrawSwitch(false); |
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.
質問です。
この実行時定数の宣言位置を移動したことについて、何か理由がありますか?
変更前739行目が描画と関係ない処理だから、という理由だとすると、
もっと下まで描画には関係ない処理なので、移動先が違うような気がします。
(変更前742行目までは描画と関係ないっす。)
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.
理由は覚えていませんが今見返すと特に移動する必要性が無いように見えますね。
元の位置に戻しておきます。
CLayoutInt nViewTopLine = m_pCommanderView->GetTextArea().GetViewTopLine(); | ||
const bool bDrawSwitchOld = m_pCommanderView->SetDrawSwitch(false); |
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.
同上です。
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.
元の位置に戻しておきます。
auto& caret = GetCaret(); | ||
auto prevCaretPos = caret.GetCaretLayoutPos(); | ||
caret.Cursor_UPDOWN( -nScrollNum, bSelect ); | ||
auto currCaretPos = caret.GetCaretLayoutPos(); | ||
// Sep. 11, 2004 genta 同期スクロール処理のため | ||
// m_pCommanderView->RedrawAllではなくScrollAtを使うように |
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.
既に実装とかけ離れた古いコメントは混乱の元になるので削るべきだと思います。
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.
なんかよくわかりませんが(このコメントとコードの関係性とか)削っておきます。
// Sep. 11, 2004 genta 同期スクロール処理のため | ||
// m_pCommanderView->RedrawAllではなくScrollAtを使うように | ||
m_pCommanderView->SyncScrollV( m_pCommanderView->ScrollAtV( nViewTopLine - nScrollNum )); | ||
CLayoutInt nScrolled = m_pCommanderView->ScrollAtV( nViewTopLine - nScrollNum ); |
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.
やや好みの問題ですが、正確には CLayoutYInt nScrolled
と思います。
めんどうなら auto nScrolled
でもよいです。
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.
そうなんですか? CEditView::ScrollAtV
の戻り値の型は CLayoutInt
ですが、どうして CLayoutYInt
にする方が正確なんでしょうか?
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.
ええと・・、「べき論」ではないんですが・・・。
CLayoutInt
型は、現在3つの意味で使われています。
例 | 正確な型 | 備考 |
---|---|---|
CLayoutInt nLines |
CLayoutYInt |
垂直方向のレイアウト単位(≒行)です |
CLayoutInt nPos |
CLayoutXInt |
水平方向のレイアウト単位(≒桁)です |
CLayoutInt tabPadding |
LONG |
水平方向の幅・ピクセル単位で、誤用です |
そんなに遠くない未来に CLayoutInt
の X,Y を区別するようにしたいと考えています。
「好みの問題」と言ってるように、いまその基準に合わせる必然はないっす。
m_pCommanderView->SetDrawSwitch(bDrawSwitchOld); | ||
if (prevCaretPos == currCaretPos && nScrolled == 0) { |
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.
メモ:カーソル位置が変化しなかった、かつ、スクロール行数が0だった場合
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.
せっかくなのでコメントを入れる事にします。
m_pCommanderView->SetDrawSwitch(bDrawSwitchOld); | ||
if (prevCaretPos == currCaretPos && nScrolled == 0) { | ||
return; | ||
} | ||
m_pCommanderView->RedrawAll(); |
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.
メモ:これがCPU使用率を上げてしまう、問題のあるコードです。
スクロール操作で再描画する必要がある領域はスクロール前に表示されていなかった被スクロール領域とスクロールバーだけなので一般的に描画領域の一部ですが、このコードではあえて全域を再描画しています。
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.
描画処理の最適化は本当は出来たら良いんですが、もう今の実装ごちゃごちゃしてて読み進めて理解して整理したり書き換えるの大変ですね。
大きく変更して改善(描画のパフォーマンスを劇的に上げるとか)しないとテキストエディタとして使い物にならないかっていうとそんな事も無いと思うので、今のままでも良いかなとか個人的に思ってます。
CViewCommander::Command_1PageUp と CViewCommander::Command_1PageDown で、キャレットの更新前後の位置が変化が無く、スクロール量も 0 の場合は CEditView::RedrawAll の呼び出しを行わないようにする
0b5f218
to
60e290f
Compare
✅ Build sakura 1.0.3068 completed (commit 7f1713be36 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.
問題ないと思います。
動作確認結果
sakura_rc.rc
を開いて、PageDown,PageUpキーを押しっぱなしにしてCPU使用率をチェック。
-- | PageDown | PageDown(下端到達後) | PageUp | PageUp(上端到達後) |
---|---|---|---|---|
変更前 | 20% | 20% | 20% | 20% |
変更後 | 20% | 6% | 20% | 6% |
レビュー有難うございました。Mergeします。 |
PR の目的
キャレットが画面の最上行にいる時に PageUp キーを押し続けた場合、もう画面の変化が無い場合にも描画を繰り返し行ってしまいます。キャレットが画面の最下行にいる時に PageDown キーを押し続けた場合も同様です。
このPRの目的は、画面の描画を行う必要が無い場合は行わないように判定する事で、プロセッサが無駄に動かないようにして消費電力を抑える事です。
カテゴリ
PR のメリット
描画を行う必要が無い場合に描画を省く事でプロセッサの使用率を下げる事が出来ます。
PR のデメリット (トレードオフとかあれば)
テスト内容
何かのテキストファイル(自分は
sakura_core\sakura_rc.rc
を使いました)を開いて、エディタのスクロール操作を行いました。テスト1
手順
PR の影響範囲
PageUp キー、PageDown キー押し時の処理