Search
Categories
Articles
Rainmeter関連
ファイル置き場
お知り合いなど

スポンサーサイト

--.--.-- | スポンサー広告

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[Rainmeter-dev] 負荷を減らす取り組み #3

2011.07.10 | Rainmeter-dev

0 Comments

r852, r856, r860 で、iniファイル読み込み部分のボトルネックを改善しました。

私の環境(Windows7 Professional x64, Phenom II X4 945 3.0GHz)でRainmeterの32bit版とOmnimo 4の1920x1080プリセットを使ってチェックして、2.0-r745で起動処理に 4.645秒かかっていたのが、2.1-r861では 1.101秒まで短縮されました。800MHz固定でも2.0-r745で 16.768秒、2.1-r861では 3.871秒で、3.0GHz固定+2.0-r745の場合よりも好結果になりました。

環境やiniファイル内の設定値によって短縮幅は変わると思いますが、たくさんのスキンを表示している環境では概ねそれなりの短縮になると思います。

iniファイルの読み出し部分は、まずiniファイルに定義されているすべてのセクションのキーと値を一度バッファリングし、そこから必要な値を取り出すという仕組みになっています(CConfigParser)。そのセクション・キー・値の実際の読み出しにGetPrivateProfileString関数を使っていたわけですが、この関数はファイル名と必要なキー情報などを渡すだけで設定値が取得できる便利な関数ではあるものの、1回の呼び出しごとにファイルをオープン・走査・クローズするため、Rainmeterのような何百行にも渡る設定を読み込もうとすると、非常にオーバーヘッドが大きくなっていました。また、各スキンの初期化にはスキン自身のファイルだけでなく、Rainmeter.iniの設定値(スキンの位置情報など)も必要なため、もしRainmeter.iniが巨大なサイズだったら、必要のないセクション情報のバッファリングという無駄な時間もスキンごとに加えられて、非常に時間がかかります。

2.1では、その読み出しバッファリング部分をセクションごとにまとめて読み込むGetPrivateProfileSection関数を使うように変更しました。この関数を使って得られた文字列を同じように使うことはできず、若干加工は必要でしたが(ダブルクォーテーションなどを取り除く、重複キーを無視するなど)、その処理を含んでも圧倒的に速いです。加えて、Rainmeter.iniからのスキン情報の読み出しについても、その用途に使う場合には不必要なセクションを読み込まないように変更しました。

2.0-r745 で3.0GHz固定にしたときの各処理時間(Omnimo 4 1920x1080):

0.00000000    [3968] Begin:
0.53327304    [3968] Refresh: 123.323 [ms] (Delete: 0.000 / ReadConf: 106.580 / ReadSkin: 11.674 / InitMM: 2.784 / Update: 0.632 / ScrToWin: 0.227 / WinDraw: 1.386 / ZPos: 0.039 / Blur: 0.000) :: WP7
0.70152634    [3968] Refresh: 166.677 [ms] (Delete: 0.000 / ReadConf: 99.560 / ReadSkin: 18.086 / InitMM: 0.403 / Update: 28.892 / ScrToWin: 0.304 / WinDraw: 19.215 / ZPos: 0.215 / Blur: 0.000) :: WP7\Background
0.94185102    [3968] Refresh: 220.942 [ms] (Delete: 0.000 / ReadConf: 104.932 / ReadSkin: 78.668 / InitMM: 34.122 / Update: 2.420 / ScrToWin: 0.297 / WinDraw: 0.470 / ZPos: 0.033 / Blur: 0.000) :: WP7\Panels\Calculator
1.14645600    [3968] Refresh: 202.764 [ms] (Delete: 0.000 / ReadConf: 103.832 / ReadSkin: 76.808 / InitMM: 18.458 / Update: 2.885 / ScrToWin: 0.230 / WinDraw: 0.515 / ZPos: 0.036 / Blur: 0.000) :: WP7\Panels\Date
1.35049486    [3968] Refresh: 202.159 [ms] (Delete: 0.000 / ReadConf: 103.152 / ReadSkin: 76.045 / InitMM: 17.464 / Update: 4.805 / ScrToWin: 0.187 / WinDraw: 0.485 / ZPos: 0.021 / Blur: 0.000) :: WP7\Panels\Donate
1.54991233    [3968] Refresh: 197.823 [ms] (Delete: 0.000 / ReadConf: 99.490 / ReadSkin: 79.105 / InitMM: 13.348 / Update: 4.951 / ScrToWin: 0.197 / WinDraw: 0.706 / ZPos: 0.024 / Blur: 0.000) :: WP7\Panels\FruitClock
1.73855186    [3968] Refresh: 186.892 [ms] (Delete: 0.000 / ReadConf: 99.157 / ReadSkin: 67.736 / InitMM: 17.005 / Update: 2.275 / ScrToWin: 0.196 / WinDraw: 0.496 / ZPos: 0.026 / Blur: 0.000) :: WP7\Panels\Internet
1.94327545    [3968] Refresh: 203.129 [ms] (Delete: 0.000 / ReadConf: 102.896 / ReadSkin: 82.281 / InitMM: 12.300 / Update: 4.934 / ScrToWin: 0.178 / WinDraw: 0.514 / ZPos: 0.024 / Blur: 0.000) :: WP7\Panels\Live
2.16145992    [3968] Refresh: 216.552 [ms] (Delete: 0.000 / ReadConf: 99.510 / ReadSkin: 82.431 / InitMM: 29.643 / Update: 4.115 / ScrToWin: 0.256 / WinDraw: 0.569 / ZPos: 0.029 / Blur: 0.000) :: WP7\Panels\Mail
2.37921739    [3968] Refresh: 216.138 [ms] (Delete: 0.000 / ReadConf: 112.161 / ReadSkin: 71.937 / InitMM: 27.395 / Update: 3.864 / ScrToWin: 0.269 / WinDraw: 0.476 / ZPos: 0.035 / Blur: 0.000) :: WP7\Panels\Marketplace
2.59491634    [3968] Refresh: 213.984 [ms] (Delete: 0.000 / ReadConf: 97.312 / ReadSkin: 98.631 / InitMM: 12.656 / Update: 4.573 / ScrToWin: 0.281 / WinDraw: 0.497 / ZPos: 0.033 / Blur: 0.000) :: WP7\Panels\Office
2.79052591    [3968] Refresh: 193.843 [ms] (Delete: 0.000 / ReadConf: 99.197 / ReadSkin: 75.737 / InitMM: 12.030 / Update: 5.903 / ScrToWin: 0.266 / WinDraw: 0.670 / ZPos: 0.040 / Blur: 0.000) :: WP7\Panels\Slideshow
3.00102401    [3968] Refresh: 208.662 [ms] (Delete: 0.000 / ReadConf: 98.610 / ReadSkin: 81.338 / InitMM: 24.290 / Update: 3.595 / ScrToWin: 0.296 / WinDraw: 0.498 / ZPos: 0.034 / Blur: 0.000) :: WP7\Panels\User
3.27318716    [3968] Refresh: 270.447 [ms] (Delete: 0.000 / ReadConf: 98.842 / ReadSkin: 117.252 / InitMM: 50.127 / Update: 3.442 / ScrToWin: 0.260 / WinDraw: 0.490 / ZPos: 0.034 / Blur: 0.000) :: WP7\Panels\Weather
3.49295640    [3968] Refresh: 218.034 [ms] (Delete: 0.000 / ReadConf: 99.597 / ReadSkin: 69.953 / InitMM: 45.639 / Update: 2.026 / ScrToWin: 0.287 / WinDraw: 0.496 / ZPos: 0.035 / Blur: 0.000) :: WP7\Panels\Zune
3.69335747    [3968] Refresh: 198.634 [ms] (Delete: 0.000 / ReadConf: 99.266 / ReadSkin: 86.022 / InitMM: 11.589 / Update: 0.998 / ScrToWin: 0.319 / WinDraw: 0.414 / ZPos: 0.025 / Blur: 0.000) :: WP7\TextItems
3.99525666    [3968] Refresh: 300.253 [ms] (Delete: 0.000 / ReadConf: 100.863 / ReadSkin: 176.172 / InitMM: 13.725 / Update: 6.710 / ScrToWin: 0.332 / WinDraw: 2.397 / ZPos: 0.054 / Blur: 0.000) :: WP7\TextItems\Bing
4.15967607    [3968] Refresh: 160.858 [ms] (Delete: 0.000 / ReadConf: 100.584 / ReadSkin: 53.607 / InitMM: 1.692 / Update: 3.417 / ScrToWin: 0.282 / WinDraw: 1.236 / ZPos: 0.039 / Blur: 0.000) :: WP7\TextItems\Day
4.33993006    [3968] Refresh: 177.807 [ms] (Delete: 0.000 / ReadConf: 99.676 / ReadSkin: 70.895 / InitMM: 5.916 / Update: 0.708 / ScrToWin: 0.284 / WinDraw: 0.308 / ZPos: 0.020 / Blur: 0.000) :: WP7\TextItems\Extra\PowerButtons
4.45923328    [3968] Refresh: 117.639 [ms] (Delete: 0.000 / ReadConf: 100.522 / ReadSkin: 15.651 / InitMM: 0.548 / Update: 0.409 / ScrToWin: 0.221 / WinDraw: 0.269 / ZPos: 0.019 / Blur: 0.000) :: WP7\TextItems\Extra\Zunegradient
4.64319468    [3968] Refresh: 182.402 [ms] (Delete: 0.000 / ReadConf: 99.705 / ReadSkin: 75.304 / InitMM: 3.246 / Update: 2.804 / ScrToWin: 0.286 / WinDraw: 1.025 / ZPos: 0.032 / Blur: 0.000) :: WP7\TextItems\GoogleSearch
4.64451313    [3968] End.

(※単位は一番左の数値が経過秒で、他はミリ秒です。[ ]内の数値はプロセスIDなので無視してください。Deleteは起動処理時には発生しないのでずっと0.000msです。2.0にはBlurもないので0.000msです。)

このうち、Rainmeter.iniからスキンの情報を読み込むのがReadConf、スキンファイル(+@Includeで参照しているファイル)の読み込みがReadSkinです。ReadConfはどれも横並びの数値になっていて、ReadSkinはバラツキはあるものの、それなりの記述量であれば大きめの数値になっています。

2.1-r861 で3.0GHz固定にしたときの各処理時間(Omnimo 4 1920x1080):

0.00000000    [5608] Begin:
0.30550823    [5608] Refresh: 9.753 [ms] (Delete: 0.000 / ReadConf: 0.613 / ReadSkin: 3.612 / InitMM: 3.738 / Update: 1.201 / ScrToWin: 0.239 / WinDraw: 0.207 / ZPos: 0.015 / Blur: 0.128) :: WP7
0.33364254    [5608] Refresh: 25.424 [ms] (Delete: 0.000 / ReadConf: 0.634 / ReadSkin: 4.282 / InitMM: 0.471 / Update: 13.071 / ScrToWin: 0.238 / WinDraw: 5.896 / ZPos: 0.238 / Blur: 0.595) :: WP7\Background
0.38909802    [5608] Refresh: 49.635 [ms] (Delete: 0.000 / ReadConf: 0.667 / ReadSkin: 14.867 / InitMM: 30.555 / Update: 2.901 / ScrToWin: 0.238 / WinDraw: 0.331 / ZPos: 0.041 / Blur: 0.036) :: WP7\Panels\Calculator
0.42295364    [5608] Refresh: 31.703 [ms] (Delete: 0.000 / ReadConf: 0.635 / ReadSkin: 11.546 / InitMM: 16.362 / Update: 2.577 / ScrToWin: 0.213 / WinDraw: 0.315 / ZPos: 0.035 / Blur: 0.019) :: WP7\Panels\Date
0.45806307    [5608] Refresh: 32.948 [ms] (Delete: 0.000 / ReadConf: 0.637 / ReadSkin: 10.754 / InitMM: 16.188 / Update: 4.789 / ScrToWin: 0.225 / WinDraw: 0.313 / ZPos: 0.022 / Blur: 0.019) :: WP7\Panels\Donate
0.49424928    [5608] Refresh: 34.087 [ms] (Delete: 0.000 / ReadConf: 0.603 / ReadSkin: 15.713 / InitMM: 11.311 / Update: 5.808 / ScrToWin: 0.228 / WinDraw: 0.377 / ZPos: 0.029 / Blur: 0.019) :: WP7\Panels\FruitClock
0.52521300    [5608] Refresh: 28.885 [ms] (Delete: 0.000 / ReadConf: 0.611 / ReadSkin: 9.948 / InitMM: 15.242 / Update: 2.473 / ScrToWin: 0.275 / WinDraw: 0.295 / ZPos: 0.023 / Blur: 0.019) :: WP7\Panels\Internet
0.55843896    [5608] Refresh: 31.197 [ms] (Delete: 0.000 / ReadConf: 0.587 / ReadSkin: 13.716 / InitMM: 11.018 / Update: 5.306 / ScrToWin: 0.242 / WinDraw: 0.290 / ZPos: 0.020 / Blur: 0.018) :: WP7\Panels\Live
0.60654968    [5608] Refresh: 46.011 [ms] (Delete: 0.000 / ReadConf: 0.595 / ReadSkin: 14.062 / InitMM: 26.823 / Update: 3.845 / ScrToWin: 0.288 / WinDraw: 0.343 / ZPos: 0.024 / Blur: 0.030) :: WP7\Panels\Mail
0.65093660    [5608] Refresh: 42.292 [ms] (Delete: 0.000 / ReadConf: 0.612 / ReadSkin: 11.119 / InitMM: 26.144 / Update: 3.811 / ScrToWin: 0.260 / WinDraw: 0.306 / ZPos: 0.022 / Blur: 0.018) :: WP7\Panels\Marketplace
0.68809325    [5608] Refresh: 35.102 [ms] (Delete: 0.000 / ReadConf: 0.605 / ReadSkin: 17.110 / InitMM: 12.163 / Update: 4.541 / ScrToWin: 0.284 / WinDraw: 0.346 / ZPos: 0.034 / Blur: 0.019) :: WP7\Panels\Office
0.72484285    [5608] Refresh: 34.482 [ms] (Delete: 0.000 / ReadConf: 0.652 / ReadSkin: 13.719 / InitMM: 12.149 / Update: 7.235 / ScrToWin: 0.323 / WinDraw: 0.353 / ZPos: 0.030 / Blur: 0.021) :: WP7\Panels\Slideshow
0.76998478    [5608] Refresh: 42.973 [ms] (Delete: 0.000 / ReadConf: 0.607 / ReadSkin: 14.877 / InitMM: 23.401 / Update: 3.472 / ScrToWin: 0.288 / WinDraw: 0.286 / ZPos: 0.022 / Blur: 0.020) :: WP7\Panels\User
0.84851992    [5608] Refresh: 76.366 [ms] (Delete: 0.000 / ReadConf: 0.611 / ReadSkin: 28.534 / InitMM: 44.160 / Update: 2.388 / ScrToWin: 0.297 / WinDraw: 0.333 / ZPos: 0.022 / Blur: 0.020) :: WP7\Panels\Weather
0.90518165    [5608] Refresh: 54.516 [ms] (Delete: 0.000 / ReadConf: 0.641 / ReadSkin: 9.657 / InitMM: 41.646 / Update: 1.944 / ScrToWin: 0.280 / WinDraw: 0.307 / ZPos: 0.022 / Blur: 0.019) :: WP7\Panels\Zune
0.93179810    [5608] Refresh: 24.463 [ms] (Delete: 0.000 / ReadConf: 0.622 / ReadSkin: 10.696 / InitMM: 10.987 / Update: 1.544 / ScrToWin: 0.287 / WinDraw: 0.288 / ZPos: 0.019 / Blur: 0.019) :: WP7\TextItems
1.03515732    [5608] Refresh: 101.258 [ms] (Delete: 0.000 / ReadConf: 0.656 / ReadSkin: 82.374 / InitMM: 12.838 / Update: 3.779 / ScrToWin: 0.233 / WinDraw: 1.331 / ZPos: 0.024 / Blur: 0.021) :: WP7\TextItems\Bing
1.05035496    [5608] Refresh: 12.756 [ms] (Delete: 0.000 / ReadConf: 0.612 / ReadSkin: 6.220 / InitMM: 1.752 / Update: 3.282 / ScrToWin: 0.248 / WinDraw: 0.598 / ZPos: 0.023 / Blur: 0.020) :: WP7\TextItems\Day
1.07089806    [5608] Refresh: 18.365 [ms] (Delete: 0.000 / ReadConf: 0.645 / ReadSkin: 10.503 / InitMM: 5.598 / Update: 1.140 / ScrToWin: 0.244 / WinDraw: 0.203 / ZPos: 0.014 / Blur: 0.019) :: WP7\TextItems\Extra\PowerButtons
1.07878351    [5608] Refresh: 5.933 [ms] (Delete: 0.000 / ReadConf: 0.617 / ReadSkin: 3.416 / InitMM: 0.505 / Update: 0.900 / ScrToWin: 0.238 / WinDraw: 0.223 / ZPos: 0.015 / Blur: 0.019) :: WP7\TextItems\Extra\Zunegradient
1.10027432    [5608] Refresh: 19.493 [ms] (Delete: 0.000 / ReadConf: 0.659 / ReadSkin: 12.370 / InitMM: 3.228 / Update: 2.420 / ScrToWin: 0.249 / WinDraw: 0.519 / ZPos: 0.029 / Blur: 0.020) :: WP7\TextItems\GoogleSearch
1.10096645    [5608] End.

2.1では、ReadConf / ReadSkinともに大幅に減りました。設定値の読み込みがボトルネックになっていた証拠ですね。

同様に、[Statistics]のネットワーク統計情報の読み込み部分にも同様の変更を入れました。インタフェース数が20程度(Windows7だと結構多くなる)で変更前は2.5ms程度、変更後は0.6ms程度でした。この程度では起動時間としては誤差のレベルですが、インタフェース数が300を越えたりするような環境では(実際にあるらしい……)、変更前で250ms程度、変更後で16ms程度でした。人によっては体感できるかな? まあ、大抵の環境はインタフェース数30以下だと思いますが。

 

ついでに、800MHzでの処理時間も貼っておきます。

2.0-r745 で800MHz固定にしたときの各処理時間(Omnimo 4 1920x1080):

0.00000000    [4648] Begin:
1.91457534    [4648] Refresh: 453.187 [ms] (Delete: 0.000 / ReadConf: 391.274 / ReadSkin: 43.899 / InitMM: 8.918 / Update: 1.825 / ScrToWin: 0.654 / WinDraw: 6.564 / ZPos: 0.052 / Blur: 0.000) :: WP7
2.51132083    [4648] Refresh: 592.166 [ms] (Delete: 0.000 / ReadConf: 367.094 / ReadSkin: 66.373 / InitMM: 1.277 / Update: 96.112 / ScrToWin: 0.675 / WinDraw: 60.110 / ZPos: 0.523 / Blur: 0.000) :: WP7\Background
3.33653235    [4648] Refresh: 766.516 [ms] (Delete: 0.000 / ReadConf: 371.296 / ReadSkin: 269.286 / InitMM: 115.934 / Update: 7.789 / ScrToWin: 0.584 / WinDraw: 1.561 / ZPos: 0.065 / Blur: 0.000) :: WP7\Panels\Calculator
4.05571699    [4648] Refresh: 714.034 [ms] (Delete: 0.000 / ReadConf: 370.189 / ReadSkin: 269.209 / InitMM: 63.423 / Update: 9.014 / ScrToWin: 0.569 / WinDraw: 1.559 / ZPos: 0.072 / Blur: 0.000) :: WP7\Panels\Date
4.76299047    [4648] Refresh: 702.392 [ms] (Delete: 0.000 / ReadConf: 362.001 / ReadSkin: 259.365 / InitMM: 61.574 / Update: 17.214 / ScrToWin: 0.630 / WinDraw: 1.537 / ZPos: 0.071 / Blur: 0.000) :: WP7\Panels\Donate
5.49550772    [4648] Refresh: 727.378 [ms] (Delete: 0.000 / ReadConf: 368.213 / ReadSkin: 290.367 / InitMM: 48.316 / Update: 17.777 / ScrToWin: 0.567 / WinDraw: 2.063 / ZPos: 0.074 / Blur: 0.000) :: WP7\Panels\FruitClock
6.18589783    [4648] Refresh: 684.854 [ms] (Delete: 0.000 / ReadConf: 367.133 / ReadSkin: 247.944 / InitMM: 59.705 / Update: 7.887 / ScrToWin: 0.549 / WinDraw: 1.560 / ZPos: 0.074 / Blur: 0.000) :: WP7\Panels\Internet
6.93167019    [4648] Refresh: 740.582 [ms] (Delete: 0.000 / ReadConf: 367.771 / ReadSkin: 307.018 / InitMM: 46.433 / Update: 17.124 / ScrToWin: 0.694 / WinDraw: 1.473 / ZPos: 0.069 / Blur: 0.000) :: WP7\Panels\Live
7.73862553    [4648] Refresh: 801.914 [ms] (Delete: 0.000 / ReadConf: 368.727 / ReadSkin: 309.323 / InitMM: 107.745 / Update: 13.780 / ScrToWin: 0.692 / WinDraw: 1.574 / ZPos: 0.072 / Blur: 0.000) :: WP7\Panels\Mail
8.52875233    [4648] Refresh: 784.818 [ms] (Delete: 0.000 / ReadConf: 405.052 / ReadSkin: 261.954 / InitMM: 101.930 / Update: 13.588 / ScrToWin: 0.722 / WinDraw: 1.503 / ZPos: 0.068 / Blur: 0.000) :: WP7\Panels\Marketplace
9.32508755    [4648] Refresh: 791.209 [ms] (Delete: 0.000 / ReadConf: 366.161 / ReadSkin: 361.487 / InitMM: 45.187 / Update: 16.127 / ScrToWin: 0.726 / WinDraw: 1.450 / ZPos: 0.070 / Blur: 0.000) :: WP7\Panels\Office
10.05527973    [4648] Refresh: 725.042 [ms] (Delete: 0.000 / ReadConf: 365.490 / ReadSkin: 278.813 / InitMM: 43.160 / Update: 34.728 / ScrToWin: 0.719 / WinDraw: 2.065 / ZPos: 0.067 / Blur: 0.000) :: WP7\Panels\Slideshow
10.82669735    [4648] Refresh: 765.907 [ms] (Delete: 0.000 / ReadConf: 363.319 / ReadSkin: 300.098 / InitMM: 88.271 / Update: 11.929 / ScrToWin: 0.739 / WinDraw: 1.475 / ZPos: 0.076 / Blur: 0.000) :: WP7\Panels\User
11.80958271    [4648] Refresh: 977.767 [ms] (Delete: 0.000 / ReadConf: 363.362 / ReadSkin: 424.933 / InitMM: 175.520 / Update: 11.466 / ScrToWin: 0.817 / WinDraw: 1.587 / ZPos: 0.081 / Blur: 0.000) :: WP7\Panels\Weather
12.62373066    [4648] Refresh: 808.623 [ms] (Delete: 0.000 / ReadConf: 361.997 / ReadSkin: 259.288 / InitMM: 175.708 / Update: 8.857 / ScrToWin: 0.792 / WinDraw: 1.912 / ZPos: 0.069 / Blur: 0.000) :: WP7\Panels\Zune
13.35214615    [4648] Refresh: 723.075 [ms] (Delete: 0.000 / ReadConf: 366.285 / ReadSkin: 314.577 / InitMM: 37.175 / Update: 3.156 / ScrToWin: 0.927 / WinDraw: 0.901 / ZPos: 0.053 / Blur: 0.000) :: WP7\TextItems
14.42826843    [4648] Refresh: 1070.985 [ms] (Delete: 0.000 / ReadConf: 368.907 / ReadSkin: 626.639 / InitMM: 45.185 / Update: 21.886 / ScrToWin: 0.863 / WinDraw: 7.415 / ZPos: 0.090 / Blur: 0.000) :: WP7\TextItems\Bing
15.00891972    [4648] Refresh: 570.003 [ms] (Delete: 0.000 / ReadConf: 361.030 / ReadSkin: 187.496 / InitMM: 5.397 / Update: 11.464 / ScrToWin: 0.755 / WinDraw: 3.795 / ZPos: 0.065 / Blur: 0.000) :: WP7\TextItems\Day
15.66145515    [4648] Refresh: 645.176 [ms] (Delete: 0.000 / ReadConf: 362.592 / ReadSkin: 257.191 / InitMM: 21.043 / Update: 2.179 / ScrToWin: 0.785 / WinDraw: 1.324 / ZPos: 0.060 / Blur: 0.000) :: WP7\TextItems\Extra\PowerButtons
16.09369469    [4648] Refresh: 427.360 [ms] (Delete: 0.000 / ReadConf: 366.310 / ReadSkin: 56.524 / InitMM: 1.874 / Update: 1.078 / ScrToWin: 0.684 / WinDraw: 0.823 / ZPos: 0.067 / Blur: 0.000) :: WP7\TextItems\Extra\Zunegradient
16.76354790    [4648] Refresh: 665.069 [ms] (Delete: 0.000 / ReadConf: 367.070 / ReadSkin: 275.162 / InitMM: 10.453 / Update: 8.414 / ScrToWin: 0.745 / WinDraw: 3.145 / ZPos: 0.080 / Blur: 0.000) :: WP7\TextItems\GoogleSearch
16.76760674    [4648] End.

スキンごとに1秒近くかかっていて、起動しきるまでに17秒もかかるので、体感でイラッとできそうです……。

2.1-r861 で800MHz固定にしたときの各処理時間(Omnimo 4 1920x1080):

0.00000000    [5764] Begin:
1.09438074    [5764] Refresh: 32.176 [ms] (Delete: 0.000 / ReadConf: 2.178 / ReadSkin: 12.839 / InitMM: 9.715 / Update: 5.841 / ScrToWin: 0.525 / WinDraw: 0.683 / ZPos: 0.040 / Blur: 0.355) :: WP7
1.18408632    [5764] Refresh: 83.084 [ms] (Delete: 0.000 / ReadConf: 2.191 / ReadSkin: 18.323 / InitMM: 1.387 / Update: 46.709 / ScrToWin: 0.540 / WinDraw: 12.896 / ZPos: 0.509 / Blur: 0.528) :: WP7\Background
1.36931193    [5764] Refresh: 171.760 [ms] (Delete: 0.000 / ReadConf: 2.249 / ReadSkin: 46.920 / InitMM: 110.983 / Update: 9.685 / ScrToWin: 0.646 / WinDraw: 1.164 / ZPos: 0.059 / Blur: 0.054) :: WP7\Panels\Calculator
1.48795068    [5764] Refresh: 112.209 [ms] (Delete: 0.000 / ReadConf: 2.229 / ReadSkin: 41.019 / InitMM: 58.662 / Update: 8.775 / ScrToWin: 0.607 / WinDraw: 0.814 / ZPos: 0.050 / Blur: 0.053) :: WP7\Panels\Date
1.61339164    [5764] Refresh: 118.684 [ms] (Delete: 0.000 / ReadConf: 2.084 / ReadSkin: 39.831 / InitMM: 58.279 / Update: 16.965 / ScrToWin: 0.603 / WinDraw: 0.818 / ZPos: 0.049 / Blur: 0.054) :: WP7\Panels\Donate
1.74107206    [5764] Refresh: 121.257 [ms] (Delete: 0.000 / ReadConf: 2.181 / ReadSkin: 56.382 / InitMM: 40.139 / Update: 20.832 / ScrToWin: 0.528 / WinDraw: 1.081 / ZPos: 0.058 / Blur: 0.056) :: WP7\Panels\FruitClock
1.85206628    [5764] Refresh: 104.623 [ms] (Delete: 0.000 / ReadConf: 2.156 / ReadSkin: 36.614 / InitMM: 56.643 / Update: 7.638 / ScrToWin: 0.640 / WinDraw: 0.827 / ZPos: 0.050 / Blur: 0.054) :: WP7\Panels\Internet
1.96714807    [5764] Refresh: 108.843 [ms] (Delete: 0.000 / ReadConf: 2.013 / ReadSkin: 47.570 / InitMM: 38.779 / Update: 18.746 / ScrToWin: 0.784 / WinDraw: 0.838 / ZPos: 0.058 / Blur: 0.055) :: WP7\Panels\Live
2.13873029    [5764] Refresh: 164.828 [ms] (Delete: 0.000 / ReadConf: 2.060 / ReadSkin: 51.046 / InitMM: 97.160 / Update: 12.457 / ScrToWin: 0.699 / WinDraw: 1.234 / ZPos: 0.088 / Blur: 0.083) :: WP7\Panels\Mail
2.30590582    [5764] Refresh: 160.298 [ms] (Delete: 0.000 / ReadConf: 2.178 / ReadSkin: 44.680 / InitMM: 96.782 / Update: 14.883 / ScrToWin: 0.763 / WinDraw: 0.890 / ZPos: 0.067 / Blur: 0.056) :: WP7\Panels\Marketplace
2.44558501    [5764] Refresh: 132.777 [ms] (Delete: 0.001 / ReadConf: 2.191 / ReadSkin: 64.890 / InitMM: 48.114 / Update: 15.789 / ScrToWin: 0.828 / WinDraw: 0.830 / ZPos: 0.057 / Blur: 0.078) :: WP7\Panels\Office
2.56649709    [5764] Refresh: 113.965 [ms] (Delete: 0.001 / ReadConf: 2.156 / ReadSkin: 48.005 / InitMM: 43.838 / Update: 17.935 / ScrToWin: 0.795 / WinDraw: 1.107 / ZPos: 0.069 / Blur: 0.058) :: WP7\Panels\Slideshow
2.72364855    [5764] Refresh: 149.798 [ms] (Delete: 0.001 / ReadConf: 2.110 / ReadSkin: 52.975 / InitMM: 81.809 / Update: 11.242 / ScrToWin: 0.801 / WinDraw: 0.722 / ZPos: 0.049 / Blur: 0.089) :: WP7\Panels\User
3.00420928    [5764] Refresh: 274.041 [ms] (Delete: 0.000 / ReadConf: 2.126 / ReadSkin: 100.237 / InitMM: 161.913 / Update: 7.853 / ScrToWin: 0.743 / WinDraw: 1.040 / ZPos: 0.071 / Blur: 0.057) :: WP7\Panels\Weather
3.21063256    [5764] Refresh: 199.731 [ms] (Delete: 0.001 / ReadConf: 2.106 / ReadSkin: 35.322 / InitMM: 154.121 / Update: 6.382 / ScrToWin: 0.729 / WinDraw: 0.949 / ZPos: 0.054 / Blur: 0.067) :: WP7\Panels\Zune
3.30140638    [5764] Refresh: 83.938 [ms] (Delete: 0.000 / ReadConf: 2.204 / ReadSkin: 38.493 / InitMM: 36.562 / Update: 5.039 / ScrToWin: 0.786 / WinDraw: 0.754 / ZPos: 0.048 / Blur: 0.053) :: WP7\TextItems
3.64272904    [5764] Refresh: 334.711 [ms] (Delete: 0.000 / ReadConf: 2.246 / ReadSkin: 275.321 / InitMM: 39.950 / Update: 12.537 / ScrToWin: 0.814 / WinDraw: 3.667 / ZPos: 0.080 / Blur: 0.096) :: WP7\TextItems\Bing
3.69617891    [5764] Refresh: 45.483 [ms] (Delete: 0.000 / ReadConf: 2.167 / ReadSkin: 23.528 / InitMM: 5.873 / Update: 11.235 / ScrToWin: 0.742 / WinDraw: 1.816 / ZPos: 0.064 / Blur: 0.059) :: WP7\TextItems\Day
3.76703691    [5764] Refresh: 63.805 [ms] (Delete: 0.000 / ReadConf: 2.197 / ReadSkin: 38.084 / InitMM: 18.112 / Update: 3.776 / ScrToWin: 0.826 / WinDraw: 0.712 / ZPos: 0.047 / Blur: 0.053) :: WP7\TextItems\Extra\PowerButtons
3.79392672    [5764] Refresh: 20.528 [ms] (Delete: 0.000 / ReadConf: 2.185 / ReadSkin: 11.968 / InitMM: 1.749 / Update: 3.056 / ScrToWin: 0.758 / WinDraw: 0.685 / ZPos: 0.070 / Blur: 0.054) :: WP7\TextItems\Extra\Zunegradient
3.86845541    [5764] Refresh: 67.991 [ms] (Delete: 0.000 / ReadConf: 2.216 / ReadSkin: 45.090 / InitMM: 10.302 / Update: 7.967 / ScrToWin: 0.698 / WinDraw: 1.599 / ZPos: 0.063 / Blur: 0.056) :: WP7\TextItems\GoogleSearch
3.87067127    [5764] End.

ReadConf / ReadSkinが速くなったおかげで起動時間は2.0-r745+3.0GHzよりも短くなってはいるものの、他の処理は周波数通りの遅さになってます。

 

*****

 

32bit版だけでなく64bit版でも計ってみました。

2.1-r861 で3.0GHz固定にしたときの各処理時間 x64版 (Omnimo 4 1920x1080):

0.00000000    [5220] Begin:
0.29535884    [5220] Refresh: 8.713 [ms] (Delete: 0.000 / ReadConf: 0.579 / ReadSkin: 3.278 / InitMM: 2.814 / Update: 1.533 / ScrToWin: 0.156 / WinDraw: 0.223 / ZPos: 0.014 / Blur: 0.116) :: WP7
0.32318935    [5220] Refresh: 25.608 [ms] (Delete: 0.000 / ReadConf: 0.578 / ReadSkin: 4.365 / InitMM: 0.545 / Update: 14.061 / ScrToWin: 0.216 / WinDraw: 5.493 / ZPos: 0.153 / Blur: 0.198) :: WP7\Background
0.36378396    [5220] Refresh: 34.952 [ms] (Delete: 0.000 / ReadConf: 0.611 / ReadSkin: 10.402 / InitMM: 19.935 / Update: 3.435 / ScrToWin: 0.209 / WinDraw: 0.319 / ZPos: 0.023 / Blur: 0.019) :: WP7\Panels\Calculator
0.39127129    [5220] Refresh: 25.346 [ms] (Delete: 0.000 / ReadConf: 0.655 / ReadSkin: 9.804 / InitMM: 11.789 / Update: 2.575 / ScrToWin: 0.179 / WinDraw: 0.297 / ZPos: 0.023 / Blur: 0.023) :: WP7\Panels\Date
0.41944367    [5220] Refresh: 26.046 [ms] (Delete: 0.000 / ReadConf: 0.685 / ReadSkin: 9.265 / InitMM: 11.546 / Update: 3.975 / ScrToWin: 0.190 / WinDraw: 0.336 / ZPos: 0.025 / Blur: 0.023) :: WP7\Panels\Donate
0.45034006    [5220] Refresh: 28.940 [ms] (Delete: 0.000 / ReadConf: 0.560 / ReadSkin: 13.130 / InitMM: 8.379 / Update: 6.184 / ScrToWin: 0.239 / WinDraw: 0.399 / ZPos: 0.030 / Blur: 0.018) :: WP7\Panels\FruitClock
0.47409657    [5220] Refresh: 21.743 [ms] (Delete: 0.000 / ReadConf: 0.580 / ReadSkin: 8.278 / InitMM: 10.296 / Update: 1.997 / ScrToWin: 0.255 / WinDraw: 0.296 / ZPos: 0.023 / Blur: 0.018) :: WP7\Panels\Internet
0.50490665    [5220] Refresh: 28.825 [ms] (Delete: 0.000 / ReadConf: 0.561 / ReadSkin: 11.084 / InitMM: 9.342 / Update: 7.245 / ScrToWin: 0.256 / WinDraw: 0.294 / ZPos: 0.025 / Blur: 0.018) :: WP7\Panels\Live
0.54187167    [5220] Refresh: 35.009 [ms] (Delete: 0.000 / ReadConf: 0.533 / ReadSkin: 11.894 / InitMM: 16.732 / Update: 5.216 / ScrToWin: 0.257 / WinDraw: 0.334 / ZPos: 0.025 / Blur: 0.018) :: WP7\Panels\Mail
0.57498014    [5220] Refresh: 31.100 [ms] (Delete: 0.000 / ReadConf: 0.578 / ReadSkin: 8.923 / InitMM: 16.380 / Update: 4.655 / ScrToWin: 0.245 / WinDraw: 0.256 / ZPos: 0.028 / Blur: 0.035) :: WP7\Panels\Marketplace
0.60854757    [5220] Refresh: 31.554 [ms] (Delete: 0.000 / ReadConf: 0.575 / ReadSkin: 16.109 / InitMM: 9.248 / Update: 5.034 / ScrToWin: 0.253 / WinDraw: 0.278 / ZPos: 0.037 / Blur: 0.019) :: WP7\Panels\Office
0.64207941    [5220] Refresh: 31.343 [ms] (Delete: 0.000 / ReadConf: 0.629 / ReadSkin: 11.491 / InitMM: 9.334 / Update: 9.164 / ScrToWin: 0.304 / WinDraw: 0.346 / ZPos: 0.040 / Blur: 0.035) :: WP7\Panels\Slideshow
0.67800361    [5220] Refresh: 33.722 [ms] (Delete: 0.000 / ReadConf: 0.586 / ReadSkin: 12.268 / InitMM: 16.061 / Update: 4.184 / ScrToWin: 0.296 / WinDraw: 0.286 / ZPos: 0.022 / Blur: 0.018) :: WP7\Panels\User
0.73849577    [5220] Refresh: 58.537 [ms] (Delete: 0.000 / ReadConf: 0.545 / ReadSkin: 23.442 / InitMM: 31.123 / Update: 2.894 / ScrToWin: 0.214 / WinDraw: 0.262 / ZPos: 0.020 / Blur: 0.037) :: WP7\Panels\Weather
0.77532113    [5220] Refresh: 34.845 [ms] (Delete: 0.000 / ReadConf: 0.535 / ReadSkin: 8.116 / InitMM: 22.564 / Update: 3.056 / ScrToWin: 0.225 / WinDraw: 0.291 / ZPos: 0.030 / Blur: 0.029) :: WP7\Panels\Zune
0.79825532    [5220] Refresh: 20.851 [ms] (Delete: 0.000 / ReadConf: 0.579 / ReadSkin: 8.712 / InitMM: 9.593 / Update: 1.442 / ScrToWin: 0.234 / WinDraw: 0.258 / ZPos: 0.015 / Blur: 0.018) :: WP7\TextItems
0.89462888    [5220] Refresh: 94.442 [ms] (Delete: 0.000 / ReadConf: 0.537 / ReadSkin: 75.583 / InitMM: 13.105 / Update: 3.433 / ScrToWin: 0.266 / WinDraw: 1.456 / ZPos: 0.042 / Blur: 0.020) :: WP7\TextItems\Bing
0.90817481    [5220] Refresh: 11.051 [ms] (Delete: 0.000 / ReadConf: 0.552 / ReadSkin: 5.222 / InitMM: 1.595 / Update: 2.687 / ScrToWin: 0.257 / WinDraw: 0.684 / ZPos: 0.036 / Blur: 0.019) :: WP7\TextItems\Day
0.92703229    [5220] Refresh: 16.569 [ms] (Delete: 0.000 / ReadConf: 0.588 / ReadSkin: 8.598 / InitMM: 5.395 / Update: 1.402 / ScrToWin: 0.263 / WinDraw: 0.287 / ZPos: 0.017 / Blur: 0.018) :: WP7\TextItems\Extra\PowerButtons
0.93428260    [5220] Refresh: 5.262 [ms] (Delete: 0.000 / ReadConf: 0.551 / ReadSkin: 2.826 / InitMM: 0.484 / Update: 0.896 / ScrToWin: 0.244 / WinDraw: 0.226 / ZPos: 0.018 / Blur: 0.017) :: WP7\TextItems\Extra\Zunegradient
0.95351213    [5220] Refresh: 17.309 [ms] (Delete: 0.000 / ReadConf: 0.556 / ReadSkin: 10.382 / InitMM: 3.224 / Update: 2.331 / ScrToWin: 0.224 / WinDraw: 0.531 / ZPos: 0.027 / Blur: 0.033) :: WP7\TextItems\GoogleSearch
0.95421821    [5220] End.

違いは出ないかなーと思いきや、かなり出ました。Omnimo 4で1秒切ってますね。

 

ついでに起動時の初期化の流れについて書いておきます。

Rainmeterを起動するとまず設定ファイルであるRainmeter.iniのパスやスキンのパスを確定させます。その後、Rainmeter自身のグローバル設定の読み込みや全スキンファイルのチェックを経て、上のログにあるようなスキンごとの初期化に入ります。

スキンの初期化の大部分はRefreshと同じ処理になっています。ReadConf / ReadSkinは上で書いたとおりで、設定値の読み出しです。InitMMは全Measure / Meterの初期化で、最初のUpdate処理(バックバッファへの描画はしない)はここに含まれます。次のUpdateは2回目のUpdate処理で、これはバックバッファへの描画も含まれています。ScrToWinはスキンの表示位置の確定(Updateを経てようやく座標が確定できる)で、WinDrawは描画済みのバックバッファを実際のウィンドウへ描画する処理です。ZPosがウィンドウのZ座標位置の変更、BlurがAero glass効果の付加です。

この処理を、表示するように設定されているスキン全部に対して行って、起動処理の完了となります。

 

Update処理が初期化段階で2回呼ばれるので、たまにこれがトラブルを引き起こしたりするかもしないかも。

スポンサーサイト

[Rainmeter-dev] 負荷を減らす取り組み #2

2011.01.04 | Rainmeter-dev

0 Comments

今回は描画関連のことを書こうと思ってたんですが、!RainmeterUpdateなどの追加をしちゃったので、先にそっちについての説明をまとめておこうと思います。これも使い方次第で負荷をかなり減らせます。

r686で、今までは出来なかった「手動でのMeasure/MeterのUpdate」が出来るようになりました(beta版ではr687から)。今までも、DynamicVariables=1とともに[Measure]の値を使ったり、!RainmeterSetVariableで変数を弄ったりして、動的に設定値を変更することはできましたが、その変更を即座に表示内容へ反映させるための手段は用意されていませんでした。例えば、以下のようなスキンを作って、動的に動作を変更してみます。

以下格納。

続きを読む »

[Rainmeter-dev] 負荷を減らす取り組み

2010.12.22 | Rainmeter-dev

0 Comments

Rainmeterもアップデートを繰り返し、バグフィックスだけでなく新規能も多く取り入れられました。特に新機能については、いままで出来なかったことをするためのものなので、当然コードサイズも増えるし、出来上がる実行ファイルのサイズも増えるし、実行時の負荷も(処理内容によっては)増えています。ベタ実装なものも多いので、処理が改善できそうな部分については適宜変更を入れています。

例えば、無駄な一時オブジェクト生成をなくしたり、処理に入る前に前提条件をチェックして必要なければ処理しないようにするとか。前者は1.4 betaに入ってから、コンパイル時に生成されたアセンブラコードをチェックしながらいろいろと洗い出して、大分減らしました。ほとんどが文字列絡みです。dllサイズも結構減りました(その分新規能が追加されて、増えてますが)。

後者については、主にフラグを設置して処理が必要かどうかをチェックしていますが、Rainmeterの場合はいろんなものが動的に変化する可能性があるので、適用できる部分は少ないです。むやみにフラグチェックを入れてしまうと、逆に本来の処理を行うよりも非効率的になってしまうこともあるためです。逆に、処理時間がかかるような部分には積極的に取り入れています(例えば画像処理とか、DynamicVariablesで変更された設定を反映させる処理とか)。

そういう部分と比較しても、まだまだ重い部分があります。Rainmeterで実際に一番重い(遅い)部分はどこでしょうか。
縦横サイズの大きなスキンを使っている人にはわかるかもしれませんが、描画(GDI+)です。

GDI+はいろいろと面倒な描画を簡単に使えるので重宝しますが、描画にかかる時間はGDIでDIBSectionを使った場合に比べると、とても遅いです(DIBSectionについては次回説明)。描画サイズが大きくなるほど、または更新間隔が短くなればなるほど、その差はハッキリと体感できるようになります。
(※Measureが大量にあってMeterは少ない・小さいとか、そういったスキンではこの限りではありません)

GDI+な部分についても、個別のMeterごとに、描画用にキャッシュを使うとか、GraphicsPathを使って一気に描くとか、負荷を減らせそうな変更は適宜入れていますが、表示の互換性も考えないといけないので、大胆には弄れません(オフセット位置が1pxズレるだけで表示結果が変わってしまう)。

ただ、描画について考えるのであれば、RainmeterではUpdate間隔ごとに全Meterをバックバッファに再描画し直していることを考慮すべきです。もし「前回の表示内容から何も変更がない」なら、この再描画処理は本来必要なく、描画済みのバックバッファをそのまま使えます。

「変更がない」ことを確認するには、「全てのMeterの設定・使用するMeasure値が変更されていない」ことを確認すれば、目的を達せられそうです。

続きを読む »

[Rainmeter-dev] TwitterのTLが文字化けする

2010.08.17 | Rainmeter-dev // Issue/互換性問題やバグ修正

21 Comments

TwitterでRainmeterについて検索してみると、TwitterのTLを表示させると文字化けするっていうつぶやきがちらほらと見受けられます。
RainmeterでTwitterのタイムラインを取得すると、「はじめまして!」のような文字列が表示されてしまいますが、これは数値文字参照と言って、文字を10進数または16進数文字列で表しています(これは「はじめまして!」を表す)。本来は表示前に元の文字へと戻してやる必要があり、ブラウザなどではその処理をしてから表示していますが、RainmeterのWebParserにはその処理が入っていません(英語圏では変換して使うような文字があまりなく、そう問題にならないので)。

この数値文字参照を元の文字に戻す処理を加えたWebParserを作ってみたので、下へ置いておきます。変なことはしてないので、1.0でも使えると思います。興味のある方は試してみてください。

Rainmeter 1.3にこの変更を取り込んだので、公開終了しました。
デフォルトでは有効化されませんので、スキン製作者側または使用者側で適宜設定を行ってください。

適用方法)
WebParserを使っているMeasureで、かつ"StringIndex="を設定してあるものに、"DecodeCharacterReference=1"を設定してください。

例)

[Feed1.mLink1]
Measure=Plugin
Plugin=Plugins\WebParser.dll
Url=[Feed1]
DecodeCharacterReference=1
StringIndex=2

設定値)

0 : なにもしない (デフォルト動作)
1 : 数値文字参照と実体参照の両方をデコードする
2 : 数値文字参照のみをデコードする
3 : 実体参照のみをデコードする

※Substituteの設定値によっては意図しない結果になることもありますので、適宜調整してください。
(例えば、結果の文字列からダブルクォーテーションを消すためにSubstitute=""":""を指定してあった場合、DecodeCharacterReferenceを定義することによって&quot:は"に置き換えられてしまうため、消されずに残ってしまいます)

また、この件とは関係ありませんが、TwitterのBASIC認証が廃止されたために、TLが取得できなくなって困った方もおられると思います。これに関しては、GnometerがSuperTweetを介しての取得に対応していますので、そちらのコードを参考にしてみてください。

■更新履歴
2010.12.16 : 公開終了しました。
2010.08.17 : Rainmeter 1.3 beta r501 をベースに作成し直しました。処理も少しだけ変えているので、r320版と文字処理の動作が違っていたら教えてください。

続きはコード詳細。

続きを読む »

[Rainmeter-dev] ネットワークトラフィックの値がおかしい #3

2010.01.29 | Rainmeter-dev // Issue/ネットワーク関連

0 Comments

前回の記事 : [Rainmeter-dev] ネットワークトラフィックの値がおかしい #2

前回の記事では、ネットワークトラフィック値が本来の値の数倍になってしまう原因について調べました。
その中ではまとめとしてフィルタインタフェース(とループバック)を除外する対象としましたが、それだけだとXPの結果とは違い、論理インタフェースも集計対象になってしまうので、ここではXPでの列挙内容に近づけるために、物理(ハードウェア)インタフェースのみを集計対象とします。
(その他のインタフェースも、Interface=0での集計対象とならないだけで、個別指定をすれば値を取得できる)

Vista以降の環境で上記のような判定をするためには、GetIfTable2(GetIfTable2Ex) APIを使います。そのまま使うと2000/XPでRainmeterが起動できなくなるので、LoadLibrary/GetProcAddress APIを使って動的に使う必要があります。コード詳細は後回しにして、GetIfTable2Ex APIを使って取得した結果は以下のようになりました。

* NETWORK-INTERFACE: Count=32

1: AMD PCNET Family Ethernet Adapter (PCI) - VirtualBox Bridged Networking Driver Miniport
  Type=Other(1), Hardware=No, Filter=No
2: Intel(R) PRO/1000 MT Desktop Adapter - VirtualBox Bridged Networking Driver Miniport
  Type=Other(1), Hardware=No, Filter=No
3: WAN Miniport (IPv6)
  Type=Ethernet(6), Hardware=No, Filter=No
4: WAN Miniport (Network Monitor)
  Type=Ethernet(6), Hardware=No, Filter=No
5: AMD PCNET Family Ethernet Adapter (PCI) #2-agnitum firewall driver-0000
  Type=Ethernet(6), Hardware=No, Filter=Yes
6: AMD PCNET Family Ethernet Adapter (PCI) #2 - VirtualBox Bridged Networking Driver Miniport
  Type=Ethernet(6), Hardware=No, Filter=Yes
7: WAN Miniport (IP)
  Type=Ethernet(6), Hardware=No, Filter=No
8: AMD PCNET Family Ethernet Adapter (PCI) #2 - VirtualBox Bridged Networking Driver Miniport-QoS Packet Scheduler-0000
  Type=Ethernet(6), Hardware=No, Filter=Yes
9: Intel(R) PRO/1000 MT Desktop Adapter
  Type=Ethernet(6), Hardware=Yes, Filter=No
10: AMD PCNET Family Ethernet Adapter (PCI)
  Type=Ethernet(6), Hardware=No, Filter=No
11: AMD PCNET Family Ethernet Adapter (PCI) #2
  Type=Ethernet(6), Hardware=Yes, Filter=No
12: WAN Miniport (IPv6)-agnitum firewall driver-0000
  Type=Ethernet(6), Hardware=No, Filter=Yes
13: WAN Miniport (IPv6)-QoS Packet Scheduler-0000
  Type=Ethernet(6), Hardware=No, Filter=Yes
14: WAN Miniport (IP)-agnitum firewall driver-0000
  Type=Ethernet(6), Hardware=No, Filter=Yes
15: WAN Miniport (IP)-QoS Packet Scheduler-0000
  Type=Ethernet(6), Hardware=No, Filter=Yes
16: WAN Miniport (Network Monitor)-agnitum firewall driver-0000
  Type=Ethernet(6), Hardware=No, Filter=Yes
17: WAN Miniport (Network Monitor)-QoS Packet Scheduler-0000
  Type=Ethernet(6), Hardware=No, Filter=Yes
18: AMD PCNET Family Ethernet Adapter (PCI) #2 - VirtualBox Bridged Networking Driver Miniport-WFP LightWeight Filter-0000
  Type=Ethernet(6), Hardware=No, Filter=Yes
19: VirtualBox Host-Only Ethernet Adapter
  Type=Ethernet(6), Hardware=Yes, Filter=No
20: VirtualBox Host-Only Ethernet Adapter-agnitum firewall driver-0000
  Type=Ethernet(6), Hardware=No, Filter=Yes
21: VirtualBox Host-Only Ethernet Adapter-QoS Packet Scheduler-0000
  Type=Ethernet(6), Hardware=No, Filter=Yes
22: VirtualBox Host-Only Ethernet Adapter-WFP LightWeight Filter-0000
  Type=Ethernet(6), Hardware=No, Filter=Yes
23: WAN Miniport (PPPOE)
  Type=PPP(23), Hardware=No, Filter=No
24: RAS Async Adapter
  Type=PPP(23), Hardware=No, Filter=No
25: Software Loopback Interface 1
  Type=Loopback(24), Hardware=No, Filter=No
26: WAN Miniport (SSTP)
  Type=Tunnel(131), Hardware=No, Filter=No
27: WAN Miniport (IKEv2)
  Type=Tunnel(131), Hardware=No, Filter=No
28: WAN Miniport (L2TP)
  Type=Tunnel(131), Hardware=No, Filter=No
29: WAN Miniport (PPTP)
  Type=Tunnel(131), Hardware=No, Filter=No
30: Microsoft ISATAP Adapter
  Type=Tunnel(131), Hardware=No, Filter=No
31: Microsoft Teredo Tunneling Adapter
  Type=Tunnel(131), Hardware=No, Filter=No
32: Microsoft ISATAP Adapter #2
  Type=Tunnel(131), Hardware=No, Filter=No

太字にしたものがハードウェアインタフェースです。9番は既に取り外されているインタフェースで(状態を出力するとIfOperStatusNotPresentが返る)、11番は実際にネットワークにつながって通信可能なインタフェース、19番はVirtualBoxが作成したインタフェースです。
(10番も本来はHardware=Yesのはずですが、VMwareで何度も設定を変えて認識させているうちに#2ができたりして状態がおかしくなったのか、Noになっています。9番同様、取り外されているという認識になっているので、集計上は問題はなさそう)

この環境ではInterface=0で上記3つのインタフェースの合計値を出すことになりますが、9番は使われていないので0、19番はゲストOS側でこのインタフェースを使わない限りは0(?)と思われるので、実質11番のみの値が出力されることになります。問題となっていたフィルタインタフェースも集計されません。

※ "Hardware=No, Filter=No"な論理インタフェースについては不明な部分もあり、どうチェックしたらいいのかもわからないので、今回は足しこまないようにしてあります(論理インタフェースということは、結局は物理インタフェースのどれかを使って通信をしているのではとも考えられるので)。また、携帯電話デバイスが認識される環境もあるようですが、どういう風に認識しているのか謎です。

続きからはコード詳細。

続きを読む »

[Rainmeter-dev] ネットワークトラフィックの値がおかしい #2

2010.01.25 | Rainmeter-dev // Issue/ネットワーク関連

0 Comments

前回の記事 : [Rainmeter-dev] ネットワークトラフィックの値がおかしい

前回の記事では、ざっくりとではありますがXPとVista/7での違いを調べました。

今回は、ネットワークトラフィックの値が2~数倍になってしまう原因について調べてみます。
まずはWindows7(on VMware)でのインタフェースの列挙の結果から。VirtualBoxをインストールしてあるので若干変わってます。

* NETWORK-INTERFACE: Count=32

1: AMD PCNET Family Ethernet Adapter (PCI) - VirtualBox Bridged Networking Driver Miniport
2: Intel(R) PRO/1000 MT Desktop Adapter - VirtualBox Bridged Networking Driver Miniport
3: WAN Miniport (IPv6)
4: WAN Miniport (Network Monitor)
5: AMD PCNET Family Ethernet Adapter (PCI) #2-agnitum firewall driver-0000
6: AMD PCNET Family Ethernet Adapter (PCI) #2 - VirtualBox Bridged Networking Driver Miniport
7: WAN Miniport (IP)
8: AMD PCNET Family Ethernet Adapter (PCI) #2 - VirtualBox Bridged Networking Driver Miniport-QoS Packet Scheduler-0000
9: Intel(R) PRO/1000 MT Desktop Adapter
10: AMD PCNET Family Ethernet Adapter (PCI)
11: AMD PCNET Family Ethernet Adapter (PCI) #2
12: WAN Miniport (IPv6)-agnitum firewall driver-0000
13: WAN Miniport (IPv6)-QoS Packet Scheduler-0000
14: WAN Miniport (IP)-agnitum firewall driver-0000
15: WAN Miniport (IP)-QoS Packet Scheduler-0000
16: WAN Miniport (Network Monitor)-agnitum firewall driver-0000
17: WAN Miniport (Network Monitor)-QoS Packet Scheduler-0000
18: AMD PCNET Family Ethernet Adapter (PCI) #2 - VirtualBox Bridged Networking Driver Miniport-WFP LightWeight Filter-0000
19: VirtualBox Host-Only Ethernet Adapter
20: VirtualBox Host-Only Ethernet Adapter-agnitum firewall driver-0000
21: VirtualBox Host-Only Ethernet Adapter-QoS Packet Scheduler-0000
22: VirtualBox Host-Only Ethernet Adapter-WFP LightWeight Filter-0000
23: WAN Miniport (PPPOE)
24: RAS Async Adapter
25: Software Loopback Interface 1
26: WAN Miniport (SSTP)
27: WAN Miniport (IKEv2)
28: WAN Miniport (L2TP)
29: WAN Miniport (PPTP)
30: Microsoft ISATAP Adapter
31: Microsoft Teredo Tunneling Adapter
32: Microsoft ISATAP Adapter #2

32個も列挙されました。
このうち、"AMD PCNET Family Ethernet Adapter (PCI) #2"が実際に通信に使われているNICになります。

次はRainmeter.iniに書き出されたStatsを見てみます。[Statistics]の値です。ここにはRainmeter起動中に行われたネットワークトラフィック量の累積値が書き出されています。
インタフェース32個分あるので、ちょっと長いです。

[Statistics]
Since=Sun Jan 24 00:01:00 2010
NetStatsCount=32

NetStatsInHigh1=0
NetStatsInLow1=0
NetStatsOutHigh1=0
NetStatsOutLow1=0
NetStatsInHigh2=0
NetStatsInLow2=0
NetStatsOutHigh2=0
NetStatsOutLow2=0
NetStatsInHigh3=0
NetStatsInLow3=0
NetStatsOutHigh3=0
NetStatsOutLow3=0
NetStatsInHigh4=0
NetStatsInLow4=0
NetStatsOutHigh4=0
NetStatsOutLow4=0
NetStatsInHigh5=0
NetStatsInLow5=335276
NetStatsOutHigh5=0
NetStatsOutLow5=84770
NetStatsInHigh6=0
NetStatsInLow6=335276
NetStatsOutHigh6=0
NetStatsOutLow6=84770
NetStatsInHigh7=0
NetStatsInLow7=0
NetStatsOutHigh7=0
NetStatsOutLow7=0
NetStatsInHigh8=0
NetStatsInLow8=335276
NetStatsOutHigh8=0
NetStatsOutLow8=84770
NetStatsInHigh9=0
NetStatsInLow9=0
NetStatsOutHigh9=0
NetStatsOutLow9=0
NetStatsInHigh10=0
NetStatsInLow10=0
NetStatsOutHigh10=0
NetStatsOutLow10=0
NetStatsInHigh11=0
NetStatsInLow11=335276
NetStatsOutHigh11=0
NetStatsOutLow11=84770
NetStatsInHigh12=0
NetStatsInLow12=0
NetStatsOutHigh12=0
NetStatsOutLow12=0
NetStatsInHigh13=0
NetStatsInLow13=0
NetStatsOutHigh13=0
NetStatsOutLow13=0
NetStatsInHigh14=0
NetStatsInLow14=0
NetStatsOutHigh14=0
NetStatsOutLow14=0
NetStatsInHigh15=0
NetStatsInLow15=0
NetStatsOutHigh15=0
NetStatsOutLow15=0
NetStatsInHigh16=0
NetStatsInLow16=0
NetStatsOutHigh16=0
NetStatsOutLow16=0
NetStatsInHigh17=0
NetStatsInLow17=0
NetStatsOutHigh17=0
NetStatsOutLow17=0
NetStatsInHigh18=0
NetStatsInLow18=335276
NetStatsOutHigh18=0
NetStatsOutLow18=84770
NetStatsInHigh19=0
NetStatsInLow19=0
NetStatsOutHigh19=0
NetStatsOutLow19=0
NetStatsInHigh20=0
NetStatsInLow20=0
NetStatsOutHigh20=0
NetStatsOutLow20=0
NetStatsInHigh21=0
NetStatsInLow21=0
NetStatsOutHigh21=0
NetStatsOutLow21=0
NetStatsInHigh22=0
NetStatsInLow22=0
NetStatsOutHigh22=0
NetStatsOutLow22=0
NetStatsInHigh23=0
NetStatsInLow23=0
NetStatsOutHigh23=0
NetStatsOutLow23=0
NetStatsInHigh24=0
NetStatsInLow24=0
NetStatsOutHigh24=0
NetStatsOutLow24=0
NetStatsInHigh25=0
NetStatsInLow25=0
NetStatsOutHigh25=0
NetStatsOutLow25=0
NetStatsInHigh26=0
NetStatsInLow26=0
NetStatsOutHigh26=0
NetStatsOutLow26=0
NetStatsInHigh27=0
NetStatsInLow27=0
NetStatsOutHigh27=0
NetStatsOutLow27=0
NetStatsInHigh28=0
NetStatsInLow28=0
NetStatsOutHigh28=0
NetStatsOutLow28=0
NetStatsInHigh29=0
NetStatsInLow29=0
NetStatsOutHigh29=0
NetStatsOutLow29=0
NetStatsInHigh30=0
NetStatsInLow30=0
NetStatsOutHigh30=0
NetStatsOutLow30=0
NetStatsInHigh31=0
NetStatsInLow31=0
NetStatsOutHigh31=0
NetStatsOutLow31=0
NetStatsInHigh32=0
NetStatsInLow32=0
NetStatsOutHigh32=0
NetStatsOutLow32=0

NetStatsOutHighが64ビット中の上位32ビット、NetStatsOutInが64ビット中の下位32ビットを表しています。内部では組み合わせて64ビット値として使われています。

この転送量を見てみると、値が書き出されているのは、「5, 6, 8, 11, 18」の5つです。また、その5つはどれも同じ転送量が記録されています。

インタフェース番号を元に、この5つの名称を抜き出してみると、

5: AMD PCNET Family Ethernet Adapter (PCI) #2-agnitum firewall driver-0000
6: AMD PCNET Family Ethernet Adapter (PCI) #2 - VirtualBox Bridged Networking Driver Miniport
8: AMD PCNET Family Ethernet Adapter (PCI) #2 - VirtualBox Bridged Networking Driver Miniport-QoS Packet Scheduler-0000
11: AMD PCNET Family Ethernet Adapter (PCI) #2
18: AMD PCNET Family Ethernet Adapter (PCI) #2 - VirtualBox Bridged Networking Driver Miniport-WFP LightWeight Filter-0000

同じインタフェースでした。実際に使われているのは本体である11番のはずですが、他の4つからも同じ転送量が取れてしまっています。
こいつらはなんぞやというと、フィルタドライバです(入出力を横取りしてどうこうするもの?)。XPでは列挙されなかったこれらの値が全て加算され、この環境では5倍の値で表示されてしまうというわけです。

除外する対象は分かったものの、今までの方法では区別が付けられません。よって、Vista以降に用意された新しいAPIを使う必要があります。
次回はこのAPIを使って、インタフェースの種類をもう少し細かく振り分けてみます。

[Rainmeter-dev] モニタセレクタ

2010.01.22 | Rainmeter-dev // Issue/マルチモニタ関連

0 Comments

モニタセレクタ

公式のフォーラムで行われていたマルチモニタについての議論の中で、手動でRainmeter.iniを編集することなく、スキンを表示するモニタを指定したいというような要望というか希望というか、そういう話が出ていたので、これまで書いてきたマルチモニタ対応コードを整理して他の部分へも適用しやすくしつつ、新たにモニタセレクタメニューなるものを追加してみました(上の画像の"Display Monitor"サブメニューがそれ)。r317にて他のマルチモニタ対応コードとともにコミット済みです。

Rainmeterには0.14.1の後期から、WindowX/Yに"@2"などのモニタ番号を付加することで、スキンを表示するモニタを指定する機能がついていますが、これは自動的に付加されるものではなく、ユーザ側が手動でRainmeter.iniを編集して付加する必要がありました(一部の環境ではマルチモニタ機能がバグっていたために、モニタ番号を付加しないと意図したように動かなかったこともあり、その回避策として編集してもらうこともあった)。今回追加したメニューはその編集の手間を減らします。

Rainmeter.iniにおけるモニタ番号の解釈には3タイプあり、

 ・プライマリモニタを表す(なにもつけない) 例: WindowX=100
 ・仮想スクリーンを表す("@0"をつける) 例: WindowX=100@0
 ・存在する各モニタの番号を表す("@n"をつける) 例: WindowX=100@2

のどれかが使えます。"@n"のnには1~モニタ数分まで指定できます。1台のみなら"@1"だけで、3台なら"@1"から"@3"まで指定できます。

メニュー項目は上の3項目それぞれに対応しています。"Use default: Primary monitor"がプライマリモニタ、"@0: Virtual screen"が仮想スクリーン、"@1: (モニタ名)" ~ "@3: (モニタ名)"までが各モニタになります。項目を選択した時点で、Rainmeter.iniでの表記もその指定された項目を基準にした座標に置き換わります。

一番下の"Auto-select based on window position"は、モニタ番号の指定をさらに簡略化させるオプションです。これをチェックした状態でスキンウィンドウをドラッグさせると、モニタ番号の指定を自動的にそのウィンドウが位置するモニタ番号に置き換えるようになります。例えば、"@1"にあるスキンウィンドウを"@2"へドラッグすると、Rainmeter.iniのモニタ番号も自動的に"@2"へと置き換わります。
自動判定の仕組み上、メニューからモニタが直接選択されたら、このオプションは解除されます。

* * *

と、いうわけで、シングルモニタ環境ではまったく利益のない機能ではありますが、マルチモニタ環境ではちょっぴり便利になる機能です。

続きからは具体的な処理内容について。

続きを読む »

Next Page »

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。