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

スポンサーサイト

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

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

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

2011.01.04 | Rainmeter-dev

0 Comments

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

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

以下格納。

例) Drive1とDrive2で指定されたディスクドライブの使用量を表示するスキンの一部 (Pin1とPin2を押下で表示するドライブを切り替える&PinはMouseOver/Leaveで色を変える)

[Rainmeter]
Update=10000
 
[Variables]
Pin1Drive1=C:\
Pin1Drive2=D:\
Pin2Drive1=E:\
Pin2Drive2=F:\
PinOverColor=255,255,255,255
PinLeaveColor=255,255,255,96
 
Drive1=#Pin1Drive1#
Drive2=#Pin1Drive2#
Pin1Color=#PinLeaveColor#
Pin2Color=#PinLeaveColor#
 
[StylePin]
Y=0
StringAlign=CENTER
SolidColor=0,0,0,1
Prefix="#"
DynamicVariables=1
 
 
;; METERS
 
[Pin1]
Meter=String
MeterStyle=StylePin
X=4
FontColor=#Pin1Color#
LeftMouseUpAction=!Execute [!RainmeterSetVariable Drive1 "#Pin1Drive1#"][!RainmeterSetVariable Drive2 "#Pin1Drive2#"]
MouseOverAction=!Execute [!RainmeterSetVariable Pin1Color "#PinOverColor#"]
MouseLeaveAction=!Execute [!RainmeterSetVariable Pin1Color "#PinLeaveColor#"]
 
[Pin2]
Meter=String
MeterStyle=StylePin
X=14
FontColor=#Pin2Color#
LeftMouseUpAction=!Execute [!RainmeterSetVariable Drive1 "#Pin2Drive1#"][!RainmeterSetVariable Drive2 "#Pin2Drive2#"]
MouseOverAction=!Execute [!RainmeterSetVariable Pin2Color "#PinOverColor#"]
MouseLeaveAction=!Execute [!RainmeterSetVariable Pin2Color "#PinLeaveColor#"]

上記のコードでは設定値自体は変更されていますが、Pin上にMouseOver/Leaveしても、押しても、意図したように「すぐには」表示が切り替わりません。設定値は変更されたものの、実際にUpdateされて反映されるのは、[Rainmeter]セクションで設定されたUpdate=10000(10秒)間隔だからです。

Update間隔が問題ならば、すぐ反映されるようにUpdate=の値を減らして例えば250にすれば、表示については体感上は問題ないレベルで切り替わります。ですがこれも問題があります。表示は問題なく切り替わる反面、スキン内のMeasure/Meterすべてが250ms間隔で更新されてしまい、不必要な負荷が増えてしまって、台無しです。ディスクドライブの使用量の確認に250ms間隔なんて必要ありません。

※前にも書きましたが、!RainmeterSetVariableの後に!RainmeterRedrawをつけても効果ありません。!RainmeterRedrawは設定値を再読み込みせず、ただ単にRedrawするだけです。

■!RainmeterUpdate

!RainmeterUpdateは、Measure/Meterの保持する値をUpdateするためのbangです。DynamicVariables=1なMeasure/Meterであれば、設定値も再読み込みします。これはUpdate=間隔で行われる処理とまったく同じものです。各Measure/Meterの持つUpdateDividerの値を無視しないのも同様です。

Updateという名前ですが、処理の中にはRedrawも含まれているので、このbangの後に!RainmeterRedrawを続ける必要はありません。

上の例を、!RainmeterUpdateを使って書き直してみます。

;; METERS
 
[Pin1]
Meter=String
MeterStyle=StylePin
X=4
FontColor=#Pin1Color#
LeftMouseUpAction=!Execute [!RainmeterSetVariable Drive1 "#Pin1Drive1#"][!RainmeterSetVariable Drive2 "#Pin1Drive2#"][!RainmeterUpdate]
MouseOverAction=!Execute [!RainmeterSetVariable Pin1Color "#PinOverColor#"][!RainmeterUpdate]
MouseLeaveAction=!Execute [!RainmeterSetVariable Pin1Color "#PinLeaveColor#"][!RainmeterUpdate]
 
[Pin2]
Meter=String
MeterStyle=StylePin
X=14
FontColor=#Pin2Color#
LeftMouseUpAction=!Execute [!RainmeterSetVariable Drive1 "#Pin2Drive1#"][!RainmeterSetVariable Drive2 "#Pin2Drive2#"][!RainmeterUpdate]
MouseOverAction=!Execute [!RainmeterSetVariable Pin2Color "#PinOverColor#"][!RainmeterUpdate]
MouseLeaveAction=!Execute [!RainmeterSetVariable Pin2Color "#PinLeaveColor#"][!RainmeterUpdate]

長いので上のほうを省略しましたが、Update=10000のままで、Pin1とPin2のActionに[!RainmeterUpdate]を追加しただけです。

これでDrive1とDrive2のドライブ指定もUpdate=の値に囚われずに変えられるし、Pinの色も変えられます……が、問題も増えてしまいました。Pinに触るたびに全部が更新されてしまって、場合によっては数ms間隔でディスク使用量を更新するハメに。

■!RainmeterUpdateMeter / !RainmeterUpdateMeasure

!RainmeterUpdateMeter / !RainmeterUpdateMeasureは、指定されたMeter/MeasureのみをUpdateするためのbangです。DynamicVariables=1であれば、設定値も再読み込みします。

!RainmeterUpdateとは違い、UpdateDividerの値は無視して強制的に値を更新します。また、Redrawもしません。必要なときに!RainmeterRedrawを呼ぶ必要があります。

Pinの色変更についてはスキン全体をUpdateする必要はなく、自分自身のみをUpdateするだけでいいので、!RainmeterUpdateMeterを使って以下のようにします。

;; METERS
 
[Pin1]
Meter=String
MeterStyle=StylePin
X=4
FontColor=#Pin1Color#
LeftMouseUpAction=!Execute [!RainmeterSetVariable Drive1 "#Pin1Drive1#"][!RainmeterSetVariable Drive2 "#Pin1Drive2#"][!RainmeterUpdate]
MouseOverAction=!Execute [!RainmeterSetVariable Pin1Color "#PinOverColor#"][!RainmeterUpdateMeter Pin1][!RainmeterRedraw]
MouseLeaveAction=!Execute [!RainmeterSetVariable Pin1Color "#PinLeaveColor#"][!RainmeterUpdateMeter Pin1][!RainmeterRedraw]
 
[Pin2]
Meter=String
MeterStyle=StylePin
X=14
FontColor=#Pin2Color#
LeftMouseUpAction=!Execute [!RainmeterSetVariable Drive1 "#Pin2Drive1#"][!RainmeterSetVariable Drive2 "#Pin2Drive2#"][!RainmeterUpdate]
MouseOverAction=!Execute [!RainmeterSetVariable Pin2Color "#PinOverColor#"][!RainmeterUpdateMeter Pin2][!RainmeterRedraw]
MouseLeaveAction=!Execute [!RainmeterSetVariable Pin2Color "#PinLeaveColor#"][!RainmeterUpdateMeter Pin2][!RainmeterRedraw]

これで色だけを変えられるようになります。

もし複数のMeter/Measureを更新する必要があるなら、!RainmeterUpdateMeterGroup / !RainmeterUpdateMeasureGroupを使ったほうが(それぞれにUpdateMeter/Measureを呼び出すよりもオーバーヘッドが減って)効率的です。

ちなみに、同じくbeta-r687から使える#CURRENTSECTION#という変数を使えば、Pin1とPin2のMouseOver/LeaveActionを簡単にまとめられます。#CURRENTSECTION#は自分自身のセクション名に置き換わる変数です。

[StylePin]
Y=0
StringAlign=CENTER
SolidColor=0,0,0,1
Prefix="#"
DynamicVariables=1
MouseOverAction=!Execute [!RainmeterSetVariable #CURRENTSECTION#Color "#PinOverColor#"][!RainmeterUpdateMeter #CURRENTSECTION#][!RainmeterRedraw]
MouseLeaveAction=!Execute [!RainmeterSetVariable #CURRENTSECTION#Color "#PinLeaveColor#"][!RainmeterUpdateMeter #CURRENTSECTION#][!RainmeterRedraw]

StylePinにまとめましたが、実行時にはStylePinではなく、このStyleを使っているMeter側の名前に置き換わります。Pin1ならPin1、Pin2ならPin2です。

同じように、LeftMouseUpActionの#Pin1Drive1#の部分のPin1も、##CURRENTSECTION#Drive1#のようにまとめられそうに見えますが、#が入れ子になるとたぶん置き換え誤爆するので、使わないほうがいいです。

■Update=-1 / UpdateDivider=-1

手動更新の実装に伴い、Update=とUpdateDivider=に-1を指定できるようにしました。今までも指定自体はできましたが、未定義の動作です(実際にはこれらはUINTだったので、32bitで表現できる最大値を指定したのと同じ)。

新しい動作は、「-1なら(初期化時以外では)自動でUpdateしない」です。!RainmeterUpdateと!RainmeterUpdateMeter/Measureの特性上、手動でUpdateした場合にも動作が少し違います。

!RainmeterUpdateは、Update=-1の場合でも全Measure/Meterを更新しますが、UpdateDivider=は無視しないため、UpdateDivider=-1のMeasure/Meterは更新しません。

!RainmeterUpdateMeasure/Meterは、Update=-1であろうが、UpdateDivider=-1であろうが、指定されたMeasure/Meterを更新します。

このUpdate=-1の仕組みを使って、個人的に使っているスキンでは、上の例のようなスキンを「使用量表示」と「セレクタ」の2つのスキンに分離して使っています。使用量表示は定期的に更新が必要だけど、セレクタ部分は「MouseOver/Leave/Up」以外では更新の必要がないためです。

使用量表示スキンではUpdate=15000程度にしておき、#Drive1#と#Drive2#を用意して、この変数を外部スキンから弄ることで表示するドライブを変更できるようにしておきます。
セレクタスキンはUpdate=-1にして、Pinの色変更とDrive1/2の設定をします。

ディスク使用量程度であれば、もしスキンの縦横の大きさが大きくなければ、2つに分けずとも上の例のままでもいいと思います(縦横が大きいと、Pinの色変更で発生する再描画負荷が大きくなるため、分けたほうがいいかも)。Update=-1はランチャなどで使えるかもしれません。

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

- Comments
0 Comments

管理者にだけ表示を許可する
- Trackbacks
0 Trackbacks


この記事にトラックバックする(FC2ブログユーザー)

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