Skip to content
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

ノート線描画、指定桁縦線描画、折り返し桁縦線描画、を行毎ではなく一括で行うように変更 #1065

Merged
merged 1 commit into from
Oct 5, 2019

Conversation

beru
Copy link
Contributor

@beru beru commented Oct 4, 2019

PR の目的

描画処理の負荷軽減&高速化が目的で以下の変更を行いました。

  • CEditView::DrawLogicLine のローカル変数で SColorStrategyInfo 型のインスタンスを用意するのではなく引数で渡すように変更

    • CEditView::DrawLogicLine メソッドのローカル変数にしてしまうと、インスタンスの破棄が論理行毎に行われます。SColorStrategyInfo::m_gr の型が CGraphics で解放処理が比較的重いようです。
  • ノート線描画、指定桁縦線描画、折り返し桁縦線描画 は CEditView::DrawLayoutLine 内で行毎に行うのではなく、CEditView::OnPaint2 において一括で行うように変更

    • 一括で行うようにしても問題が無いと思います。行毎に呼び出すのではなく一括で描画するようにすれば呼び出し回数が減るので処理負荷を下げる事が出来ます。

カテゴリ

  • 速度向上

PR の背景

Performance Profiler で確認すると描画処理の割合がかなり大きいので、少しでも減らせないかと対策を入れました。

PR のメリット

同等の処理をより少ない負担で行えるようになるので軽くなります。

PR のデメリット (トレードオフとかあれば)

不明

PR の影響範囲

描画処理

関連チケット

#998

…なく引数で渡すように変更

ノート線描画、指定桁縦線描画、折り返し桁縦線描画 は CEditView::DrawLayoutLine 内で行毎に行うのではなく、CEditView::OnPaint2 において一括で行うように変更
@beru beru added the 🚅 speed up 🚀 高速化 label Oct 4, 2019
@AppVeyorBot
Copy link

Build sakura 1.0.2290 completed (commit 07981aab17 by @beru)

Copy link
Contributor

@berryzplus berryzplus left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

基本GOで 😃

変更内容が理解できてるかどうかに自信がないので、コメント付けて変更内容を分析してみます。

目的の分析

描画処理の負荷軽減&高速化が目的で以下の変更を行いました。

「以下の変更」が文章になってるのを「◎◎の△△」に書き替えてみます。

  1. CGraphics生成のタイミングを変更
  2. 線描画のタイミングを変更

細かい内容は個別に分析するとして、タイミングを変えた、と言ってるように見えました。

CGraphics生成のタイミング

•CEditView::DrawLogicLine のローカル変数で SColorStrategyInfo 型のインスタンスを用意するのではなく引数で渡すように変更
◦CEditView::DrawLogicLine メソッドのローカル変数にしてしまうと、インスタンスの破棄が論理行毎に行われます。 SColorStrategyInfo::m_gr の型が CGraphics で解放処理が比較的重いようです。

引用文の最後部分を太字に変えています。
構造的にこんな感じの理由付けで、SColorStrategyInfoの宣言位置を変えたのかな?と思いました。

  • CGraphics の デストラクタ が重い!( ⇒呼出回数を減らしたい。
    • SColorStrategyInfo には CGraphics 型のメンバがある
      • CGraphics の デストラクタ 呼出回数を減らすには SColorStrategyInfo の変更も必要。
        • SColorStrategyInfo の生成&破棄タイミングを変えて、破棄回数を減らしたい!

この変更内容について、特に問題はなさそうに思います。

SColorStrategyInfo::m_gr の型を CGraphicsCGraphics& としたら
あと1つデストラクタの呼出回数を減らせるような気がしますが、
SColorStrategyInfo のコンストラクタを変えにゃならんのを「面倒」と取るかどうかが焦点かな。

線描画のタイミング

•ノート線描画、指定桁縦線描画、折り返し桁縦線描画 は CEditView::DrawLayoutLine 内で行毎に行うのではなく、CEditView::OnPaint2 において一括で行うように変更
◦一括で行うようにしても問題が無いと思います。行毎に呼び出すのではなく一括で描画するようにすれば呼び出し回数が減るので処理負荷を下げる事が出来ます。

線描画は、始点と終点を定義して行う処理なので、
行ごとに描画するよりも画面全体で行うほうが効率は良いと思います。

考慮すべきポイントは2つあると思います。

  • 線描画のタイミングを変える、は 描き順を変える です。
    • 描き順が変わる影響として、従来描画されなかったケースで線が描画されるパターンがあり得ます。
      • 具体的には、変更前は選択領域を反転描画する前に線を描いていましたが、変更後は選択領域を反転描画した後に線を描くように変わります。
        • ざっと見、影響なさげなので問題ないと思います。
  • 一括描画が可能なのは 縦線 だけです。
    • 変更対象の線種のうち、 ノート線は横線 です。
      • 横線描画は行単位に行う必要があるので、説明と矛盾しています。
    • あと、せっかく一括描画にしたのに、描画行数分繰り返してるような気がしました。
      • これはあとでコメント入れます。

総括

全体として、大きな問題はなさそうだと思っとります。

sakura_core/view/CEditView_Paint.cpp Show resolved Hide resolved
@beru
Copy link
Contributor Author

beru commented Oct 5, 2019

考慮すべきポイントは2つあると思います。

  • 線描画のタイミングを変える、は 描き順を変える です。

    • 描き順が変わる影響として、従来描画されなかったケースで線が描画されるパターンがあり得ます。

      • 具体的には、変更前は選択領域を反転描画する前に線を描いていましたが、変更後は選択領域を反転描画した後に線を描くように変わります。

        • ざっと見、影響なさげなので問題ないと思います。

その懸念は自分も有りました。ただ実際に見比べてみると変化が無いように見えます。

  • 一括描画が可能なのは 縦線 だけです。

    • 変更対象の線種のうち、 ノート線は横線 です。

      • 横線描画は行単位に行う必要があるので、説明と矛盾しています。

変更前後を比較すると同じように描画されているようにみえます。

ノート線描画処理 CTextDrawer::DispNoteLine のコードを確認すると for ループを使って複数行の線を描く実装になっていました。

@berryzplus
Copy link
Contributor

ノート線描画処理 CTextDrawer::DispNoteLine のコードを確認すると for ループを使って複数行の線を描く実装になっていました。

どちらかというと関数名が誤っている雰囲気なんですね。

誤) CTextDrawer::DispNoteLine
正) CTextDrawer::DispNoteLines

指定桁縦線描画は DispVerticalLines で、複数の線を引くことを示すために s が付いとります。
このPRに含めるべき、とは思いませんが、どっかで直したい感じです。

pInfo->m_pDispPos->GetDrawPos().y,
pInfo->m_pDispPos->GetDrawPos().y + nLineHeight,
CLayoutInt(0),
CLayoutInt(-1)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

う~む、もとからこういう引数指定なのか・・・。

y0,
y1,
CLayoutInt(0),
CLayoutInt(-1)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここの第4引数、第5引数(=最後の引数)は、描画対象の水平方向の範囲を桁単位で指定します。
もとの実装と変えてないっぽいので「修正すべき」かどうかは微妙ですが、
速度重視だと以下のようになる気がします。

GetTextDrawer().DispVerticalLines(
	pInfo->m_gr,
	y0,
	y1,
	GetTextArea().GetViewLeftCol(),
	GetTextArea().GetRightCol()
);

うわ、書いてみるとすっげーダサいw
(左端桁取得と右端桁取得のメソッド名に統一感がない)

まぁ一応、DispVerticalLines関数内部に同じ意味になるような細工が仕込まれているので、実影響はないと思うんですが、意図が分かりにくいと思うのでどっかで変えたいな、と思っています。

話がややこしくなるから、今回は放置っすかねぇ・・・。

Copy link
Contributor

@berryzplus berryzplus left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

疑問点は解消したので review を更新します。

@beru
Copy link
Contributor Author

beru commented Oct 5, 2019

レビューありがとうございました。マージします。
もし問題が見つかったら別のPRで対処します。

@usagisita
Copy link
Contributor

こっちはCloseされているから、ここに書くべきなのかは分かりませんが、

具体的には、変更前は選択領域を反転描画する前に線を描いていましたが、変更後は選択領域を反転描画した後に線を描くように変わります。

  • 選択範囲の色分けをOFF
  • 句読点や改行ぶら下げをON、またノート線をON
  • 折り返しを超える範囲を起こるように文字列選択する
     マウスや左右キーで選択するとDrawSelectArea2側処理で反転します。
    sakura_screen_shot_01
  • 「F5」で再描画
     OnPaint処理になるので、反転範囲の線が反転していません。
     この状況はスクロールとかすれば普通に発生します。
    sakura_screen_shot_02
  • 選択範囲を左右キーなどで変更する(DrawSelectArea2)
    sakura_screen_shot_03

 こうすると反転しないで描画した線が戻す処理の際に反転してしまいます。
 描画の反転処理はOnPaintと、CViewSelect::DrawSelectArea2の2か所にあるためで、描画内のカーソル位置下線、縦線以外、すべての選択範囲は反転処理される必要があるらしいです。
 オプションが多いサクラエディタでは、ややこしいですが、こういうレガシー的機能もあるので、御考慮願います。。。

@beru
Copy link
Contributor Author

beru commented Jan 16, 2020

#1072 で revert されたので reverted ラベルを付加しました。
また no-changelog ラベルも付加しました。

HoppingTappy pushed a commit to HoppingTappy/sakura that referenced this pull request Jun 16, 2020
ノート線描画、指定桁縦線描画、折り返し桁縦線描画、を行毎ではなく一括で行うように変更
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🚅 speed up 🚀 高速化 no-changelog 【ChangeLog除外】 reverted
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants