Ticket #210 (closed 不具合: fixed)

Opened 3 years ago

Last modified 3 years ago

半透明フレーム内での描画の反応が遅い

Reported by: horiguti Assigned to: horiguti
Priority: major Milestone:
Component: UI Version: 3.00 (開発中)
Keywords: Cc:

Description

ticket:197 からの派生.
半透明フレームにした際にカーソルの追従が極端に悪化することがある. 環境による差が激しく, システムカレットのほうがemacs-cusor(?)より反応がよかったり, その逆だったり, そもそもあまり悪くなかったりほとんどついてこなかったりと状況が一定しない.
カーソルの追従が悪い場合でもたとえば右移動を続けていると行頭ごとにカーソルが表示されたり, そもそも下移動だとちゃんと追従したりしていることから, 何らかの解決法はあるものと思われるが現在のところ不明.
ごまかしのように w32-update-alpha-hint をつけているが, この設定によって若干状況が改善することもあるらしい.

Attachments

Change History

2005年10月21日 16時42分44秒 changed by horiguti

  • status changed from new to assigned.

カーソルの横移動の時には direct_output_forward_char()が呼ばれていて, これを呼び出すと redisplay_performed_directly_p が true となるので redisplay() で画面の更新が行われないということのようです.
このフラグを false にするか, ここで mw32_update_frame_alpha() を呼ぶかということになると思いますが, 見通しがよいのでここで mw32_udpate_frame_alpha() を呼ぶことにしてみました.
r3927 です.

2005年10月25日 18時37分21秒 changed by shirai

最近、なんだかC-n, C-p がめちゃくちゃ遅いなぁと思ったら、半透明が原因でした。

(set-frame-parameter (selected-frame) 'alpha '(100 100 50 50))

みたいにして、移動時とかだけ半透明にしていたのだけど、普通に frame が active な状態でも、すさまじく遅くなってしまうときがあります。

OS の違いかどうかわからないけど、XP な PC だとそんなに気にならないのだけど、2000 だとお話にならないぐらいカーソルの移動もスクロールアップ/ダウンの画面の書き換えも遅く感じます。

(setq mw32-update-alpha-hint 2) とすると、少しはましになります。

ぼくには根本な原因/解決方法はまったくわかりませんが、

(set-frame-parameter (selected-frame) 'alpha '(nil 90 50 50))

みたいに、nil にしたらその状態の間は一切半透明な処理を行わない、ってのはできませんか?遅くて気になるのは frame が active なときだけでしょうから。

# または、100 でも nil 扱いをする、とか。

2005年10月26日 20時31分12秒 changed by horiguti

alpha 指定がリストのときに値として nil を許すようにしました. r3929 です.

リスト中に nil を入れたときはもしかすると不透明度が変わる瞬間に固まる可能性がありますのでテストのつもりでいじってもらえますか?

=====
nil と 100 とが違う扱いになっている理由は, 最初のころに SetWindowLong?() で WS_EX_LAYERED の ON/OFF をalpha が100 かそうでないかの境目でやっていたらかなり高確率で固まるため, なるべくこの切り替えをさけようとしたためです.

とりあえず SetLayeredWindowAttributes?(w,0,0,0) を直前に実行すると固まらなくなるようなのでこれで試してみます. 理由はまったくわかっていません:-p

layered windowの切り替えは alpha値の変更に比べて大幅に高コストだと思っているので, nil と 100 の区別は残しますが, リスト中の nil と数の混在は正しく処理するようにしています.

それにしてもまたカーソルの反応が悪くなってる. WM_PAINT を発生させればよいというわけでもないらしい.. いったいどういう条件で描画が表示に反映されるのかがさっぱりわからん-_-#

2005年10月26日 21時11分55秒 changed by horiguti

リスト中に nil を入れたときはもしかすると不透明度が変わる瞬間に固まる可能性がありますので

こう書いたとたんに固まるようになった... ずっと固まらなかったのに..
固まる場所が常に main thread からの呼び出しのようなので, main thread からは不透明度の更新を行わないようにしました. r3930.

結構いじめていますが固まらないようです.

# 相変わらず状況を理解していません;_;

2005年10月26日 21時59分49秒 changed by horiguti

どうやらウィンドウプロシージャの中から呼ばないと機嫌が悪くなるようです. r3931 でメインスレッドでの呼び出しを全部ウィンドウスレッドに転送して実行するようにしたら機嫌がいいようです.

さて大丈夫か..

2005年12月14日 00時50分01秒 changed by horiguti

  • status changed from assigned to closed.
  • resolution set to fixed.

Meadowの半透明フレームで描画の反映が行われない理由はhdcのReleaseを行っていないためでした. r3930あたりまでのMeadowでは hdc は Meaodw 内部でプールされて数が増えすぎるまで使い回しされていました. このため, 適当な理由でつかんでいるhdcを解放するまで描画の反映が行われなかったようです.

r3978 で hdc を本則どおり描画区間の開始時に確保して終了時に解放するようにすることで半透明フレームへの描画の反映が正しく行われるようになりました. これに伴って無理やりな描画の反映方法は不要になっています.

これをもってこの件自体はクローズとします.


Add/Change #210 (半透明フレーム内での描画の反応が遅い)




Change Properties
Action