2010-04-17スマートフォン用の表示で見るとあるソフトの開発記録この広告は、90日以上更新していないブログに表示しています。Writerから投稿してみる。(UpdateLayeredWindow)を利用したソフトを開発しています。乗り換えたときにソフトウェアの挙動が変わった。変わったかというと、フレームレートが極端に落ちた。なめらかにアニメーションしなくなった。ティアリングしなくなった(アンチティアリング)。要するに、アニメーションは遅く・醜くなり、代わりに意図しない現象が起こるようになった。単なるフレームレート落ちであれば「7は遅いな」となるだけだが、今回は遅い上に安定しないのが謎だった。アンチティアリングとは、ディスプレイの更新周期とプログラムの更新周期を同期させて、ディスプレイのアニメーションなどを綺麗に見せる技術のこと。Synchronizeとか垂直同期などと呼んだ)だけど、エクセルなどの一般アプリでは「どうでもいい」ところで、Windowsも通常はティアリングしまくっていた。(アンチティアリングすると一般に性能が(極端に)落ちるので、必要なければしないほうがよい。7ではアプリ全体が自動的にアンチティアリングされているように見えた。これは、地味だが大きな変更だというのは分かった。ほうが影響の大きな変更が入ったはずだった(自作アプリはなんともなかったけど)。Manager)の導入である。Vistaから導入されたウインドウ描画領域を管理するシステムプログラムである。DWMが動作している環境では、アプリケーションが行う描画はすべてDWM管理下の描画領域にリダイレクトされ、実際のディスプレイへの表示はDWMが行う。DWMについては下記のリンクが詳しい。つの関数もありますが、この記事では説明しません。説明してない関数に答えがあった。C#用の関数宣言がある。Vista/7で描画周りの挙動が変わったのなら、DWM周りの影響に違いない。単純なGDI描画でのタイミングずれDWMが原因なら、DWMを切ればいい。Vista/7では、Aeroではない画面表示モードにするとDWMによる画面管理がオフになる。した上で、単純にタイマーでアニメーションするプログラムで検証した。このプログラムはそもそもレイヤードウインドウでもなく、クライアント領域を持つ普通のアプリである。擬似コードだが要は次のようなもの。的なことをしないのは、タイマーはずれるので、絶対時刻で位置決めしないといけないから。プロセッサが持つクロックレベル分解能の経過時間を得る関数。ところが、これを行っても相変わらず綺麗にアニメーションできない。いうことは、DWMだけが原因ではない??タイマー動作の確認DWMに原因がないとしたら、タイマーしか思い当たる節がない。いうわけで、タイマーが本当に意図通り動いているか、次のようなプログラムを用いて確認することにした。確認すると、まあだいたい意図した振る舞いをしているようだ。1ms程度の揺らぎはあるものの、1msの変化が目に見えるズレとして顕在化することはない。DWMでもなく、タイマーでもない。原因になる得るものがなく、困ってしまった。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。