C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 25 を表示中)
■11371 / )  Re[9]: ListViewのちらつき、仮想化について
□投稿者/ れい (299回)-(2007/12/12(Wed) 23:17:41)
2007/12/12(Wed) 23:23:34 編集(投稿者)

No11365 (NyaRuRu さん) に返信
> あと,「ちらつき」という言葉の曖昧さを避けるとすれば,現象を「フリッカ」と「ティアリング」に区別した方が良いのかもしれませんね.

「フリッカ」とは何を指すのでしょう?
「ティアリング」はかなり厳密な定義があると思うのですが、
それと並べられるほど厳密な定義を私は知りません。
教えていただけるとうれしいです。

> WinForms (というか Windows の描画モデル) の問題には,コントロール同士の重なり (*1) に起因する「ちらつき」もあって,こちらはたとえ Form の DoubleBuffered を有効にしても (*2) Windows XP では解消できません.

なんかちょっと私の理解と違います。

コントロール同士の重なりに起因するちらつきは
Control.DoubleBufferedで解消できる場合もあり、
できるかできないかはXPでもVistaでも関係ありません。

Control.DoubleBufferedはWS_EX_COMPOSITEDを指定するような実装になっていて、
これは自分および子の描画を全部ダブルバッファしてくれるものですから、
WS_EX_COMPOSITEDが効くならXPでもVistaでも解消できます。

ただ、WS_EX_COMPOSITEDはCS_OWNDCなどを持つウィンドウには効きません。
(これはいくつかのコモンコントロールが含まれます。)

ですから、Control.DoubleBufferedで「ちらつき」が解消できないとすれば
それはWS_EX_COMPOSITED or comctl32の問題で、XPもVistaも変わりません。

逆に、WS_EX_COMPOSITEDが効かないウィンドウはDoubleBufferedを適用しても、
XP、Vistaに関わらずちらつきます。
これは例えばTreeViewを使ってみればわかります。
Vistaでも十分にちらつきます。

> 「WinForms でのちらつき」=「ダブルバッファで解決……するはずがうまくいかない,なんで?」ということを Web で書いている人も多いですが,結構な割合がこのパターンかと思っています.

私は上記のWS_EX_COMPOSITEDの問題とティアリングと、2者が同等に多いように思います。

> なので個人的には「ちらつき」=「ダブルバッファで解決」みたいな,原因の理解を放棄したような図式は嫌いだったり.

条件反射的思考は確かに危険ですが、
かといって全ての物事の原因をいちいち考えるわけにもいきません。

原因を追究するのも人間の持つすばらしい能力ですが、
原因や理由の理解を取り敢えず置いておく能力や条件反射的思考のといった、
思考の簡略化もすばらしい能力であると思います。

#半導体のキャリア移動度を知らなくてもプログラミングはできますし、
#TCAサイクルを知らなくてもご飯を食べないと死んでしまうのはわかります。
#九九を暗記してなければ私はまともに掛け算もできません。

#カプセル化も思考の簡略化そのものですよね。

いつ、どのように、どこまで省くのか、理解するのかが重要かと思います。

#「ちらつき」=「ダブルバッファで解決」
#「原因の理解を放棄したような図式」=「ダメ」
#この2者は何が違うんでしょうか?

今回は「ちらつき」「ListView」「仮想化」という単語が並んでいて、
「ダブルバッファ」が一回も出てこないなら、
「してみたら?」と原因も考えずに言うのも価値はありかなと思います。
知らないかもしれないし。

同様に、ちらつくなら取り敢えずダブルバッファしてみるのも価値ありだとと思います。
効いたらOKですし、効かないなら効かないで、ちらつく原因を知る一助になります。

む〜ちょさんがどういう状況なのか、いまいちわかりませんが、
おそらくきちんとダブルバッファされてないのだと思っています。
きちんとダブルバッファされてるなら、
「ちらつく」という言葉の定義が私と違うので、
どうちらつくのか説明がほしいです。

返信 編集キー/


管理者用

- Child Tree -