雨の玲音 みたいなかんじかな... 【Visat技術情報】
 Windows エクスペリエンス インデックスとは?(その2)

2006/12/30
更新:2007/01/03

<< 前のページへ

 さて、その2ではエクスペリエンス インデックス活用方法について記していこうと思います。先ずは一般ユーザさんから見た視点で、そして開発側からみた視点でお送りします。

※ この記事へのリンクは... http://www.rainylain.jp/vc/vista/experience_index.htm
※ この記事は独自に作成/掲載しているものですので、内容についてマイクロソフト様などに問い合わせ等行わないように
  お願い致します。

 

■具体的に何に使えるの?

 使い方は大きく分けて2つあります。
 1つ目はお使いのPCの構成についてです。といっても具体的にどんな製品を使用しているかではなく、どのような能力を持っているかです。各カテゴリの評価をみて一番低い値が基本スコアとして評されますが、この一番低いもの、場合によってはさらに次に低いカテゴリに注目してパーツの交換などを検討します。

低く評価されたコンポーネント 評価を上げるためのキーパーツ
プロセッサ:  可能であればCPUを交換します。同じ種類のより高いクロックの製品などがある場合は向上させることができるかと思います。ただしCPUの交換はPCを自作できる程度の知識と技術が必要ですので、無理な場合はPCの買い替えを検討するしかありません。
 また自分が求める能力より著しく低い場合は、PC全体で能力不足を起こしている可能性もありますので、PCの買い替えなどを検討します。
メモリ(RAM):  PCに搭載されているメモリ量で評価に制限(前ページの「測定に影響する要素」を参照)がかかっていると思われる場合はメモリを増設します。メモリを刺すソケットの数に空きが無い場合は交換になります。
 PCの快適さを向上させるには効果の大きい項目ですし、CPUの交換より手軽に出来るのと、メーカー製PCの一部では交換/増設のサービスがあることも考えられますので前向きに検討すると良いでしょう。
(購入時の価格を下げるために少なめに搭載して販売しているPCも多いです)
グラフィックス:  カタログに「グラフィック統合チップ」や「オンボードグラフィック」と書かれているPCではグラフィックに割り当てるメモリ量を増加させることで向上する場合があります。ただし、割り当てに使用されるメモリ量は当然ながら上記の「メモリ(RAM)」から引かれますので、バランスを考えて設定する必要があります。下記「ゲーム用グラフィックス」の能力も低く評価されている場合は、可能であればグラフィクカードを別途搭載することを検討します。
 グラフィックが専用のパーツで搭載されている場合(AGPやPCI-Expressスロットに搭載)はよりメモリ搭載量の多いグラフィクカードに交換します。
ゲーム用グラフィックス:  グラフィックカードの追加/交換を検討します。CPUのようにチップだけ交換といった様なことは出来ません。
プライマリハードディスク:  ここで言われている「プライマリ」とはOSが入っているドライブ(多くはCドライブ)が含まれるHDDのことです。流行のNASやeSATAによるHDDの増設では評価は向上しません。
 ハードディスク(HDD)は容量だけではなく転送速度もどんどん向上しているパーツですので、最新のものに交換すると評価が向上することが考えられます。
 PCを自作する方はご存知のようにプラッタ容量の多いHDD(一般的に80Gプラッタより160Gプラッタの方が転送速度が速いといったぐあい)に交換するか、HDDの接続インターフェースをIDEからSerial ATA(特にNCQ対応のSerial ATA 2.5)に変えるなどを検討します。
※他のパーツとちがい、通常OSが再インストールになることに注意してください


 もう1つの使い方は、ソフトウェアを購入する際の適合性です。
 お使いのPCのスコアと、購入したいソフトが要求しているスコア値を比べます。ソフトのパッケージにこれまであった「CPU 〜以上」「メモリ○○MB以上搭載」といった記載と同じように、動作最低スコア2.0/動作推奨スコア5.9といったような記載がされます。(記載することが必須なわけではありません)



CPUがAMD製品でも迷わない?より分かりやすく直感的に表現される要求スペック

 

 

■評価マークの使用について。個人でも使えるの?

 評価マーク、つまりはWindowsのフラッグの上に数値がくるスコア値のグラフィックですが、Vista製品版の前のテスト時には丸に数字が描かれただけのものでした。その後製品版に向けてデザインされたものだと思いますが、Windowsのマークが入った関係で勝手に使用できるという性格のものではなくなりました。

 フリーソフトなどでも必要スコア表示が使えるのかとの問いにMS大塚氏は「個人でもわりと簡易な登録などで使えるのではなかったかな」と仰っていましたが、今現在Vista関連のロゴといえばUSのサイトも含めて下記ロゴのことしか記載が見つかりません。

Vistaのアプリ関連ロゴ 内容
Certified for Windows Vista Vistaでの品質が保障されたソフトウェアなど
Works with Windows Vista Vistaでのアプリケーションの互換性が保障されたソフトウェア

 これらは企業用、それもVeriSignなどによって発行されたデジタル署名証明書を有するような大手企業向けであり、ハードウェアやドライバといったシステム側から大手ソフトウェアベンダが自社製品の販売時に使用するようなものです。(パートナープログラムの一環として行われる)

 そもそも使用したいのはこれらのロゴではなく、要求するスコア値を表すロゴなのですが、まだ準備が出来ていないのか忘れられているのか、まったく情報が得られていません

どうしたものか…

 

 

■API は?ActiveXに埋め込む?

 Windows エクスペリエンス インデックス用のC言語スタイルのWin32 API は用意されず、COMによって実装されています。これは昨今のWindowsの進化の流れに沿って考えてみれば何ら不思議な事ではありません。
 どういう事かというと、Win32APIは確かに有用でかつ高速にシステムにアクセスできますが、リモートから使用するといったことが出来ないものになってしまうからです。ローカル及びリモートからWindowsにアクセスを行い、色々と情報収集や操作を行える WMI(Windows Management Instrumentation)というものがありますし、そもそもエクスペリエンス インデックスを使用したいシーンの1つにWebシステムからのアクセスというものがあります。こういった使用方法にはCOMで実装するのが一番都合が良いのです。

 

WMI(Windows Management Instrumentation)

 話題が出たところで先ずは簡単にWMIによるエクスペリエンス インデックス値の取得を見てみましょう。エクスペリエンス インデックスの情報は「Win32_WinSAT」クラスで取得でき、定義は以下のようになっています。

class Win32_WinSAT
{
    string TimeTaken;                // 「前回の評価」つまり測定した日時
    real32 WinSPRLevel;              // 基本スコア値(SPR:System Performance Rating)
    uint32 WinSATAssessmentState;    // 評価の状態を表す値(1:評価済み、2:要再評価)
    real32 MemoryScore;              // 「メモリ(RAM)」のスコア値
    real32 CPUScore;                 // 「プロセッサ」のスコア値
    real32 DiskScore;                // 「プライマリハードディスク」のスコア値
    real32 D3DScore;                 // 「ゲーム用グラフィックス」のスコア値
    real32 GraphicsScore;            // 「グラフィックス」のスコア値
};

  以下のスクリプトを「experience_index.vbs」(VBScriptファイル)とでもして保存し,、コマンドラインで "cscript.exe experience_index.vbs" を実行します。


strComputer = "."       ' このコンピュータ名はローカルを表す"."でもリモートPC名でも良い

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * From Win32_WinSAT")

For Each objItem in colItems
    Wscript.Echo "Processor: " & objItem.CPUScore
    Wscript.Echo "Memory: " & objItem.MemoryScore
    Wscript.Echo "Primary hard disk: " & objItem.DiskScore
    Wscript.Echo "Graphics: " & objItem.GraphicsScore
    Wscript.Echo "Gaming graphics: " & objItem.D3DScore
    Wscript.Echo ""
    Wscript.Echo "TimeTaken: " & objItem.TimeTaken
    Wscript.Echo "WinSATAssessmentState: " & objItem.WinSATAssessmentState
Next

 WMIの良いところはローカルとリモートで区別なく実行できる点にあります。もちろん取得先となるPCへのアクセス権等は必要になりますが、Active Directoryを構成しているサーバ/クライアントシステムではクライアントの管理で実に便利に使用できます。
 自動認証が効かないPC(別ドメインに所属していたり、ワークグループのPC)へアクセスしたい場合は下記のように変更します。


strComputer = "."      ' このコンピュータ名はローカルを表す"."でもリモートPC名でも良い

Set objWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objWmiServices = objWbemLocator.ConnectServer(strComputer, "root\cimv2", _
                                                  strNamespace, strUser, strPassword)

詳しくはMicrosoft TechNetのスクリプト センターなどをご覧下さい。

 

C++言語を用いたCOMインターフェース

 Vista用のWindows SDKをMicrosoftのダウンロードサイトから取得して使用します。



WinSAT インターフェース(COM)

 

 Windows SDKのインストール先にある Includeフォルダ配下の WinSATCOMInterfaceI.h ヘッダには次のような定義があります。これらを用いて情報を取得します。


typedef enum 
{
    WINSAT_ASSESSMENT_MEMORY   = 0,    // メモリ(RAM)
    WINSAT_ASSESSMENT_CPU      = 1,    // プロセッサ
    WINSAT_ASSESSMENT_DISK     = 2,    // プライマリハードディスク
    WINSAT_ASSESSMENT_D3D      = 3,    // ゲーム用グラフィックス
    WINSAT_ASSESSMENT_GRAPHICS = 4,    // グラフィックス
} WINSAT_ASSESSMENT_TYPE;

typedef enum 
{
    WINSAT_ASSESSMENT_STATE_MIN                      = 0,    // この列挙子の最小値
    WINSAT_ASSESSMENT_STATE_UNKNOWN                  = 0,    // 不明
    WINSAT_ASSESSMENT_STATE_VALID                    = 1,    // 有効(測定済み)
    WINSAT_ASSESSMENT_STATE_INCOHERENT_WITH_HARDWARE = 2,    // 構成変更につき要再測定
    WINSAT_ASSESSMENT_STATE_NOT_AVAILABLE            = 3,    // WinSAT利用不可
    WINSAT_ASSESSMENT_STATE_INVALID                  = 4,    // 無効
    WINSAT_ASSESSMENT_STATE_MAX                      = 4     // この列挙子の最大値
} WINSAT_ASSESSMENT_STATE;
typedef enum
{
    WINSAT_BITMAP_SIZE_SMALL  = 0,    // 32x24ピクセルビットマップ
    WINSAT_BITMAP_SIZE_NORMAL = 1     // 80x80ピクセルビットマップ
} WINSAT_BITMAP_SIZE;

 

 スコア情報などを取得する例です。返される文字列はUnicodeですのでご注意下さい。
 なお、get_Descriptionで取得できる説明は、スコア画面の「評価につての説明」ではなく、コンピュータの詳細で表示されているそのPCの詳細です。(例えばメモリの場合は“1.00 GB”など)
 評価値を得る前に IProvideWinSATResultsInfo::get_AssessmentState で状態を取得するようにしてください。(サンプルでは省略されています)


#include <atlbase.h>
#include <atlcom.h>
#define __RPC__out
#define __RPC__deref_out_opt_string
#define __RPC__deref_out_opt
#define __RPC__in
#define __RPC__in_opt
#include "WinSATCOMInterfaceI.h"

{
    // COMの初期化
    CoInitialize(NULL);

    HRESULT hr;
    CComPtr<IQueryRecentWinSATAssessment> pQueryRecentWinSAT;
    CComPtr<IProvideWinSATResultsInfo>    pWinSatInfo;
    CComPtr<IProvideWinSATAssessmentInfo> pWinSatAssessmentInfo;
    float fScore;           // 1.0 〜 5.9 …
    CComBSTR bsTitle;       // Unicode Text
    CComBSTR bsDescription; // Unicode Text

    // WinSatの情報検索オブジェクトを取得する
    hr = CoCreateInstance(__uuidof(CQueryWinSAT), 
                          NULL, 
                          CLSCTX_INPROC_SERVER, 
                          __uuidof(IQueryRecentWinSATAssessment), 
                          (void**)&pQueryRecentWinSAT);
    if(FAILED(hr))
    {
        // エラー判定の例
        return;
    }

    // 測定済み情報オブジェクトを取得する
    hr = pQueryRecentWinSAT->get_Info(&pWinSatInfo);

    // 「基本スコア」を取得する(2.4000001のような値が得られる)
    hr = pWinSatInfo->get_SystemRating(&fScore);

    // 各「コンポーネント」情報オブジェクトを取得する(この例では「メモリ(RAM)」)
    hr = pWinSatInfo->GetAssessmentInfo(WINSAT_ASSESSMENT_MEMORY,
                                        &pWinSatAssessmentInfo);

    // 各項目の情報を取得する
    hr = pWinSatAssessmentInfo->get_Score(&fScore);             // スコア
    hr = pWinSatAssessmentInfo->get_Title(&bsTitle);            // コンポーネント名
    hr = pWinSatAssessmentInfo->get_Description(&bsDescription);// 評価についての詳細文
}

 

 続いて評価値を表すビットマップを生成するサンプルです。ビットマップとして表示可能なのは状態が WINSAT_ASSESSMENT_STATE_VALID (1) または、WINSAT_ASSESSMENT_STATE_INCOHERENT_WITH_HARDWARE (2) の場合だけで、数値も1.0以上である必要があります。


{
    // COMの初期化
    CoInitialize(NULL);

    HRESULT hr;
    CComPtr<IProvideWinSATVisuals> pProvideWinSATVisuals;
    HBITMAP hBitmap;

    // WinSatビジュアルオブジェクトを作成する
    hr = CoCreateInstance(__uuidof(CProvideWinSATVisuals), 
                          NULL, 
                          CLSCTX_INPROC_SERVER, 
                          __uuidof(IProvideWinSATVisuals), 
                          (void**)&pProvideWinSATVisuals);

    if(FAILED(hr))
    {
        // エラー判定の例
        return;
    }

    // 絵のサイズ種類と評価値を指定してビットマップを作成する
    pProvideWinSATVisuals->get_Bitmap(WINSAT_BITMAP_SIZE_NORMAL,      // 80x80ピクセル
                                      WINSAT_ASSESSMENT_STATE_VALID,  // 状態(有効)
                                      5.9,                            // 表示したい値
                                      &hBitmap);                      // ここに返される
}

 

Webでの利用

 MS大塚氏は「独自のActiveXを作成して利用する」と言っていましたが、確かに上記COMインターフェースを利用したActiveXモジュールを作るのも手ではあります。(その方が構成がすっきりすることもあります)

 その他にも実は何も作成しなくても直接呼び出すことも出来ます。Windows SDKに含まれているサンプルソース QueryWinsat.js を利用して下記のようなサンプルページを作成してみました。
 QueryAllWinsat オブジェクトでXMLを取得して、流行のAjaxと組み合わせるのも面白いでしょう。
 (IE7で new XMLHttpRequest、それ以前のnew ActiveXObject("MSXML2.XMLHTTP")など)


<html>
<body>
<pre>
<script language="JavaScript">
<!---
var queryAllWinsat = new ActiveXObject("QueryAllWinsat");  
  // この例では使用してません
var queryWinsat    = new ActiveXObject("QueryWinsat");

var assessmentInfo = queryWinsat.Info;
var level          = assessmentInfo.SystemRating;
var stateDesc      = assessmentInfo.RatingStateDesc;
var dateTime       = assessmentInfo.AssessmentDateTime;
var state          = assessmentInfo.AssessmentState;

document.writeln("Rating: " + level);
document.writeln("Desc: " + stateDesc);
document.writeln("Date/Time: " + dateTime);
document.writeln("State: " + state);

var score, title, description;
for(i = 0 ; i < 5 ; i++) 
{
    var info = assessmentInfo.GetAssessmentInfo(i); 
    document.writeln("-------------------");
    document.writeln(info.Title + info.Description);
    document.writeln("Score: " + info.Score);
    document.writeln("");
}
//--->
</script>
</pre>

</body>
</html>

 

ページ表示例
Rating: 2.4000000953674316
Desc: Windows エクスペリエンス インデックス
Date/Time: Fri Dec 29 21:00:25 UTC+0900 2006
State: 1
-------------------
メモリ (RAM):1.00 GB
Score: 4.5 
-------------------
プロセッサ:Intel(R) Pentium(R) 4 CPU 3.06GHz
Score: 4.199999809265137 
-------------------
プライマリ ハード ディスク:空き 80GB (合計 100GB)
Score: 5.400000095367432 
-------------------
ゲーム用グラフィックス:383 MB の 利用可能な総グラフィックス メモリ
Score: 3 
-------------------
グラフィックス:NVIDIA GeForce 6200 (Microsoft Corporation - WDDM) 
Score: 2.4000000953674316 

 

次のページへ >>

 

その1 「エクスペリエンス インデックス」とはそもそも何なのか?
・快適さを表す指標である
・特徴
・測定に影響する要素
その2 「エクスペリエンス インデックス」活用方法
・具体的に何に使えるの?
・評価マークの使用について。個人でも使えるの?
・API は?ActiveXに埋め込む?(開発サイドの話)
その3 活用想定例にみるエクスペリエンス インデックスの実際
・メーカー製PCのBTOにおけるパーツ選択
・アプリケーションが要求するスコア値
・おまけ - Aero利用条件

Copyright(C) RainyLain 2006