Direct3D11/DirectX11 ComputeShader 4.0 を使う

DirectX11 の ComputeShader が実際に動くようになりました。

Direct3D11 GeForce driver 186.08 beta

ComputeShader 4.0 は FeatureLevel 10.0。つまり 1世代前の GPU で動作します。
cs4.0/4.1 の存在自体は November 2008 SDK でも確認できました。
しかしながら実際に使うためにはドライバの対応を待つ必要があったわけです。

本来の ComputeShader (cs5.0) の仕様に対して cs4.0 はサブセットとなります。
機能制限のある cs4.0 は、ぱっと見 PixelShader とほとんど違わないし
どこにメリットがあるのかあまりわからないかもしれません。
とりあえず目に付いた ComputeShader4.0 の利点は次の通り。

・シェーダーがバッファに書き込みできる
・共有メモリへアクセスできる

描画パイプラインに組み込まれたシェーダーの場合、ストリームとして動作するため
出力位置は固定でした。
ComputeShader は戻り値を持たず、代わりに UnorderedAccessView を通して
リソースの任意の位置にデータを書き込むことができます。

共有メモリはスレッド間でデータの受け渡しができるプロセッサ内部のローカルメモリです。
高速アクセス可能で他のスレッドが書き込んだ値を参照することもできます。

VertexShader 等を通さずに直接シェーダーのみ実行できるのも ComputeShader
の特徴となります。

●実行とデータの受け渡し

ComputeShader を実行する命令は Dispatch() です。

iDeviceContext->CSSetShader( iCS, NULL, 0 );
UINT	v= 0;
iDeviceContext->CSSetUnorderedAccessViews( 0, 1, &iOutputUAView, &v );
iDeviceContext->CSSetShaderResources( 0, 1, &iInputView );
iDeviceContext->Dispatch( 1, 1, 1 );

この例では入力が ShaderResourceView (SRV)、出力は
UnroderedAccessView (UAV) です。

入力データは何らかの形で SRV のリソースに書き込んでおきます。
ConstantBuffer や Texture へ書き込む手順と変わらないので難しくありません。

実行結果は UAV で受け取ります。
UAV のリソースは RenderTarget 同様 GPU が書き込むため D3D11_USAGE_DEFAULT
を指定しておきます。
デバッグ時など、結果を何らかの形で CPU で受け取りたい場合は
D3D11_USAGE_STAGING のバッファにコピーしなければなりません。

STAGING リソースから読み込む場合 Map() を使いますが、STAGING への Map は
ChildContext で実行することができませんでした。
STAGING は直接メモリアクセスしているのに、コマンドをバッファにためるだけでは
意味がないので当然かもしれません。
スレッド対応のためにすべて Deferred Context 化している場合は注意が必要です。
Immediate Context を使います。

(1) SRV リソースへ書き込み
  ・UpdateSubresource() → USAGE_DEFAULT
  ・Map() → USAGE_STAGING → CopyResource() → USAGE_DEFAULT
  ・Map() → USAGE_DYNAMIC
(2) 実行 Dispatch()
(3) UAV から結果受け取り
  ・USAGE_DEFAULT → CopyResource() → USAGE_STAGING → Map()

このように、ComputeShader の場合 CPU とのデータやりとりも一般のシェーダーと
同じ手順が必要になります。
CUDA とか ATI Stream (CAL) より若干手間がいるかもしれません。

ComputeShader 4.x の場合、UAV は RAW または Structured Buffer のみ使用できます。
同時に与えられる UAV も 1つだけです。

● ComputeShader の実行回数と ID

PixelShader なら 2次元の面積で描画するピクセル数が決定します。
このピクセルの数だけ Shader を実行することになります。

ComputeShader の場合 3次元の体積で実行するスレッドの数を指定できます。

例えば XYZ= ( 2, 3, 1 ) の場合、2 x 3 x 1 = 6 スレッド走ります。
各スレッドは自分がどの座標に対応しているのか 3次元の id 番号を
受け取ることができるわけです。

実行するスレッドの個数の指定は二カ所で行います。

1. Dispatch() の引数
2. ComputeShader のアトリビュート numthreads 指定

[numthreads(3,2,1)]  // ←これ
void cmain1(
		uint3 did : SV_DispatchThreadID,
		uint3 gid: SV_GroupThreadID,
		uint3 group: SV_GroupID,
		uint gindex : SV_GroupIndex
				)
{
	int	index= did.x + did.y * 10;
~

両者の指定は似ていますが別物です。
6次元の id 値を持っているといえるかもしれません。

・1グループ内のスレッド実行回数の定義

[numthreads()] で指定するのは 1グループ内で実行するスレッドの数です。
シェーダーのコンパイル時に決定するので static な値となります。

  uint3 SV_GroupThreadID // グループ内のスレッド番号

semantic SV_GroupThreadID はグループ内の id 番号を受け取ることができます。
[numthreads(3,2,1)] は次の 6 通り。

(0,0,0) (1,0,0) (2,0,0) (0,1,0), (1,1,0), (2,1,0)

  int SV_GroupIndex // グループ内の通し番号

SV_GroupIndex はグループ内の連番です。
[numthreads(3,2,1)] の場合 0~5 の連番を受け取ります。

・グループ自体を何回実行するか指定する

Dispatch() の引数は、シェーダーで定義したスレッド Group をさらに何回実行するか
指定します。例えば [numthreads(3,2,1)] を Dispatch( 2, 1, 1 ) で呼び出すと
合計 12スレッドプログラムが走ることになります。

  uint3 SV_GroupID // グループの番号

SV_GroupID はグループにつけられた番号です。
例えば Dispatch( 10, 2, 1 ) で呼び出すと (0,0,0)~(9,1,0) まで。
同じグループの中のスレッドはすべて同じ値です。

  uint3 SV_DispatchThreadID // 3次元の通し番号

SV_DispatchThreadID は numthreads も Dispatch も区別無く、3次元に展開した
スレッドの通し番号になります。
例えば [numthreads(3,2,1)] を Dispatch( 4, 9, 1 ) で呼び出すと 216スレッド。
(3*4, 2*9, 1*1) の範囲なので (0,0,0)~(11,17,0) までの値を取ります。

[numthreads(3,2,1)] を Dispatch( 2, 1, 1 ) で呼び出した場合の ID 一覧。

SV_GroupID  SV_GroupThreadID  SV_GroupIndex  SV_DispatchThreadID
(0,0,0)     (0,0,0)           0              (0,0,0)
(0,0,0)     (1,0,0)           1              (1,0,0)
(0,0,0)     (2,0,0)           2              (2,0,0)
(0,0,0)     (0,1,0)           3              (0,1,0)
(0,0,0)     (1,1,0)           4              (1,1,0)
(0,0,0)     (2,1,0)           5              (2,1,0)
(1,0,0)     (0,0,0)           0              (3,0,0)
(1,0,0)     (1,0,0)           1              (4,0,0)
(1,0,0)     (2,0,0)           2              (5,0,0)
(1,0,0)     (0,1,0)           3              (3,1,0)
(1,0,0)     (1,1,0)           4              (4,1,0)
(1,0,0)     (2,1,0)           5              (5,1,0)

ComputeShader4.x の場合スレッド数の 3番目の値は必ず 1 でなければなりません。
つまり PixelShader 同様 2次元の id 指定に制限されます。

● Group

上記のようにスレッドの実行にはグループという概念があります。
プログラムの実行はこのグループ単位に行われているようです。

・スレッド共有メモリは group 毎に確保される
・共有メモリへのアクセスは group 単位で同期できる

●共有メモリ

ComputeShader はローカルな共有メモリにアクセスすることができます。
メモリ空間にマップされるわけではないので Buffer より高速です。
ShaderResource と違い読み書きも可能です。
同一グループ内の他のスレッドと共有できます。他のスレッドでも書き込んだ値を参照可能です。

・レジスタ = スレッド固有
・共有メモリ = グループ内のみ共有
・リソース(Buffer)

Shader プログラム内で groupshared 宣言すると共有メモリになります。

ComputeShader 4.x ではいくつか制限があります。
容量は 16KB までです。
また共有メモリの宣言はグループ内のスレッド数と同数でなければならず、
書き込めるのは自分の SV_GroupIndex に対応するメモリだけ。
宣言できる共有メモリも1つだけです。
その代わり Structured のように構造体を与えることが可能です。

struct SharedMem {
	float2	fl;
	uint	id;
};

groupshared SharedMem	buf[6]; // 3x2

[numthreads(3,2,1)]
void cmain(
		uint3 did : SV_DispatchThreadID,
		uint3 gid: SV_GroupThreadID,
		uint3 group: SV_GroupID,
		uint gindex : SV_GroupIndex
				)
{
	buf[  gindex ].fl.x= gindex;
~

groupshared 指定は、アセンブラコードだと下記の宣言になります。
g0 が共有メモリです。

dcl_tgsm_structured g0, 32, 6

●同期

ComputeShader 4.x の場合 Interlock 系の Atomic なオペレーション命令は
ありませんが、メモリアクセスに対する Barrier 同期は使えるようです。

GroupMemoryBarrierWithGroupSync();
GroupMemoryBarrier();
AllMemoryBarrierWithGroupSync();
AllMemoryBarrier();

GeForce 用ドライバ 186.08 beta ではこれらの命令が動作しませんでした。
命令のコンパイル自体は可能だし DebugLayer も無言だったので、ドライバがまだ
対応していないだけかもしれません。
Reference Driver を使うと Shader4.0 でも動作しました。

アセンブラでは sync 命令が挿入されています。

sync_g              GroupMemoryBarrier()
sync_g_t            GroupMemoryBarrierWithGroupSync()
sync_uglobal_g      AllMemoryBarrier()
sync_uglobal_g_t    AllMemoryBarrierWithGroupSync()

関連エントリ
Direct3D11/DirectX11 (6) D3D11 の ComputeShader を使ってみる
Direct3D11/DirectX11 (4) FeatureLevel と旧 GPU の互換性、テクスチャ形式など
Direct3D11 (DirectX11) シェーダーの書き込み RWBuffer 他

Direct3D11 GeForce driver 186.08 beta

masafumi さんのところで DirectX 11 対応ドライバが
動作したとの報告があがってました。

新 masafumi’s Diary Direct3D11対応ドライバ

CheckFeatureSupport() の結果を調べてみました。

ドライバ 186.08

[NVIDIA GeForce 9800 GT ]
   vmem:497MB sysmem:0MB shmem:2811MB
   flag=0 
  (Direct3D11)
   *HARDWARE  = 10.0 (a000)
     feature threading  DriverConcurrentCreates=1
     feature threading  DriverCommandLists=0
     feature d3d10_x ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x=1
     feature doubles  DoublePrecisionFloatShaderOps=0
[ATI Radeon HD 4670]
   vmem:504MB sysmem:0MB shmem:2811MB
   flag=0 
  (Direct3D11)
   *HARDWARE  = 10.1 (a100)
     feature threading  DriverConcurrentCreates=0
     feature threading  DriverCommandLists=0
     feature d3d10_x ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x=0
     feature doubles  DoublePrecisionFloatShaderOps=0

動いています。threading DriverConcurrentCreates と
d3d10_x ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x
が 1 になりました。

以前の結果はこちら

関連エントリ
Direct3D10/11 DXGI1.1 とリモート GPU (アダプタ)

メビウス PC-NJ70A (6) ユーザーインターフェース

タッチパッドとか操作性とか、多少使いづらかったとしてもそれはそれ。
「これでしかできないことがある」のは確かです。
光センサー液晶パッドはまだまだ初物。

今後ソフトウエアの改良によって他の PC と同じ操作性へ近づけていくことは可能でしょう。
でもメビウス PC-NJ70A と同じことが他のパソコンで出来るわけではありません。

これまで書いてきたように、それ以外を割り切ったのが一番の特徴です。
普段持ち歩いているとついついただの普通のパソコンとして見てしまいがち。
あらためて光センサー液晶パッドについて考えてみます。

使っていてあまりわくわくしないのはなぜでしょう。
多少欠点があっても、何かしら今後良くなりそうな可能性の片鱗が見えれば
たいした問題ではないはずです。

従来のパソコンにない新しい部分が、現状だと他のデバイスでも出来ることの
寄せ集めでしかなく、しかも劣っていることが原因かもしれません。

他に良いものがあることをユーザーは知ってますし、自分も常時 iPod touch を
持ち歩いています。
ようするに今の光センサー液晶パッドでは、マルチタッチを使った操作は全く快適では
ないということ。

ではどうすればよいか考えてみました。

●苦手なこと

使っていると光センサー液晶パッドと比較的相性の良い操作、苦手な操作がわかってきます。

良い

 ・ペン操作
 ・ボタン

だめ

 ・ドラッグ系
 ・ジェスチャ入力
    二本指スクロール・拡大縮小・回転

手描きのペン入力は割と素直に使えます。
手書き文字入力も想像より快適でした。線を加える毎に即座に文字が絞り込まれていきます。
レスポンスも速く、自分が行った操作とフィードバックが直結しています。
でも純粋なタブレット PC と違い、キーボードがあるから使わなくても困らないのも事実。

電卓やピアノといったシンプルなボタンを活用するユーザーインターフェースも
不満が少なく相性が良いといえます。
感圧式と違って触った時点で反応するので、押した感触がわかりやすいようです。

逆にドラッグ操作でオブジェクトを動かすような操作は苦手です。
タッチ位置にオブジェクトがついてこないし、遅延が目立つし、見た目とずれが
あるため慣れるまで思うように操作出来ません。

ジェスチャ系も同様です。
たとえばズーム操作では、読み込みが間に合わなかったとしても画像を拡大表示して
ごまかし、見た目の反応速度を上げるテクニックが良く用いられます。
液晶パッドの場合はそれ以前の問題で、ただの拡大ですら更新エリアが大きいため
描画の負担となり現実的ではないのです。

●描画更新が遅いならただのボタンの方が良い

結局 描画の更新を減らす工夫が何より大切だといえそうです。

・できるだけボタンなどスタティックなユーザーインターフェースにする。
・ジェスチャ系は操作中ワイヤーフレームで表示してあとから更新する。

といったことを考え、ハードウエアの性能を考慮したユーザーインターフェースを
採用します。以下具体例。

・2本指のスクロール

初めてリスト一覧を見たとき、最初にスクロールバーを探してしまいました。
2本指のスクロールは いわれないと わからないし、描画が遅くて操作できているのか
出来ていないのか判断しづらくなっています。
なぜかスクロールバーも常時表示されていません。
そのせいでスライドしすぎて止まらなくなり、ますます戸惑うことに。

液晶パッドは画面が広いので、いっそ専用のスライド領域を設けてしまった方が
良いのではないでしょうか。見た目でわかりやすいし、スライドした量を描画すれば
操作出来ていると安心できます。

・ページ切り替えとボタン

広い面積のスクロールは苦手なので、直接ページを切り替えられるボタンがあった
方が迅速だしわかりやすいです。タブ切り替えのように。
フォトモードの秒数指定ボタンは最初ページ切り替えだと勘違いしました。

・ハードウエアボタン

触れただけで反応するタッチ面に対して、クリックボタンは少々力がいります。
ボタンの説明として「次ページ」「マウス操作へ」「前ページ」とわかりやすく表示
してありますが、むしろここの文字をタッチしたくなります。

・マッチ棒のパズル

マッチ棒をスライドで動かすのはたいへんです。
描画が遅くて思わぬところに落としてしまうことも。
しかも関係ない位置においてしまうと操作回数がカウントされて失敗扱いです。

ゲーム内容を考えると、動かしたいマッチ棒をタッチしてその後異動先をタッチ
するだけで十分だと思います。
ハードウエアスペックに応じた操作仕様にするだけで大幅に遊びやすくなるはずです。

・拡大縮小回転

個別にボタンを用意するか、タッチに合わせたワイヤーフレーム等の演出が
合っているように思います。

液晶パッド部の解像度はかなり高いです。
メインの液晶画面が 1024×600 ドットなのに対して 854×480 ドットもあります。
縦横ともにおよそ 20% 小さいだけ。
手書きイラストのキャプチャ選択も全体を 80% の縮小表示にして、ワイヤーで選択
範囲が表示されているだけで十分な気がします。

●まとめ

書き出してみたらあまりたいしたことではありませんでした。
操作ではなく描画の問題で、結論はハードウエアの能力を考慮したユーザー
インターフェースにするという一点のみです。

あとは画像取り込みとかスキャナ機能とか、何かしら光センサー液晶パッドでないと
出来ない使い方があると良いですね。

関連エントリ
メビウス PC-NJ70A (5) サブモニタ
メビウス PC-NJ70A (4) 使用感
メビウス PC-NJ70A (3) Windows7 RC を入れる
メビウス PC-NJ70A (2) 初期セットアップとメモリ増設
メビウス PC-NJ70A 液晶センサータッチパッド
メビウス PC-NJ70A 画面解像度とタッチ

メビウス PC-NJ70A (5) サブモニタ

前回 も書きましたが mebius は結構消費電力が大きいようです。
起動直後はともかく使用中はすぐにファンが回りだして左サイド手前の排気口
から熱が吹き出しています。最近の Atom ノートとしては珍しいでしょう。

バッテリーパックも 7.4V 4800mAh 36Wh と、決して小さいわけでは無いものの
カタログの持続時間は 3時間。同じ 10インチクラスの同等機種と比較すると
大食いなのは確かです。
やはり光センサー液晶パッド分の消費電力が加わっているためでしょう。

実際に持ち歩いてみるとサイズより少々重たいのが気になります。
カタログ値で 1.46kg。直前まで使っていた VAIO type P のおよそ 2倍。
説明書を見るとアドオンジャケットは 102g あるので、ジャケット付きだと 1.56kg。
実測で 1558g (アドオンジャケット含む) だったので一致しています。

増えているのは「増加分のバッテリー+センサーユニット」と考えられます。
すべては光センサー液晶パッドを搭載するためです。
光センサー液晶パッドのために作られた PC です。

●サブモニタの描画

液晶パッド部分のサブモニタは、残念ながらデスクトップの拡張画面としては
使えませんでした。将来ドライバの更新で対応できるかどうかは不明です。

今のところ専用アプリのみが描画アクセスしている印象です。
マルチタッチという独自の拡張があるので、おそらく Windows SideShow 等とも
別物だと考えられます。

描画とタッチ入力は独立しているようで、SLMgr/SLMgr2 が起動していなくても
マウス互換の普通のタッチパッドとして機能します。
マルチタッチの情報を受け取るには、何らかの専用 API を介する必要が
あるのでしょう。つまりマルチタッチ操作も専用アプリのみ。

サブモニタ部分の描画更新は遅く、特にフォントを含む画面が低速に見えます。
一般的なアプリとしての実用性はそれほど損なわれていませんが、タッチ操作への
追従性を考えるともの足りません。
メインメモリからの転送が原因なのか、それ以外にボトルネックが生じているのかは
わかりません。854×480 dot と非常に高精細なので、転送データ量が多く負担に
なっているのかもしれません。

液晶パッド部分で動く専用ゲームでもレスポンスの遅さは目立ちます。
ミニボウリングというゲームは比較的タッチへの追従性が良く、ほぼタッチ位置に
すぐ反応します。その代わり操作中は表示が点滅しています。

このことから、普段は内部で仮想的な VRAM を持っていて全転送しているのでは
ないかと考えられます。
仮想画面の転送はフレームレートを稼ぐことが出来ず、部分的な更新だと高速。
ミニボウリングは部分転送した重ね合わせを消すために、いったん背景を転送し
直しているため点滅しているのだと予想できます。

マウスモード時のエフェクト(光、猫、花)はきちんと重ね合わせが出来ているので、
あらかじめ合成したデータを部分更新しているのか、または別の合成機能が用意
されているのかもしれません。

画面の大きさはほぼ名刺大。

●サブモニタの使い道

追加削除可能な専用アプリ以外に、いつでも呼び出せる標準機能が用意されています。

・マウスモードの背景
  ・時計
  ・カレンダー
  ・スライドショー

・タッチモードの一時アプリ
  ・電卓
  ・手描きイラスト
  ・手書き文字入力パネル

マウスモードは常時何らかの追加情報を表示するもの、タッチモードは入力手段の拡張です。
どれも便利なものですが、一番欲しいメールや RSS などの通知系がまだありません。
SDK 公開以降何らかのアプリに期待、といったところでしょうか。
完全に PC-NJ70A 専用になりそうなので、わざわざ手を出すかどうかが問題。
デスクトップの拡張だったらすぐにでも実現可能なので惜しいです。

●Windows7 でアプリ追加

SHARP 液晶パッド設定を使ってアプリの追加削除できました。
D: ドライブにプリインストール時の Vista が残っていれば D:\Program Files
等の中にある個別のアプリ “Piano” “Bowling” “Fusen” “Macchi” の中の exe を
登録するだけ。辞書および電子ブックはパスが異なるためか動いていません。
レジストリにそれらしいエントリがあるので、そのあたりも設定すれば動くかも
しれません。

Windows7 RC を入れる方法はこちら。
メビウス PC-NJ70A (3) Windows7 RC を入れる

●専用アプリ

手描きイラストにキャプチャ機能があったり、フォトには BGM がついていたり、
ピアノにも自動演奏機能が入っていたりと意外に良く作り込んであります。
プリセットデータも入っていますね。

ただピアノとか上画面は特に使用していないのですが全画面乗っ取られてしまいます。
電卓のように液晶パッド部分だけに納めた方が良い気がします。
ネットを見ながらピアノを弾いたりできるし、作業中でも気軽に切り替えられるし。
上画面が残ってしまうので毎回終了しなければなりません。

●誤動作防止方法

前回タッチパッド部が右側に広いため、キータイプ中に右手が触れて誤動作すると
書きました。その後、液晶パッドの右側 1/3 を紙などで隠してもタッチパッドとして
機能することがわかりました。

SHARP 液晶パッド設定 → 省電力 →
 「ディスプレイがオフのときに、液晶パッドの表示を消す」
にチェックを入れて、さらに輝度を一番暗くしておきます。
この状態で右側 1/3 を紙などで覆っておけば誤動作を防げます。

mebius pcnj70a

とりあえずの対処ですが、これで安心してホームポジションに手を置けます。

「ディスプレイがオフのときに液晶パッドの表示を消す」にチェックを入れても、
輝度を最小に設定しておかないとバックライトだけ点灯していることがあるようです。
具体的な条件は未調査。

●インターフェース

Windows7 RC の場合、デバイスの取り外しメニューに LCD-Pad が出てきます。
このメニューを見る限り USB デバイスの一種として扱われているようです。
SLMgr, SLMgr2, SLLaunch のプロセスを停止しておくと取り外し可能になります。

● UQ

持ち歩きのために UQ WiMAX の UD01SS を使っています。普通に利用できています。
やはり電波強度表示等のモニタウィンドウは、他のウィンドウに隠れないよう
液晶パッド部分に表示したい。

● Bluetooth

Vista では東芝 stack が使われていました。
Windows7 では A2DP も標準でサポートしているので、Windows 標準の stack の
ままで十分です。実際に Bluetooth マウスとステレオヘッドセット MM-BTSH3 を
ペアリングして使っています。
Music Player も液晶パッド部のアプリケーションとして相性がよいかもしれません。

●タッチと描画とまとめ

新しいセンサーでメリットも多いし、実際に見た目のインパクトもあります。
直接タッチしたりペンで描けるわかりやすさは他には無いものです。
パネルも手前に配置されているためペンで字が書きやすいし、キーボードとの連携も
容易です。
タブレット PC のようにタッチ画面が遠かったり、近づけるには表示部を反転して
たたまないといけない、といった煩わしさもありません。

惜しいのは、上で述べたようにレスポンスが遅くてタッチ操作を活かしきれないこと。
本来直感的でわかりやすいはずなのに、その良さを阻害してしまっていることです。
この操作は出来ないのかな、と思った頃に何テンポも遅れて画面が切り替わったり、
操作ミスかと思って何度もスライドさせると、バッファがたまって目的のところで
止められなかったりします。

最低限操作に直結したフィードバックがあり、成功失敗がすぐに区別できれば
操作を自力で学ぶことが出来ます。また触りたいと思うでしょう。
機能として出来るかどうかよりも、ずっと大切なことだと思います。

関連エントリ
メビウス PC-NJ70A (4) 使用感
メビウス PC-NJ70A (3) Windows7 RC を入れる
メビウス PC-NJ70A (2) 初期セットアップとメモリ増設
メビウス PC-NJ70A 液晶センサータッチパッド
メビウス PC-NJ70A 画面解像度とタッチ

メビウス PC-NJ70A (4) 使用感

Atom PC は低発熱および低消費電力が特徴です。
同時にチップが小さい故の低価格も魅力。
Netbook が盛り上がっているのもそのためで、低価格化路線と
今まで作れなかったような低発熱な小型軽量 PC の実現に期待が持てます。

SHARP といえば常に一歩進んだ小さなモバイルデバイスも得意とするメーカーでした。
そのため新メビウスも超小型な PC の再来か、等と期待したのが今回の正直な本音。
実際に現れたその「新メビウス」はいろいろな意味で予想外のパソコンでした。

SHARP Mebius PC-NJ70A

その特徴はサイズでも価格でも無く、新機軸の液晶画面がついたタッチパッドです。
ユーザーインターフェースとして有望視されている画面を直接触れるタッチパネルが、
メイン画面ではなくもう一つの画面として「タッチパッド」部分に内蔵されています。

タッチパネル PC とノート PC のちょうど中間に位置するポジションで、
使い方も実に様々です。

・タッチパッドの拡張として。マルチタッチ対応版
・ペンが使えるタブレットの代わり
・独自のタッチパネル用アプリが動くプラットフォーム

おそらく SHARP が開発した「光センサー液晶パッド」が先にあって、それを
どのように活用するか試行錯誤した結果だと思われます。
過去に存在していないものなので、まだ本当の使い方が絞られていません。

可能性は大きいため、従来にないわかりやすい操作性を実現した新しいユーザー
インターフェースに化けるかもしれません。
今回幅広くモニターを募集した意図もここにあるのではないでしょうか。

そしてもう 1つ PC-NJ70A が示したのは Atom PC の新しい使い道です。

しばらく使用してみてわかるのは液晶センサータッチパッドは結構消費電力が大きい
のではないかということ。
メイン画面としても使えそうな高解像度の画面がもう 1つついているわけだし、
光センサーを使ったポインティング処理はそれなりの演算能力を必要としている
のかもしれません。

このような負担となるデバイスを内蔵できたのは Atom PC だからこそ。
すなわち 3つ目の路線。

(1) 低価格路線
(2) 低消費電力&低発熱ゆえの小型化路線
(3) 低消費電力&低発熱なので、他のデバイスを取り込む余裕ができる

このように考えていくと Netbook プラットフォームを採用した理由もわかる気が
します。

以下普通のレビュー

●外観

上面と内面は光沢のある仕上げです。
特に液晶タッチパッドはパームレスト部と一体化しており、継ぎ目のない
アクリルカバーで覆われています。
汚れがつくとすぐに気になってしまうのは他の光沢仕上げの PC 等と同じ。

対して裏面はざらつきのある EeePC 701 のようなプラスチックで、滑り止めの波状の
加工が施されています。透明感や高級感はありませんがこちらの方が汚れが目立ちません。

インターフェース類は左右のサイドのみ。後ろはバッテリー、前はステレオスピーカー。
この PC のバランスを考える上で、かなり割り切って作った部分といえます。
特筆点は左手前側面にある排気口とその隣のペンホルダ。

●キーボード

比較的固めながらしっかりしたキーボードは個人的には好印象です。
変形キーもありますが右一列のみで済んでいるし、
[1] の左に [全/半] キーも配置されています。
[変換][ひらカタ] 周りの配列も標準的でキートップも滑りません。

●キータイプとタッチパネル

実際にキータイプしていて問題となるのはむしろタッチパッドの方です。
液晶画面があるせいか想像以上に横に大きな面積を取っています。
ホームポジションでキータイプしているとどうしても右手親指が触れてしまうのです。

・タッピング (タッチで左ボタン相当) を禁止する
・キー入力中はマウスモードからタッチモードに切り替えておく
・外付けマウス接続中はマウスモードにならない設定にしておく

等の対策は取れるかもしれません。
幸いフラットで継ぎ目がないのでソフトウエアで対処できそうです。
将来何らかのタッチパッドアプリを作ることが出来れば、有効面積をエリア指定で
制限したり、スクロール領域を設定することも可能でしょう。
まずは SDK 次第。

●キータイプとマウスボタン

もう一つの難点はボタンクリックが遠いことです。特に右クリック。

液晶パッドの面積が大きいので、ホームポジションに手を置いたままだと
少々がんばって指を伸ばすことになります。
左クリックは何とか。右クリックは完全に手をずらす必要あり。

タッチパッドは本体の中央に置かれているので、ホームポジションからは右寄りに
なります。さらに本来右ボタンがあって欲しい場所にはモード切り替えボタンが!
右ボタンはますます遠くなっています。

キータイプを中心に考えるとこのボタン配置は使いづらい代物です。
せっかくのマルチタッチ&液晶パネルなので、マウスボタンもパネル内に作れたら
良いのではないでしょうか。マルチタッチ対応なら同時押しも出来るし、位置も好みで
並べられます。真ん中ボタンだって作れるでしょう。
触って区別がつくように透明なシールを周囲に貼って段差つけて、、といった工夫も
必要かもしれません。

●タッチパッド・マウス操作

マウスモードでのカーソルの追従性は若干遅延を感じます。
初期の頃の低速なワイヤレスマウスを使用しているような印象です。

コントロールパネル → 電源オプション → プラン設定の変更→ 詳細な電源設定の変更

 電源オプションのダイアログが開くので

   シャープノートパソコンの設定
    → サブ画面センサー設定
     → バッテリ駆動: 処理優先
       電源に接続: 処理優先

上記のように サブ画面センサー設定 を「処理優先」にすると多少改善するように
見えます。

原因をいろいろ考えてみましたが、どうも一般的な静電容量式タッチパッドと
比較すると初動作の遊びが大きいようです。
数ミリ動かしただけでは反応せず、大きめに動かすとついてきます。

ペンの手描き入力でも、慎重にゆっくりペンを動かすと即座には点が打たれず
短い折れ線の集まりになることがわかります。
ペンを動かさずに点を打つとその場所に現れるので、ピクセル分の分解能は持っている
ようです。この辺の挙動は誤動作対策かもしれません。
今後ドライバの更新等で改善されることを期待します。

●タッチパッド・手描き入力

タッチ操作では「手描きイラスト」機能によってペンで直接絵を描くことが出来ます。
いわゆるタブレット代わりです。

ユニークなのは単なるお絵かきソフトにとどまっていないこと。
右上にあるキャプチャボタンを使えば、メイン画面の任意の部分を取り込んで
その上に重ねて描けるようになっています。
デスクトップだろうとアプリだろうと落書き自由。

キャプチャ自体はボタンを押した瞬間に行われるようで、その後の範囲指定は取り
込んだ画像の切り出しに相当します。タッチ操作で拡縮&スクロール可能。
画面の追従性が悪いので最初は操作がわかりにくいかもしれませんが、
サブ画面の解像度が高いことは十分実感できます。

mebius pcnj70a
↑デスクトップの取り込み

取り込んだ&描いた絵はピクチャフォルダに保存可能。
編集画面が少々狭いけど、PC 操作中にいつでも呼び出せるのはおもしろい仕組みです。

ペン操作の PDA や電子手帳を長年使ってきましたがどれもこれも感圧式でした。
ペンの先端が触れるだけで反応する軽さは今までにない感覚です。
これも光学式ならでは。

ペン座標の判定は残念ながら同時に一点のみでした。
Windows7 付属の「ペイント」だと、マルチタッチ環境なら複数の指で同時に線が
描けたりします。
せっかくのマルチタッチセンサーなのだから、マルチペン対応もぜひ希望します。
マルチだと、一人が描いている隣で別の人が落書きできたりするのです。

関連エントリ
メビウス PC-NJ70A (3) Windows7 RC を入れる
メビウス PC-NJ70A (2) 初期セットアップとメモリ増設
メビウス PC-NJ70A 液晶センサータッチパッド
メビウス PC-NJ70A 画面解像度とタッチ