再描画

Windows2000WindowsXPを使っていて、なんだかWindowの再描画だけでやけにCPU使用率が上がるなぁ、、とタスクマネージャを眺めてて思った。タスクマネージャのWindowを、デスクトップを背景にしてマウスを振ってみると、後ろにアイコンがたくさんある場合はCPU使用率が高くなるけれど、背景にアイコンが全く無い場所ではCPU使用率がかなり低くなる。アイコンを毎回描画しているっぽい。IE6sp2でhttp://www.google.co.jpを表示して同じ事を行うと、頁上部の要素があるところだとCPU使用率が高くなるけれど、頁下部の背景が単色で何も無い所ではCPU使用率が結構低くなる。Firefox1.5の場合、頁上部でIEよりCPU使用率が少し高く、頁下部でも頁上部よりほんの少し低いCPU使用率にしかならない。FirefoxIEよりなんとなく重く感じているので日頃使っていないんだけれど、こういうのも影響しているんだろうか?

昔Uvaっていうプログラミング言語を使ってた頃、UvaはVBと同じく描画内容を自動的に覚えてくれるので再描画をプログラムで明示的にやらなくて良かったような気がした。それをオフ会でfumioさんに話してみたら、Windowの再描画を効率的にやるには各Windowが表示する内容をあらかじめて覚えておくのが良いけれど、昔はメモリーが少なかったので…なんて事を教えてもらった事がある。Windowsのプログラムはそれを全体的に引き摺っているのかな?それとも、WindowsのDesktopやExploreやBrowserはHost的なWindowなので、包含している内容物の絵をBackBufferに貯める事を意図的にしていないんだろうか?

各Windowがそれぞれの絵を全部VRAMに納めていたら、再描画のコストは低くなるかもしれないけれど、CPUからは遠いのでCPUで走らせるプログラムが直接描画を行うには不向きな感じがする。(ハードウェアのアーキテクチャによっては問題が無いかもしれないけれど。)
あと、Windowをいっぱい出したらその数分の絵を馬鹿正直に全てVRAMに収めるなんてアホらしい。

今扱っているWindowの上下のZorderのWindow群の絵を合成したものを纏めて利用るのがいいんだろうか?でもそれも、他のWindowの見た目が随時変化する場合は無理だ…。

まぁマルチウィンドウのシステムで各Windowの大きさや変化、重なり具合や透明度含めて、どういう時にどういう再描画が必要になってどうやると効率的なのか、っていう事は既に考えつくされてるのかもしれない。何でも万能っていう手法はきっとなくて、メモリの使用量とかの制約に合わせた手法と、それを具現化したフレームワークも今までに色々と考えられて実装されているんだろう。

出来るだけ描かないのが一番負担が少ないし、描く限りは無駄な二度描きはしたくない。だけれどそれぞれのWindowが独自に描画することを考えると、無駄とも思える描画の発生も許容せざるをえないのかな…。今のところ、WindowsではそれぞれのWindowに自分の再描画の責任を割り振る事によって、ある意味絶縁性を保っているのかな。