Archives

November 2009 の記事

AMD Z430 は PowerVR と同じようにタイルベースのレンダリング (TBR) を行うことで
知られています。TBR も Unified Shader の仕様も AMD は Xbox360 の GPU がベース
だと説明していますが、その両者の性能差は桁違いです。
一方は強力な GPU が要求するバス帯域に応えるため、もう一方はモバイル向けでタイトな
メモリ速度でもそれなりの性能を維持するため。同じ技術でも応用先の GPU が真逆なのは
面白いところです。

AMD Next-Gen Tile-Based GPUs (pdf)
AMD Next-Generation OpenGLR ES 2.0 Graphics Technology Achieves Industry Conformance

NetWalker に用いられている i.MX515 は GPU core として AMD (ATI) imageon Z430
を搭載しています。
ここ最近 NetWalker で OpenGL ES 2.0 を触っていますが、まだ Z430 の特性がうまく
つかめておらずあまり速度が出ていません。調べている最中です。
偶然 TBR のタイル領域の大きさを知ることが出来ました。


●タイルサイズ

NetWalker_OpenGLES03.jpg

フレームバッファをクリアしないで描画した場合の画面がこれです。GPU のタイルバッファも
クリアせずに上書きされているようです。
1024x600 の画面なので、上の写真のケースだと 1タイルは 256x128 ドット。
以下バックバッファの組み合わせ毎にタイルサイズをまとめてみました。

Color   Depth/Stencil   Tile
-----------------------------------
16bit   none            512x128
16bit   16bit           256x128
32bit   16bit           128x128
16bit   24bit/8bit      128x128
32bit   24bit/8bit      128x128

◎タイルバッファの容量

 少なくても 128KByte 存在しています。予想より大容量です。

◎Depth/Stencil との組み合わせ

 使用可能な depth の幅はカラーの影響を受けることが多いのですが、こちら
 書いたとおり Z430 では任意の組み合わせを選べます。PowerVR もそうだったので
 やはり TBR 専用のバッファを持っているおかげだと思われます。

◎32bit Color or 24bit Depth 利用時の速度低下

 Color か Depth どちらかを 16bit より増やすと速度に影響が出ます。
 その原因はバス帯域だと思っていましたが、この結果を見るとタイル分割数の増加が
 負担になっているのかもしれません。


● Extension

まだ試していませんが TBR を制御する API があります。

GL_VERSION: OpenGL ES 2.0
GL_RENDERER: AMD Z430
GL_VENDOR: Advanced Micro Devices, Inc.
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 1.00
GL_EXTENSIONS:
    GL_AMD_compressed_3DC_texture
    GL_AMD_compressed_ATC_texture
    GL_AMD_performance_monitor
    GL_AMD_program_binary_Z400
    GL_AMD_tiled_rendering
    GL_EXT_texture_filter_anisotropic
    GL_EXT_texture_type_2_10_10_10_REV
    GL_EXT_bgra
    GL_OES_compressed_ETC1_RGB8_texture
    GL_OES_compressed_paletted_texture
    GL_OES_depth_texture
    GL_OES_depth24
    GL_OES_EGL_image
    GL_OES_EGL_image_external
    GL_OES_element_index_uint
    GL_OES_fbo_render_mipmap
    GL_OES_fragment_precision_high
    GL_OES_get_program_binary
    GL_OES_packed_depth_stencil
    GL_OES_rgb8_rgba8
    GL_OES_standard_derivatives
    GL_OES_texture_3D
    GL_OES_texture_float
    GL_OES_texture_half_float
    GL_OES_texture_half_float_linear
    GL_OES_texture_npot
    GL_OES_vertex_half_float
    GL_OES_vertex_type_10_10_10_2
    GL_NV_fence


● NetWalker の速度比較

描画面積を出来るだけ小さくして頂点速度を測定しようとしたもの。

AMD Z430          48000x1 =  48000 Tris/s 30fps = 約 1.44M Tris/s  (1024x600)
PowerVR SGX 535   48000x4 = 192000 Tris/s 45fps = 約 8.64M Tris/s  ( 480x320)

フレームバッファのサイズが極端に違うし、どちらも Unified Shader なので頂点に
ピクセルの影響が全くないとは言い切れません。Clear → Swap だけでもあまり速度が
出ないので、広い画面が仇になっている可能性があります。
タイル+転送だけである程度の負荷がかかり、頂点も圧迫しているのでしょうか。
1024x600 は 480x320 のちょうど 4倍の面積です。

1024x600 = 614400 pixels  8 倍  NetWalker
 640x480 = 307200 pixels  4 倍  VGA
 480x320 = 153600 pixels  2 倍  iPhone
 320x240 =  76800 pixels  1 倍  QVGA


● VRAM 容量

PC のチップセット内蔵 GPU と同じように、VRAM はメインメモリから確保していると
考えられます。NetWalker の RAM は 512MB ですが 480MB しか見えないので、残りの
32MB が VRAM の取り分かもしれません。

1024x600 x16bit は 1.2MB (fb は 2.5MB) なので、32MB もあると少々無駄に感じる
かもしれません。ところが OpenGL ES 2.0 を使っていたらあっという間に VRAM が
溢れました。(GL_OUT_OF_MEMORY を返す)

その原因は自分のローダーでした。Z430 が DXT に対応していないため、圧縮された
テクスチャを 8888 に展開していたからです。あらかじめ ATC/3Dc/ETC へ変換して
おけば解決するはずです。計算したらテクスチャを 23MB も読み込んでいました。

もう一つ考えられる理由は TBR による遅延レンダリングです。
システムメモリからの逐次転送できず、シーンに必要なリソースを全部 VRAM に乗せて
おかないと描画できないのかもしれません。何らかの確証があるわけではなくあくまで
想像です。

どちらにせよ、設定を変えられるなら VRAM 容量はもうちょっと増やしたいところです。


●立ったまま OpenGL ES 2.0 プログラミング

帰りの電車の中では立ったまま、EGLConfig のパラメータを変えて make したりタイルの
データ取りをしてました。この大きさで開発+実行できるのは良いですね。


関連エントリ
NetWalker PC-Z1 i.MX515 OpenGL ES 2.0 (3)
NetWalker PC-Z1 i.MX515 OpenGL ES 2.0 (2)
NetWalker PC-Z1 i.MX515 OpenGL ES 2.0
OpenGL ES 2.0 Emulator


●移植された!

「おくやくん」 は SHARP のポケットコンピュータ、PC-1245/50/51/55 で動くゲームです。
工学社の雑誌、PiO 1985年の 11月号に掲載されたので、もう 24年も前になります。
その古いゲームを、なんと 24年の時を経て他の機種に移植してくれた方が現れました。
下記ページで公開されています。

「ポケットコンピューター」について

こちらには新たに移植された PC-1450 版、PC-1260/61/62 版(*1)がありますし、
16ステージ分オンメモリに改良された PC-1251/55 向けも掲載されています。
BASIC による PC-G801/E200 版もあります。

ページに掲載されているプログラムは音声形式 WAVE ファイルで、これをカセット
インターフェースから読み込ませるとポケコン本体に転送できるという仕組みです。

このカセットインターフェース用のセーブ音を聞くだけでもう懐かしくて涙が出そうです。


●電卓みたいなコンピュータ

SHARP のポケコン PC-1245/50/51/55 や PC-1260/61/62 は非常に小さくて薄くて
ただの電卓にしか見えません。

今更こんな写真を見せられても、コンピュータとして使い物になるのかと疑問に思う方が
きっと多いことでしょう。
いや当時もそう思いました。

でもそこが魅力の一つでもあります。
見かけは薄っぺらな関数電卓なのに、BASIC だけでなくマシン語プログラムが走り、
高速なゲームが動いてサウンドの演奏もできます。当時としてはどれも驚くべきもの。
見た目のギャップと実力の差、中に詰まった感じが良かったのです。


●ゲーム内容

横画面のアスレチックぽい仕様となっていますが、実際は迷路ゲームです。
画面が 1行しかないことを逆手に取り、先が読めず決断を迫られることと、若干の
暗記力が必要でした。

一番の特徴はドット単位の上下スクロールです。
VRAM 構造上の制約もあったため、掲載時はまだ珍しかったように思います。
2D 風のフィールドを移動できてマシン語で比較的高速に動作するし、
内容もかなり緩いゲーム性だったこと、コンストラクションモードがあって自由に
面データを作れたのが良かったのかもしれません。


●おくやくん作成の話と機械語プログラミング

このゲームを作った目的はやっぱりスムーズな上下スクロールでした。
ただ最初はそこまで深く考えていなかったため、あまりきれいな作りではありません。
結局はライン単位でパターンを展開しているし、スクロールにキャラが付いてこない
ところも不完全です。
もっときちんと作っておけば良かったと、ここだけがずっと心残りでした。
完全に 2D 空間を滑らかにスクロール出来たのは、その後の別のゲーム
トロピカルアイランドだったように思います。

おくやくん はほぼ全部マシン語で書かれています。
アセンブラもパソコンも無かったので、紙に手でプログラムを書いていました。
ニモニックは使わずに 16進数で命令を並べ、自分で相対ジャンプを数えて、ある程度
出来たらマシン語モニタで直接 RAM に命令を書き込んでいきます。

これだとあとから大きな修正ができないので、プログラミングは完全にボトムアップです。
キー入力ルーチンやサウンド部分から始めて、パターン転送ルーチンなど小さい部品を
作り、テストしながらメモリ上に配置していきます。
ゲームとして全体が繋がるのは最後でした。
RAM が 2~10KByte しかなかったおかげか、こんな方法でも十分だったのです。


記憶メディアはカセットテープしかなかったものの、ポケコンは今で言うスリープ相当。
RAM の内容はバッテリーで保持されています。
ファイルやディスクといった概念もなく、メモリを書き換えたらそれがすべてです。
プログラムもエディットしたステージデータもずっと RAM 上に保存されています。

そのためプログラム実行時は最初に必ず初期化ルーチンが必要で、ワークエリアを
クリアしたり、パラメータの初期値を転送しなければなりません。
いつも最後に作るのがこの部分でした。

その頃には RAM エリアはすでに後ろまでいっぱい使い切っており、たいてい入る場所
が無くなっています。そこで逆にアドレスの前方に伸ばしていきます。ぎりぎりまで
BASIC エリアを浸食するようになるわけです。
プログラムの一番先頭にワーク初期化用のデータテーブルがあったり、プログラムの
スタートアドレスが途中の中途半端な番地になっているのもそのため。

ちなみに 「おくやくん」 というのは当時の友人、奥山君のこと。


●ポケコンユーザー

移植してくれた柳田さんありがとうございました。
今後他の機種へも移植を行っていくとのことです。

今年の 2月にもLC-3 コンパイラが欲しいとの問い合わせもあって、意外にもまだまだ
ポケコンを使ってる方が結構いらっしゃるようです。
このように問い合わせのメールをいただく度にいつも驚いています。
そして謝ります。すみません、コンパイラはまだ用意できてませんでした。


*1: PC-1260 には過去にも移植版があったようです。森岡氏 PC-1260


関連エントリ
BASICコンパイラと手書き原稿の時代
28年前のモバイル PC-1211 他
20年前のモバイル PC-1417G


わかる方、自力で何とか出来る方のみ参考にしてください。
すべて自己責任でお願いします。

(1) カーネルをコンパイルできる環境を作る。( 参考1, 参考2 )
(2) module を読み込めるようにカーネルを作る。
 (CONFIG_MODVERSIONS を無効化するなど> 例 Module versioning support を外す)
(3) 作成したカーネルを使って起動出来る環境を作る。
  ・SD カード上に作成
  ・本体フラッシュ (/dev/mtd3) を書き換え
  など

SD 上の debian で起動して insmod だけ確認した後、面倒なので /dev/mtd3 を
置き換えました。壊れても気にしない人のみ。それ以外はお勧めしません。
3Gモデム対応ツールを適用しており、かつ互換性あるカーネルを作っている前提です。
L2.6.28_4.5.1_SDK_Aug2009_source.tar.gz (こちら)を展開して install を実行。
以後メッセージに従う。
入力した展開先フォルダの中の ltib/pkgs の中からアーカイブを参照。

$ tar -zxvf amd-gpu-bin-mx51-4.5.1.tar.gz
$ cd amd-gpu-bin-mx51-4.5.1
$ sudo cp -r lib/module/2.6.28-419-g12a78a3/extra  /lib/modules/2.6.28-15-araneo/kernel/drivers/
$ sudo depmod

ファイルを手でコピー。ここでも気にしないでシステムを置き換えています。
分けるなら /usr/local 以下に配置。

$ sudo cp -r  usr/include/*  /usr/include/
$ sudo cp  usr/lib/*  /usr/lib/
$ sudo mkdir  /usr/local/bin
$ sudo cp  usr/bin/*  /usr/local/bin/
$ sudo /usr/local/bin/gpu-install install

最後の gpu-install でドライバを読み込んでいます。
「sudo /usr/local/bin/gpu-install install 」は再起動の度に必要。
添付のサンプルで動作確認。

$ sudo /usr/local/bin/tiger
$ sudo /usr/local/bin/es11ex

(実行結果の画面) フルスクリーンで起動するので VRAM を破壊します。実害はありません。
最初は ssh などネットワーク経由での実行をお勧めします。

サンプルが動けば動作はうまくいったように見えますが、ドキュメントやサンプル
ソースがあるわけでもないので、実際の使い方はまだまだ手探り状態です。

Display インターフェースは egl なので、初期化は以前 OpenGL ES 2.0 Emulator
を取り扱ったときのコードがほぼそのまま使えます。
AMD 版 GL ES 2.0 Emulator のターゲットがこの Z430 なので当たり前といえば
当たり前です。

OpenGL ES 2.0 Emulator

eglGetDisplay() は EGL_DEFAULT_DISPLAY を使用。

eglChooseConfig() では 4444, 565, 5551, 8888 が使えるようです。
depth は 0, 16, 24 (24+ stencil8) のどれかと組み合わせ。
カラーバッファが 16bit でも 24bit depth を使えます。
バックバッファのフォーマットなので、8888 を指定してもフロントバッファが
32bit になるわけではありません。

eglCreateWindowSurface() で描画と API をバインドしますが、この場合
EGLNativeWindowType に何を指定すればよいのか悩みました。
いろいろ試した結果、/dev/fb0 を渡したら動きました。

EGLNativeWindowType eglwin= open( "/dev/fb0", O_RDWR, 0 );
egl_Surface= eglCreateWindowSurface( egl_Display, egl_Config, eglwin, NULL );

描画のフラッシュと転送は普通に eglSwapBuffers() で動きます。

デバイスファイルにアクセスするため root で実行する必要があります。

フレームバッファは 16bit 1024x600 ですが、倍の容量存在しているのは 32bit
への切り替えを考慮してのことでしょうか。
この辺いろいろとステートを読み出したりしつつ調べている最中です。
例えば EGL_HORIZONTAL_RESOLUTION が 2048 になっている点など、まだ良く
わかっていない部分が多数あります。

描画の印象としてあまり速くありません。eglSwapInterval() に 1 しか設定
できないため、常にモニタのリフレッシュレートと同期している可能性があります。
ただ動作時間が半分ほどで終わってしまい、計算と一致していないのも謎です。
性能はまだ未知数。

取りあえず GLSL のシェーダーを読み込んで、テクスチャの描画まで成功。
シェーダーのコンパイルエラー発生時に、ドライバが詳細なエラーメッセージ(log)
を返してこないのも はまったところです。デバッグは Emulator で行った方が
良いかもしれません。

ヘッダ (GL ES 2.0 の場合)

#include  <EGL/egl.h>
#include  <GLES2/gl2.h>
#include  <GLES2/gl2ext.h>

ライブラリの指定など (Makefile)

CC      = gcc
LIBS    = -lm -lstdc++  -legl13 -lgles20
INCS	=
CFLAGS  = -O4 -Wall \
	-march=armv7-a  \
	-mtune=cortex-a8        \
	-mfloat-abi=softfp      \
	-mfpu=neon      \

TARGET  = main
OBJS    = main.o

$(TARGET): $(OBJS)
	$(CC) -o $(TARGET) $(OBJS) $(LIBS)

%.o:%.cpp
	$(CC) -c -o $@ $< $(CFLAGS) $(INCS)

ARM Cortex-A8 + OpenGL ES 2.0 は iPhone 3GS などハイエンドスマートフォントにも
搭載されています。
比べると NetWalker の良いところはクロス開発しなくてもいいところでしょう。
修正したり設定を変えてテストを繰り返していると、自分でコンパイルできるのは非常に
便利だと実感します。
micro SD 上で作業しているので、開発環境もこの小さい本体だけです。


関連エントリ
NetWalker PC-Z1 i.MX515 OpenGL ES 2.0 (2)
NetWalker PC-Z1 i.MX515 OpenGL ES 2.0
OpenGL ES 2.0 Emulator


NetWalker_OpenGLES01.jpg

NetWalker_OpenGLES02.jpg
いろいろ手間取ったけど、何とか動かすことに成功

追記:
Version: 1 3
EGL_CLIENT_APIS: OpenGL_ES OpenVG
EGL_EXTENSIONS: eglCreatePbufferFromClientBuffer EGL_KHR_image EGL_AMD_create_image
EGL_VENDOR: Advanced Micro Devices, Inc
EGL_VERSION: 1.3 Internal version 1.4.1

GL_VERSION: OpenGL ES 2.0
GL_RENDERER: AMD Z430
GL_VENDOR: Advanced Micro Devices, Inc.
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 1.00



関連エントリ
NetWalker PC-Z1 i.MX515 OpenGL ES 2.0


見つけたのは自分ではありませんが、このあたりに Linux のソースコードとか
i.MX515 用の OpenGL ES SDK とかいろいろとファイルが追加されているそうです。
Freescale i.MX515 Software & Tools


関連エントリ
NetWalker PC-Z1 ubuntu で ctrla を動かす ([A] キーで Control と両立)


久しぶりに NetWalker の情報を探したら、モジュールを作れるようになっているし
キーカスタマイズソフト「窓使いの憂鬱」も動くようになっているとのことです。
かなり便利になってきました。ありがたいことです。

Android Zaurusの日記
 ・NetWalkerのカーネルとローダブルモジュールのビルド

ひとりぶろぐ
 ・[NetWalker]窓使いの憂鬱をNetWalkerで動かす

しかも「窓使いの憂鬱」では [A]キー を Control にする設定まで出来るようです。
これで ctrla を作らなくて済むし、楽が出来る!!
と思って試したら ctrla の動作とはちょっと違いました。少々甘かったようです。

そこで上のページを参考にして uinput.ko を作り、ctrla を NetWalker 本体の Ubuntu
で動くようにしてみました。
Android Zaurusの日記 さん、ひとりぶろぐ さんの記事を参考にさせていただきました。
ありがとうございました。

以下
 ・ctrla の動作の違い
 ・新しい ctrla v1.10
 ・ctrla を NetWalker の Ubuntu で動かすまで

ctrla は、[A] キーを Control キー兼用として用いるためのソフトです。


● ctrla の動作の違い

「窓使いの憂鬱」の "mod control += !!A" の設定では、[A]キー を押している間に
他のキーが押されたタイミングで Control キーと見なしています。

これだけだと、素早く文字入力を行った場合に意図しない Control キーが挿入されて
しまうことがあります。

例えば「会議」と打とうとして "kai" と素早くタイプすると、[A] を離す前に [I]
が押されて Control-I が入ってしまうことになります。

ctrla では連続タイプについていろいろ検証しており、この状態を区別できるように
二つのクロスストローク判定を導入しています。

もしかしたら「窓使いの憂鬱」でも設定次第で実現出来るのかもしれません。
そのような機能がすでにありましたらごめんなさい。


●クロスストローク判定1、遅延判定

"kai" を素早く打つと、下記のように前のキーを離す前に次のキーを押してしまう
ことがあります。

→時間
                 (1)  (2)
---------------------------------------
[K]dw ------ [K]up
         [A]dw ------ [A]up
                 [I]dw ------ [I]up

「窓使いの憂鬱」+ "mod control += !!A" はおそらく (1) のタイミングで判定
しています。これだと Control-I が入ってしまいます。

ctrla では、[A] キーを先に離すと 'A' キーを、[I] を先に離すと Control-I が
入るように判定を遅らせています。
つまり上の例だと (2) のタイミングで 'A' キーを送信します。

下記の例では先に [I] を離しているので (3) のタイミングで Control-I になります。

                   (3)
---------------------------------------
 [A]dw ------------------- [A]up
         [I]dw --- [I]up


●クロスストローク判定2、id による識別

実際に使ってみると、上の「遅延判定」だけでは不十分なことがわかります。
例えば「朝」と高速にタイプしようとすると下記のキーストローク "asa" になります。

→時間
         (4)          (5)
---------------------------------------
[A]dw ------ [A]up
         [S]dw ------ [S]up
                 [A]dw ------ [A]up
---------------------------------------
ID1→            ID2→

[S] を押したタイミング (4) でも、[S] を離したタイミング (5) でも、どちらも
[A] キーが押されているため、単純な遅延判定だと (5) で Control-S が入ってしまいます。

そこで ctrla では、[A] キーを押す度に毎回異なる id 値を割り振るようにしています。
キーを押した時点の id と離した時の id 値が異なる場合は、別の [A] キーとみなして
Control に変換しません。

よって上の例の場合、(5) のタイミングで id が異なるのでそのまま 'S' キーを送信します。


●新しい ctrla v1.10

プログラム ctrla110.tgz

下記の修正を行いました。

 1. NetWalker の Ubuntu (uinput.ko) で動作しない問題を修正
 2. 連続して 1秒以上 [A] キーだけ押し続けた場合、Control とみなす

1. は hook_main.c で構造体がクリアされていないところがあったために、module
として組み込んだ場合に誤動作していました。カーネルに組み込んだ場合はメモリが
0 初期化されているらしく動いていました。(/dev/input/event* で動くのもそのせい)

テキストエディタ上で考え事をしているとき、無意識に Ctrl キーを押しっぱなしに
していることがあります。カーソル移動とか編集操作を一切せずにキーを離すと
'A' キーが入ってしまうことがありました。
そこで [A] を 1秒以上押し続けた場合は Control と見なすようにしました。


● ctrla を NetWalker の Ubuntu で動かすまで

(1) 3Gモデム対応ツールを入れる

NetWalker(PC-Z1) 「3Gモデム対応ツール」

 この更新を行うと無線 LAN 接続でトラブルが起こる可能性が高いので、先に無線LAN
 を off にしておいてください。以前自分でカーネルを build したときに無線 LAN
 が動かなかった症状と良く似ています。

(2) uinput.ko を作る

NetWalkerのカーネルとローダブルモジュールのビルド」の手順をそのまま実行します。

Makefile の修正は「EXTRAVERSION = .10」の行を「EXTRAVERSION = -15-araneo」
に置き換えます。

1時間くらいしてコンパイルが通ったらモジュールを作ります。

$ sudo aptitude install libncurses5-dev
$ make menuconfig

メニューで下記の設定を変更します。
(space キーを押して User level driver support を '<M>' にする )

Input device support --->
  Miscellaneous devices --->
    <M> User level driver support


$ make modules
$ sudo cp  drivers/input/misc/uinput.ko  /lib/modules/2.6.28-15-araneo/kernel/drivers/input/
$ sudo insmod /lib/modules/2.6.28-15-araneo/kernel/drivers/input/uinput.ko

(3) ctrla v1.10 を動かす

$ mkdir $HOME/ctrla
$ cd $HOME/ctrla
$ wget http://dench.flatlib.jp/arfiles/ctrla110.tgz
$ tar -zxvf ctrla110.tgz
$ sleep 1; sudo ctrla/ctrla /dev/input/event5

まずはこの状態で、他のターミナルやソフトでキーの動作を確認してみてください。
万が一キー入力できなくなった場合も、慌てずに USB キーボードつないでください。
外付けキーボードの動作には影響を与えません。


関連エントリ
NetWalker PC-Z1 カーネルのコンパイル
NetWalker PC-Z1 Debian (2)
NetWalker PC-Z1 Debian
NetWalker PC-Z1 [A] キーを Control キーと兼用する実験
NetWalker PC-Z1 Bluetooth とキーカスタムその他


小さくなったおかげで持ち歩きやすくなり、結構便利に使ってます。


● 例えばミュージックプレイヤー

Bluetooth が AVRCP に対応しているおかげで、ヘッドホン用のレシーバー DRC-BT15P
がワイヤレスリモコンも兼ねるようになりました。
曲の選曲や再生停止も手元でできるわけです。
この機能が使えるのは、クロスメディアバーでカーソルがミュージックにある場合に
限られるようです。
プレイヤーに移動したり、画面を消したり HOLD したりと少々手順が多いのが難点。


● HOLD は重要です

使っていて気になったのは、少しスライドしただけですぐスリープが解除されて
しまうこと。

一度鞄から取り出したらバッテリーが無くなっていて、電源が全く入らなくなっていた
ことがありました。たぶん移動中にどこかでスライドがずれて電源が入ったのだと思います。

ゲーム中のスリープだったので、オートスリープせずにバッテリーを使い切って
しまったのでしょう。スライドも HOLD にしておけば反応しないので、普段から
HOLD に切り替えておいた方が良さそうです。

その代わり嬉しい発見もありました。


●自動で中断セーブしてくれます

スリープ中バッテリーが空になったので、直前のゲームが消えてるだろうなとあきらめて
いたのですが、なんと中断セーブデータが残っていました。バッテリーが切れる前の状態
から再開しています。
バッテリーが切れそうになると、自ら中断セーブを行ってくれるようです。

PSP go はゲームの中断機能があって、プレイ中に別の機能を呼び出すことが出来ます。
仕組みはノート PC のサスペンド/ハイバネーションと同じなので、このような活用も
出来るんだと感心しました。

これ実際のゲームプレイ中にも一度確認してみたいと思ってます。
本当に自動で中断してくれるならもうバッテリー切れが怖くないですね。


関連エントリ
PSP-N1000 PSP go の Bluetooth で出来ること
PSP-N1000 PSP go 購入、Store が無くても出来ること


ComputeShader はかなり便利なことがわかってきました。
ポストフィルタなどのピクセル処理だけでなく、VertexShader の前段に頂点演算として
挿入したり、頂点シェーダーの代わりに使ったりも出来ます。
標準描画パイプラインへのちょっとした機能追加が簡単にできるようになった印象です。

これまでは Stream Output や PixelShader を使っていた処理が ComputeShader
だけで済むわけです。


●ここが簡単

・読み込み位置、書き込み位置が固定されない

  与えるリソースはどれも任意アドレスに対してアクセス可能で、特別扱いする
  ものがありません。

・設定が項目が少ない

  ConstantBuffer, ShaderResourceView, UnorderedAccessView のわずか 3つだけ。
  サンプラーを使う場合は + 1。

・設定が独立している

  描画用のステートをいじる必要がないので、パラメータを保存したり復帰させなくて
  済みます。たとえば Viewport とか、RenderTarget とか、
  DepthStencilState とか!! 描画に影響与えないし、戻さなくてもいいんです。
 
特に 3番目。いちいち DepthStencilState を作ったり、Depth を disable にしたり
しなくても良いだけで CS ありがとう、といった感じ。


● CS の制限

今までの Shader から見れば制限無しに扱いやすい ComputeShader ですが、
VertexShader 代わりに使おうとするといくつか制限も生じます。

 ・グループ内の実行スレッド数はシェーダー内に記述し、実行時に書き換えできない。
 ・Dispatch() に与えられる実行回数は x,y,z それぞれ 65535 まで。
 ・グループ内のスレッド数は 1024 まで。

よって VertexShader のように、1~100万回 など任意の実行回数が与えられた場合に
どのように Compute Shader を呼び出せばよいのか悩みます。

1. 65535 回を超える場合

x, y, z に分けるにしろ、CS 内のアトリビュートで Group 内スレッド数を増やすにしろ、
実行回数が常に定数で割り切れるとは限らない。

2. 速度

ある程度グループ内のスレッド数を大きめの値にしなければ ComputeShader の実行
速度が落ちます。65535 回未満だからと言って、Dispatch() だけで回数を指定して
下記のようなシェーダーを走らせると非常に低速になります。

[numthreads(1,1,1)]
void cmain_loop1( uint3 threadid : SV_DispatchThreadID )
{
    lmain( threadid.x );
}


●解決案

二通りの手段を考えてみました。

(1) 複数のシェーダーに分ける

numthreads = 32 などグループスレッド数を増やしたものと、numthreads = 1 の
端数を処理するスレッドに分けて実行します。
下のプログラムは 32 で割り切れる回数分 cmain_loop32 を実行し、端数を
cmain_loop1 で処理しています。

例えば 75 個のデータを処理するなら、cmain_loop32 を 2回、cmain_loop1 を 11回分
実行します。

// Compute Shader 5.0
cbuffer offset_T : register( b0 ) {
    uint    threadid_offset;
    uint    thread_total;
    uint    r0;
    uint    r1;
};

[numthreads(32,1,1)]
void cmain_loop32( uint3 threadid : SV_DispatchThreadID)
{
    lmain( threadid.x );
}

[numthreads(1,1,1)]
void cmain_loop1( uint3 threadid : SV_DispatchThreadID )
{
    lmain( threadid.x + threadid_offset );
}


// C++
    const int ThreadGroup= 32;
    int dcount1= data_count/ThreadGroup;
    int offset= dcount1*ThreadGroup;
    int dcount2= dcount - offset;

    offset_T cparam;
    cparam.threadid_offset= offset;
    cparam.thread_total= data_count;
    context.UpdateSubresource( CB_Offset.iBuffer, 0, NULL, &cparam, 0, 0 );
    context.CSSetConstantBuffers( 0, 1, &CB_Offset.iBuffer );

    if( dcount1 > 0 ){
        context.CSSetShader( LoopShader_1.iCS, NULL, 0 );
        context.Dispatch( dcount1, 1, 1 );
    }
    if( dcount2 > 0 ){
        context.CSSetShader( LoopShader_32.iCS, NULL, 0 );
        context.Dispatch( dcount2, 1, 1 );
    }


(2) 動的分岐を用いる

端数込みで 32 の倍数分実行します。スレッド番号が実行したい回数より多ければ、
動的分岐で処理を省きます。

例えば 75 個のデータを処理するなら、cmain_loop_dis を 3 回 (96回分) 実行し、
id が 75 以上なら何もしないで終了します。

// Compute Shader 5.0
cbuffer offset_T : register( b0 ) {
    uint    threadid_offset;
    uint    thread_total;
    uint    r0;
    uint    r1;
};

[numthreads(32,1,1)]
void cmain_loop_dis( uint3 threadid : SV_DispatchThreadID )
{
    if( threadid.x < thread_total ){
        lmain( threadid.x );
    }
}


// C++
    const int ThreadGroup= 32;
    int dcount1= (data_count+ThreadGroup-1)/ThreadGroup;

    offset_T cparam;
    cparam.threadid_offset= 0;
    cparam.thread_total= data_count;
    context.UpdateSubresource( CB_Offset.iBuffer, 0, NULL, &cparam, 0, 0 );
    context.CSSetConstantBuffers( 0, 1, &CB_Offset.iBuffer );

    context.CSSetShader( CSSubDShaderDis.iCS, NULL, 0 );
    context.Dispatch( dcount1, 1, 1 );


●実行結果

RADEON HD 5870 で試してみました。
1 フレームあたり 7セット Compute Shader の実行を繰り返しています。
それ以外の描画は fps などのフォントのみ。

上のプログラムはグループ内スレッド数 32 固定でしたが、16~320 まで変更して
試しています。

GroupThread= 16
(1)   476 fps
(2)   482 fps

GroupThread= 32
(1)   840 fps
(2)   852 fps

GroupThread= 48
(1)   973 fps
(2)  1006 fps

GroupThread= 64
(1)  1102 fps
(2)  1145 fps

GroupThread= 96
(1)   984 fps
(2)  1026 fps

GroupThread= 128
(1)  1090 fps
(2)  1140 fps

GroupThread= 256
(1)  1083 fps
(2)  1128 fps

GroupThread= 320
(1)  1009 fps
(2)  1065 fps

GroupThread が小さいと低速です。あまり小さいと Dispatch() の 65535 制限にも
ひっかかります。

どのケースでも、分岐を用いた (2) の方が高速でした。
端数分とはいえ GroupThread=1 で実行しているスレッドがあるため効率が悪い、
7セットの実行中に毎回シェーダー切り替えが発生しているから、切り替えないで済む
(2) の方が条件的に有利、等の理由が考えられます。


関連エントリ
DirectX 11 / Direct3D 11 と RADEON HD 5870 の caps
Direct3D11/DirectX11 ComputeShader 4.0 を使う
Direct3D11/DirectX11 (6) D3D11 の ComputeShader を使ってみる


URoad-5000 は持ち歩きには便利だし電源を入れるだけで即使える点も魅力です。
でもバッテリー駆動できるモバイル向けルータなので、パフォーマンスよりバッテリー
寿命や軽量化の方が優先されているようです。自宅など据え置き用途で使うには少々
パワー不足な感じがします。UPnP に対応していないといった制限もあります。

そこで、使い道に困っている(余っている) NetBook を自宅用ルータにしました。
Windows 標準の ICS を使っているだけですが、たぶんこちらの方が高速でしょう。
実際に試したのは Vista Home Basic です。ここでは Windows 7 で説明しています。

(1) NetBook に WiMAX の設定を行います。普通に WiMAX が繋がれば OK。

  USB タイプ UD01SS (UD03SS) を使ったので、USB ポートにさしてドライバとユーティリティ
  ソフトをインストールし、更新をかけました。

(2) 「ネットワークと共有センター」を開きます。
  左側の「アダプターの設定の変更」をクリック。(Vista だと「ネットワーク接続の管理」)

(3) 「ローカルエリア接続」の中から WiMAX 相当を探します。
  右ボタンでプロパティを開きます。

(4) "共有" タブを開いて共有の設定をします。
   「ネットワークのほかのユーザーに ~ 接続を許可する」
   「ネットワークのほかのユーザーに ~ 制御や無効化を許可する」
  の両方にチェックを入れます。

(5) 「ホーム ネットワーク接続」のプルダウンメニューで、他の PC やゲーム機など
  の端末をどこにつなぐか選択します。

  たいていの NetBook は、有線 LAN ポートと無線 LAN の両方を備えています。
  おそらくアダプタとしてこの段階で下記の 3つが存在しているはずです。

   ・ローカルエリア接続
   ・ローカルエリア接続 2 (UD01SS WiMAX)
   ・ワイヤレスネットワーク

  ※ ローカルエリア接続 の番号は環境によって変わる可能性あり
  今回は次のようにつなぐので、WiMAX じゃない方のローカルエリア接続を選びます。

     WAN (UQ WiMAX)
       |
 [ローカルエリア接続2 (UD01SS)] 
       |
     [NetBook]
       |
 [ローカルエリア接続 (有線LAN)]]
       |
[ハブ or 無線LAN アクセスポイント]
       |
   他の PC やゲーム機

共有設定することで NetBook がルータ相当になり、DHCP サーバーとして IP アドレスも
割り振ってくれます。

無線 LAN アクセスポイントの設定が済んでいるなら、NetBook とアクセスポイント間を
無線でつなぐことも可能です。アクセスポイントに DHCP クライアント機能があるならそれを
有効にするだけですが、固定 IP アドレスなら割り振られるアドレスと確認してから登録します。


●速度

時間帯や条件が一定と限らないので、速度はおおよその目安です。
UQ WiMAX 自体の速度はエリアや電波状況で変わります。

(1) 1.5Mbps

UD01SS + URoad-5000 --無線-- LAN-PWG/APR(子機モード) --有線-- Desktop PC

モバイルルータを 2 個経由していたせいか、かなり速度が落ちていました。
LAN-PWG/APR は子機モードでコンバータとして使っています。

(2) 2~3Mbps

UD01SS + URoad-5000 --無線-- GW-USMicroN (USB無線LANアダプタ) + Desktop PC

無線 LAN 直結 (11n) になったので速くなりました。

(3) 5~Mbps

UD01SS + NetBook

直差しが一番速いです。5Mbps くらい。

(4) 5Mbps

UD01SS + NetBook --有線-- CG-WLBARGNH(ルータ,Hubとして) --有線-- Desktop PC

NetBook に直接有線でぶら下がっている形です。オーバーヘッドが減っています。

(5) 4.5~Mbps

UD01SS + NetBook --有線-- CG-WLBARGNH --無線-- GW-USMicroN + Desktop PC

CG-WLBARGNH (無線LAN ルータ) を、アクセスポイントモードで設定しています。
これで無線 LAN ルータ相当となりました。モバイルルータをそのまま使うよりも
速度が出ています。


関連エントリ
WiMAX ルータ URoad-5000 (4) 充電の仕方
Windows7 beta で UQ WiMAX


Bluetooth を使ってみました。
本体に触らないでゲームできます。

pspgo_00.jpg

PS3 コントローラで PhantasyStar Portable 2 体験版 + Bluetooth でヘッドホン


●PSP go の特徴

PSP go の最大の違いは UMD ドライブが無いことです。他にも

 ・フラッシュメモリ 16GB 内蔵
 ・スライド式のボディ
 ・Bluetooth 機能内蔵
 ・ゲームの中断機能に対応
 ・時計/カレンダー表示

といった新要素があります。また従来の PSP から変更されたのは下記の点です。

 ・充電+通信コネクタが専用形状に変更
 ・画面サイズが 4.3 → 3.8 inch に縮小
 ・メモリカードが MS Duo から M2 に変更された

新要素の中でも Bluetooth に対応したのは大きな特徴です。


● PSP go の方向キー

PSP go の方向キー(十字キー)はスライド機構のため、周囲との段差が少なくストロークも
かなり浅くなっています。倒すと言うよりボタンをクリックして押す感じに近いです。
方向の押し分けはしっかりしており操作性は問題ありませんが、PSP-2000/3000 の操作感に
慣れてしまうと、若干斜め方向が入りにくく感じるかもしれません。

とはいえ PSP-1000 のように全く反応しないと言うこともなく、比べものにならないほど
きちんと斜め方向が入ります。DS Lite のように斜めに入り損ねることもなく、PSP go の方が
反応良く確実に押せます。ボタンの薄さは DSi に近いかもしれません。

さらに PSP go は外付けのコントローラを使うことが出来ます。
操作性に関しては、個人の好みの点も含めても携帯機で最高の環境を備える可能性が出てきました。


● PS3 コントローラが使える

Playstation 3 / Wii 等のワイヤレスコントローラは Bluetooth を使っています。
PSP go も Bluetooth を内蔵したことにより、携帯ゲーム機ながら外付けのゲーム
コントローラが使えるようになりました。

現在対応しているのは PS3 用のゲームコントローラ SIXAXIS / DUALSHOCK3 です。
Bluetooth は汎用プロトコルなので今後の更新で対応デバイスが増える可能性があります。

注意点はペアリングのために PS3 本体が必要となること。
SIXAXIS / DUALSHOCK3 は USB ケーブルによるワイヤード接続でペアリングを行う仕様と
なっており、Bluetooth のペアリングモードを備えていません。PSP go もいったん PS3 を
経由してコントローラの登録を行います。一度ペアリングを行えば PS3 が無くても使えます。
PS3 持ってる人に頼んでペアリングだけしてもらうのもありでしょう。


● ペアリング

用意する物

 ・PS3 用コントローラ (SIXAXIS/DUALSHOCK 3)
 ・PS3 本体 (最初だけ)
 ・PSP go
 ・それぞれをつなぐ USB ケーブル

(1) PS3 の電源を入れておく
(2) PSP go 側で操作
   「設定」→「Bluetooth機器設定」→「Bluetooth 機器管理」
    →「新しい機器の登録」→「PS3 コントローラを登録する」
(3) 以後 PSP go の画面の指示に従います。

 1. PSP go と PS3 を USB ケーブルでつなぐ。
 2. ペアリングしたいコントローラを PS3 本体と USB ケーブルでつなぐ。
 3. 画面の指示があったら両方とも USB ケーブルを抜く。
 4. PS3 コントローラの (PS) ボタンを押す

操作は PSP go 側で行うので、この間 PS3 の画面を見る必要がありません。
TV をつけずに設定出来ました。


●操作

PS3 コントローラを使うとスライドを閉じた状態でもゲームが出来ます。
(PS) ボタンも反応するし、PSP go の電源を切るとコントローラの電源も落ちます。
go の電源を入れてコントローラの (PS) ボタンを押せばすぐに再リンクします。

ボタンの対応は下記の通り。

・右アナログスティック, L3, R3 = 未使用
・L1, L2 = どちらも PSP の L
・R1, R2 = どちらも PSP の R

基本的に PSP に存在していないボタンは使えないようです。

ゲームアーカイブスの PS1 タイトルで右アナログが使えるかどうか、DUALSHOCK 対応ソフトを
持っていなかったので検証できませんでした。設定画面を見つけていないので、おそらく
振動機能も使えないのではないかと思います。
PS1 のゲームで同時に複数のコントローラが使えるかどうかも未確認です。


●その他の入力デバイス

キーボードとマウスは「非対応のデバイスです」といわれて接続できませんでした。

PS3 ワイヤレスキーパッド
・RBK-2000BT2 (Bluetooth キーボード)
・VGP-BMS33 (Bluetooth マウス)


●オーディオデバイス

Bluetooth オーディオデバイス (A2DP) に対応しています。
下記のワイヤレスオーディオレシーバーを使ってみました。

SONY DRC-BT15P
SANWA MM-BTSH3

ペアリングは直接行います。

「設定」→「Bluetooth 機器設定」→「Bluetooth 機器管理」→「新しい機器の登録」
 →「Bluetooth 機器を検索する」

あとはそれぞれのレシーバーのマニュアルに書かれているパスキーを入れるだけ。
音声出力切り替えは、PSP go 上面にある [♪] 音符マークのサウンドボタンを使います。

 ・[♪] ボタンを長押しするとミュート (1秒)
 ・[♪] ボタンをさらに長押し (5秒) すると音声の出力先が Bluetooth に切り替わる

A2DP 対応は PS3 にも欲しい機能です。


● Bluetooth 音声の注意点

Bluetooth のリンクが切れると音声は強制的に本体から流れます。
例えば左側面のワイヤレススイッチを切った場合、無線 LAN だけでなく Bluetooth も
切れます。直後、本体スピーカーから音声が流れることになります。


●ダイヤルアップネットワーク

PSP は無線 LAN のアドホックでインターネット接続できないので、Bluetooth の
ダイヤルアップ対応は嬉しい機能の一つです。

EMOBILE TouchDiamond S21HT を使ってみましたが、ペアリングできるものの接続は
まだ成功していません。PC からの接続では Bluetooth 経由で DUN で繋がっているのに、
PSP go からは 8030000B というエラーで失敗します。まだ原因はわかってません。


●警告画面が出てしまう

Bluetooth を ON にすると、USB モードに切り替わるたびに Bluetooth を一時的に無効するとの
警告画面が出てきます。いちいちボタンを押さなければならないので少々面倒かもしれません。


●PSP go 全般

PSP-1000 時代に夢だった外部コントローラが、念願かなって使えるようになって
しまいました。当時 PSP-1000 の方向キーに問題があったせいなのですが…。
PS3 のように、今後はキーボードとか様々なデバイスに繋がるようになればゲームの
幅も広がります。特にアーカイブスタイトルとか。

画面は密度が上がったことと、コントラストが高く色もはっきりしており非常にきれいに
見えます。以前使っていた PSP が PSP-2000 なので特にそう感じるのかもしれません。

本体は非常に小さくスリムです。これに携帯電話が付いていてもおかしくないと思うくらい。
本体底面に滑り止めのゴムあり。

上面は隙間無くボタンが並んでいるのでつかむ場所がありません。
上下を挟んで持つのはやめた方がよさそう。

Bluetooth 対応した携帯ゲーム機は多くありません。
iPhone や iPod touch も Bluetooth を内蔵していますが A2DP に対応しているものの
外部コントローラやキーボードをつなぐことが出来ません。
iPhone で Bluetooth コントローラが使えるようになる日は来るのでしょうか。


関連エントリ
PSP-N1000 PSP go 購入、Store が無くても出来ること
Media Go で PSP のデータ管理
新型 PSP (PSP-2000) とゲームアーカイブス


PSP go (PSP-N1000) 買いました。
ほぼゲームアーカイブス専用機と化していた自分にとっては理想の端末です。
欲しいダウンロードソフトが出るまでは、小型で持ち歩ける PS1 になりそうです。


●体験版

最初からある程度充電してあったらしく電源が入りました。
本体メモリにもゲームの体験版が 3本インストール済みなので、箱から出してすぐ
ゲームで遊べます。

完全に充電しておかないとファーム更新で怒られるのでまずは充電します。


●とりあえず充電

付属の AC アダプタはメガネケーブルタイプですが、VAIO type P のように直付けの
プラグアダプタがついていました。充電ケーブルも USB ケーブル兼用なので
AC アダプタを使わずとも USB で充電できます。

 ・付属の AC アダプタを使う (付属の専用 USB ケーブルが必要)
 ・USB から充電する (付属の専用 USB ケーブルが必要)

パソコンなどの USB コネクタから充電を行う場合、PSP 側を USB モードに切り替えて
おく必要があります。USB 端子から充電しながらゲームするだけの電力がとれないための
配慮だと思われます。この辺も PSP-2000/3000 と同じです。
USB ケーブルが堅めで取り回ししづらいのは残念。


●とりあえずネットワーク

ネットワークに接続します。ワイヤレス LAN の設定もこれまでの PSP と全く同じ。
NetWalker に続いて WiMAX ルータ URoad-5000 が活躍してくれそうです。

設定 → ネットワーク設定 → インフラストラクチャモード
[新しい接続の作成] → 検索する → 一覧から対象のルータを選んで

SSID : デフォルトのまま
セキュリティー設定 : そのまま
キー: 入力する

アドレス設定 : かんたん → 接続名: 任意 → 完了

これでインターネットブラウザーが使えます。


●とりあえず更新

購入時のシステムソフトウエアのバージョンは 5.70 でした。

設定 → システムアップデート

更新後 6.10 になります。


●ここで少々失敗

ネットにさえつながれば、ソフトなんてどこでもダウンロードできるだろうと甘く
考えいたものの、出先なもので肝心のアカウントを失念。
PlayStation Store からダウンロード出来ませんでした。

新規でアカウントを作るのも手間だし、せっかくなので以下 Store に接続しないで
どこまで遊べるかやってみます。


●ソフトウエアの転送/ダウンロード手段のまとめ

Media Go の CD-ROM が入っていましたが、もともと PS3 で購入管理していたのと
PC にもすでにインストール済みなのでたぶん不要です。
Media Go はこちらからダウンロードできます。

SONY Media Go

ソフトの入手と転送方法は下記の 3種類あります。

(1) PSP go 本体から PlayStation Store に直接つないでダウンロード
(2) Playstation3 上の PlayStation Store からダウンロード+USB 転送
(3) Windows PC + Media Go で PlayStation Store からダウンロード+USB 転送


●アカウントが無くても体験版ダウンロード

体験版だけならもう一つダウンロード方法があります。
PlayStation Store のアカウントも不要です。

(4) 本体内蔵ブラウザ+ PSP Home ページからダウンロード

ネットワーク → インターネットブラウザー 

ブラウザが起動したら (△) ボタンで表示されるメニューを開いて「ブックマーク」
(ハート型アイコン) の "PSP" を選択します。
プリセットされている PSP の公式ホームページです。

ここから体験版やムービー、カスタムテーマ、壁紙などをダウンロードすることが
できます。PlayStation Store に並んでいるものとはラインナップが異なります。

PSP 本体から PlayStation Store に直接接続できるようになったのはほんの 1年前
システムバージョン 5.0 からです。それまでは、ここから体験版をダウンロード
していました。


●インターネットラジオ

ネットワーク → インターネットラジオ → インターネットラジオについて

説明を読んで、各種ネットラジオプレイヤーをダウンロードします。
多数あるのでとりあえず片っ端から落としてみます。

ダウンロードしたプレイヤーを起動すると、ネットワークに接続した後
「このページに埋め込まれたプラグインを実行しますか」ときかれるので「はい」。

しばらくして音楽のストリーミング再生が始まります。これらのプレイヤーはブラウザ
のプラグインで作られています。基本的なカーソルの操作はブラウザと同じ。
負荷が重いとなかなかアイコンが表示されないのもそのためです。
ストリーミング先が重いとなかなか再生が始まらないので、そのときはあきらめて
放送局を切り替えた方がよいです。

プレイヤーとして使うならこんな感じの設定で。

1. 本体のスライドを閉じる
2. 上部の□ボタン (画面輝度切り替えボタン) を長押ししてバックライトを消す
3. 電源スイッチを HOLD にする


●ポッドキャスト

ネットワーク → RSS チャンネル → RSSチャンネルガイド

音声や動画による配信を視聴できます。いわゆるポッドキャストプレイヤーです。
チャンネルガイドでブラウザが起動するので、好きな番組を登録して使います。

例えば TOKYO FM Podcasts など、ラジオ局のものも多く提供されています。
「インターネットラジオ」よりも、こちらの方が日本語でイメージする「ラジオ」に
近いかもしれません。


●メディアプレイヤー

USB ケーブルで PC につなぐと USB モードに切り替わります。
PC からはリムーバブルディスクとして認識されました。
Media Go を使ってデータを転送すればメディアプレイヤーとして使えます。
エクスプローラから直接コピーも可能です。

ここまで説明した機能はどれも従来の PSP で出来ることばかりでした。
あらためて考えると PSP で出来ることは多いです。これ以外にも skype とか周辺機器
などいろいろあるので。


●容量と整理方法

アーカイブスのゲームはどれも容量が大きいですが、本体だけで 16GB あるので
しばらく持ちそうです。

むしろ問題になるのはゲームの整理方法。PS3 もそうですが、ダウンロードしたゲーム
が増えるとメニューから探し出すのが大変になります。
タグをつけたりフォルダを作ったり、何らかの整理方法が欲しくなります。


関連エントリ
Media Go で PSP のデータ管理
新型 PSP (PSP-2000) とゲームアーカイブス