ラベル Android の投稿を表示しています。 すべての投稿を表示
ラベル Android の投稿を表示しています。 すべての投稿を表示

2013年6月30日日曜日

Xperia A

Xperia GX から A に替えました。

ぶっちゃけあんま変わってません。
画面サイズも同じだと替えたっていう満足度はかなり小さいですね。

GX との差分は

  • 電源ボタンが右脇腹に
  • CPUが Quad Core に
  • メモリ(RAM/NAND共に)が二倍に
  • OS が Android 4.1 に
  • Flash Plaeyr 11 がサポート対象外に
  • バッテリが 2300mAh に
  • 背面の反りがなくなってもっこりに
  • 内側カメラが 30万画素(謎のグレードダウン)に
  • NFC/IrDA対応に
  • 防水対応に
  • ワンセグ/nottv 対応に

なったことでしょうか。
内側カメラなんか使わないからどうでもいいですが、最後のなんかデグレですよね。
一番腹立つのは毎回電源ボタンが変わることですが……。
ずっと避けてきたワンセグ/nottv に対応してしまったことも個人的には汚点扱いです。
おかげさまで醜悪なアンテナが付きました。
このアンテナだけで失笑もんのバカバカしさなのに、屋内だと感度不足で使えないらしく、 nottv を即解約しようとしたら以下のような案内が出ました。

屋内で受信できないから解約するなら、こんなアンテナもありますよ!ってことらしい。
ええ、そうですか、そいつは素晴らしいアイデアですね。
こんなアイデア、思いつきませんでしたよ。ええ。
さ、解約解約。

CPU が Quad Coreになったって webkit なんてほぼシングルスレッドだし……と思ったけど結構パフォーマンス良くなってます。ベンチ取ってないけど気のせいじゃないと思います。
でもこの辺はソフトウェアの improvement が進んだ結果のような気がしますのう。
標準ブラウザは相変わらず片手で操作していると gracefully にタブを閉じてしまううんこゼスチャー対応ぶりで苛々しますね。

USB の充電が左側になったせいで、右から充電するように最適化されている僕の周辺は見直しが必要になりました。
防水のせいで穴という穴が塞がれており、充電もヘッドフォンの挿抜もとにかくやりにくいです。最悪。
付属のスタンドからも充電が可能で、これは端子が露出しているのでカバーを外す必要がありますが、スタンドは横向き専用です。
電源ボタンが右脇腹になったお陰で横向きでも電源くらいは入れられますが、こいつのホームは横向きで使えるようにはできてません。
でも心配ご無用!  USBの隣のまるだし端子に印加すると卓上ホルダーモードになるらしく、ホーム画面も横向きで使えるようになります。
……でもえらい使い難い。なんか横向きだとえらい狭く感じる。タブレット見慣れてるせいかなぁ。

大体今更赤外線ねぇ……。
スマホ出始めくらいの頃ならともかく、今日日赤外線ポートついてる携帯のほうが珍しくないですか?
もっとも、赤外線でコントロールできる機器は色々あるので、用途を決めなければ楽しい機能かも知れませんね。

まぁ、悪い事ばっかりじゃありません。
パフォーマンスはいいですし、バッテリの持ちも随分良くなりました。

それから Android 4.1 から Flash Player 11 のサポートが外れました。
Adobe の Archives から apk を拾ってきてインストールしたところ、ちゃんと動作しているように見えます。


ところで、今回の機種変更に伴ってデータの移行を Sony Bridge for Mac を使って行いました。
以前にも紹介した iTunes を意識したような Windows/Mac のデータ管理ソフトです。

前回は iTune Music Store で買った曲を移すくらいの目的でしたが、今回は大量のデータを扱います。
結論からいうと、他にまともな方法がなく、しょうがないから使うけど、大概の人はキレるだろうという感じです。

使う前にまず深呼吸し、以下の覚悟するポイントを押さえておきましょう。

  1. Android のギャラリーの仕組みは任意の画像ファイルを DB に登録している。従って、内蔵ストレージのあちこちに分散している可能性がある
  2. 端末のカメラで保存した写真だけは DCIM の規定に従う
  3. アプリの内蔵ディレクトリもアプリに見えている
  4. Sony Bridge for Mac ではフォトデータのインポートにあたり、 DCIM の規定か、それ以外の画像ファイルかを選ぶ 
  5. インポートした写真は一つのディレクトリにまとめられる。メタデータは付属しない
上記の条件から導かれる結論はなんでしょうか?

DCIM の写真か、Android 端末中の、それこそアプリの asset のようなバックアップ不要のゴミファイルまで全ての画像ファイルのどちらかしか選べないということであります。
最小セットと最大セットのどちらか選べという究極の選択……。

ちなみに僕の場合は写真だけを選ぶと 66 毎。それ以外の全てを選ぶとアプリのアセットがほとんどで、合計 10047 毎。
1万を超えると一覧を得るだけでとんでもない時間がかかります。
でもそれも仕方がないことです。 上記の条件1と3がある限りは……。

さらにインポートしてから新しい端末へ同期しても、ただコピーされるだけでその他のメタデータは全て失われます。
PC 側で管理することは諦めることになります。
Sony Bridge for Mac からは iPhoto のイベントやアルバムを扱うことができますが、同期するとただの画像ファイルが全部同じディレクトリにコピーされるだけで、何のメタデータも付属しません。
困ったもんだ。

まぁこれは Sony Bridge for Mac のせいじゃありません。
しかし、DB にクエリすればギャラリーに見えている画像はリスティングできるはずなのですが、誰でも DB をマウントできるわけではないし、 MTP という括りではできないだけなのかも知れません。

データ、特に画像の移行に関しては第三の方法を自分で探すほかありません。
思うにそういうことができるアプリがあるでしょうからアプリからギャラリーにアクセスして SD にでもエクスポートするのが一番いいと思います。


2013年5月26日日曜日

勇者のくせにこなまいきだ

あの「勇者のくせになまいきだ」の新作がPSMで発売です。
——え? PSM って何だって?
えーと、それを説明するとさすがに長くなるので後回しにします。
PSM は PlayStationMobile の略で、ゲームの造り方の部分——技術的な棲み分けの話であり、とりあえず今は VITA や Xperia なんかの一部スマホで動くゲームだと思っていてください。
遊ぶぶんには他のゲームと同様に PS Store で買って同じように遊べます。
5/28まで300円です。その後は……幾らだっけ? 500円かな?

勇者のくせになまいきだ——略して「ゆうなま」ではプレイヤーは破壊神という名の、一本のツルハシとなって地面を掘ってダンジョンを作ってきました。
掘ることで地中の生命を活性化し、養分の循環と集積をコントロールし、より高度なモンスターを生み出して勇者を撃退するわけですね。


新作こなまいきはなぜかアクションパズルゲームです。
同じ色のモンスターを三つ揃えると生み出し、勇者の元に送り込んで戦わせることができます。

勇者がやってきました。
——テイストは安定の高度なパロディと内輪ネタです。心配になりますね。
勇者はひとりでは来ません。必ず他にたくさんのお供を連れてきます。

これが勇者を迎え撃つ画面。
一目見て、 HEXIC や Gems, パズルクエストシリーズのようなタイプとわかりますね。勇者のセリフはニコニコ動画風のコメントで流れますが意味はありません。
ブロックは封入されたモンスターごとに色分けされています。
上のスクリーンショットでいうと、緑→青→赤の順に強いです。 この例では赤が最強ですね。茶色い、何もモンスターがいない無色のブロックもあります。
これら以外に、水色と紫のドラゴンブロック、そしてお邪魔ブロックがあります。
画面をタップするとタップしたブロックが消えます。(お邪魔ブロックはタップで消せません)
大抵の場合、タップして消すブロックは犠牲です。無駄に消えてしまいます。そのかわりスペースが空くので、上から他のブロックが落ちてきます。
落ちる前に左右のブロックを一個ずつスライドさせて滑り込ませることも可能です。
タップ & スライド。そうして同じブロックを三つ揃えましょう。

縦か横に三つ揃うとブロックは消え、中のモンスターが画面左側の勇者のところに送り込まれます。
揃えて意味があるのはモンスターが入っている色付きブロックだけですよ?


三つ揃えるとモンスターを送り込めるだけでなく、三つのうちの最後に動いたもの一つが一段高度なモンスターに進化します。
水色のゴーレム、紫のドラゴンのブロックは赤を揃えて進化させる必要があります。

今まさにドラゴン三匹が勇者と戦っています。
そこにピクシー(青)を送り込んだところです。

写真では五匹のピクシーが出動しています。
これは5コンボ目だからです。コンボを続ければ続けるほど同じ三つのブロックから大量のモンスターを送り込むことができます。
普通のパズルゲーム同様、コンボはとても大事です。

コンボは連鎖とは違います。消えるアクションと次に揃うものが連続している必要がないのです。
消えるアクションが続いている間も他のブロックを操作できますので、揃えられる組み合わせが思いつく間は揃えまくれます。

そしてスクリーンショットの上の方を見てください。白く発光している赤ブロックがあります。
これは養分の詰まったブロックで、普通の赤と同じに扱えますが、タップして消すと養分を解放し、周囲のブロックをアップグレードしたりお邪魔ブロックをただの無色に還元できます。
効果範囲は養分の量によります。一番弱くて上下、次が上下左右、次が隣接全部です。
養分を解放させるには必ずタップして消さなければなりません
これを活用すれば、普通に頑張るよりも簡単にドラゴンを送り込めるようになりますよ。

勇者もやられっぱなしではありません。
上のスクリーンショットの左側、勇者の上を見てください。
この勇者は瀕死ですが、こちらがあと4回掘ると攻撃してきます。
勇者の攻撃とは、こちらのブロックをお邪魔ブロックに変えてしまうことです。
攻撃パターンは勇者によって違います。 ですが、お邪魔ブロックに実際に変わる前にどれとどれが変わるか予告がありますので、赤い予告マークが出たらそこからはよく考えてください。
ドラゴンやゴーレムを守り、反撃の体制を整えましょう。

時間切れになる前に勇者を倒せました。
画面一番の右のメーターが勇者の効率進捗で、一番上からスタートして一番下に魔王がいます。
魔王とは戦わずに生け捕りされますので、一番下まで来られたらゲームオーバーです。
勇者を一人倒したら次の勇者はまた一番上からスタートです。
全ての勇者を倒してステージクリアを目指しましょう。

モンスターの強さと色の関係はおわかりですか? 弱い方から
緑→青→赤→水色→紫
です。
お邪魔ブロックはタップしても消えませんが、他のブロックが消えるときに巻き込んで消すことはできます。
ただぷよぷよのお邪魔ぷよとは違い、隣にあれば消えるというものじゃありません。
揃えたときに隣接するお邪魔ブロックのうち、揃えた方向にあるものに限られます。縦に揃えたときは隣接する縦、横に揃えたときは隣接する横、という風に消えます。
少々厄介ですね。
そのかわり、お邪魔ブロックがいくつあろうとも、横なら横方向のもが全て消えてくれます。(お邪魔ブロックが続いている場合に限る。真っ直ぐ横方向の途中にお邪魔ブロック以外のブロックがあると消えるのはそこまで)

それから、ドラゴンを送り込むときはすべてのお邪魔ブロックが消えます。

まぁ、細かいルールについても触れましたが、やれば解ると思います。チュートリアルもありますし。
チュートリアルは操作方法のみならず、ヒントを教えてもらえます
そのヒントがなければ、ステージ6以上のクリアは難しいでしょう。

このゲーム、結構難しいです。
歯を食いしばって、息を止め、呪詛の言葉を吐きながらひたすら揃えまくりましょう。
強い勇者を倒すには優れた防御と形勢の反転、そして雨のような攻撃が必要です。
もちろん強いモンスターを作り出すことも重要なのですが——それだけに集中してはいけません。

実のところ、これはパズルゲームではありません。
アクションゲームです
頭を使えば、打開できる局面もあろうというものですが基本的には指先を動かしましょう。

あっ、そうそう。
買うときの注意ですが、 PlayStation Store は Vita 用ゲーム, Video, PlayStation Mobile  と三つのタブがあります。
PSM のゲームはその一番右のタブですんで、そこだけご注意。





2013年5月22日水曜日

Flickr が変わった

Xbox One が発表されましたが個人的に一番激震が走ったのは Yahoo! による tumblr 買収……でもなくて、 flickr の大幅なアップデート。

Photostream の大幅なレイアウト変更もありますが、メンバーシップに大鉈が振るわれました。
一見して Pro アカウントの消滅と言いますか。 Free アカウントの底上げと言いますか。ビジネスモデルに大きな修正が加えられたようです。

背景には年間 25$ ほど取る Pro アカウントでは利益が伸びなかったのか、僕も身に覚えがありますが、年間を通して大量アップロードしているわけじゃないユーザーは Pro アカウントが失効しても「まぁいいや」と次に沢山写真撮るまでは放置しちゃうわけです。
要するに自動更新してない Pro アカウントですね。

本日(日本時間では昨日)より Free アカウントのユーザーは以下のようになります。
原文はこちら

  • 1TB ストレージ
  • オリジナルクオリティの維持
  • 広告表示
  • 一つの写真は最大200MBまで
  • 一本あたり 1GB までの HD ビデオのアップロード
  • 3分間のビデオ視聴(なんだそりゃ)

重要そうな順で書いてます。
オリジナルクオリティの維持というのは、 flickr のユーザー以外には想像しにくいかも知れませんが、とても重要な要素です。
twitpic とかに写真上げると、 JPEG の圧縮率が最高になるよう再エンコードされます。 従ってどんな写真でもがっかりするような品質の低下を確認できます。それも誰にでも解るような露骨な劣化が。
flickr はそういうことが起きないサービスの一つなのですね。

さらに、お金を払うと以下のようになります。

  • $50/year で広告なし
  • $500/year で 2TB へ拡張(最大)

No Ads 且つ 2TB (Doubler) にするには合計 $550 払わないとイカンのでしょうか。
たぶんそうだと思います。 Doubler が No Ads の上位概念とは読めないので。

ちなみに拡張の上限は 2TB で、それ以上には増やせません。アカウントを増やすしかないようです。
さすがに 1TB だって充分すぎるでしょうが。

いやー、それにしても、サービスの提供側がこんなに厭そうな顔してるのが目に浮かぶ Lean more も珍しいですよね。
やりたくないならやめちゃえばいいのに
誰が使うんですか、 Doubler とか…。

メールには"ストレージが 1TB になったよ!"くらいしか書いてなかったので喜んで観に行った人は大概混乱しているようですね。

特に今 Pro アカウントの人は特に混乱しています。
だって今朝の時点では Pro アカウントがなくなってしまうように言われていましたから。

まず、 Pro アカウントとは何だったのか、それを確認しましょう。(原文
  • 無制限 写真アップロード(1枚あたり50MBまで)
  • 無制限 ビデオアップロード (90秒まで。一本あたり最大500MB)
  • HD ビデオの視聴
  • 無制限のストレージ
  • 無制限の帯域
  • オリジナルクオリティでの記録
  • 写真の置き換え
  • 60までの Group/Pool への投稿
  • 写真の閲覧数、統計へのアクセス
  • 他人への公開解像度設定
  • 広告なしの閲覧、共有
こうしてみると地味に色んなご利益あったんですね。

さて、この便利な Pro アカウントにアップグレードしたいと思ってももうできません。それは事実です。
今 Pro の人は今後どうなるのか、それが問題です。
原文

  • "自動更新の" Pro アカウントは今のところ更新可能
  • Pro メンバーの資格者は 2013/8/20 まで Free アカウントに切り替えるか選べる.
  • "Pro Gift" はもうあげられません
  • "Pro バッチ"ももう付きません
”自動更新”(Recurring) の定義を巡っては案の定、Help フォーラムでも揉めていました。
数少ないながら、 flickr スタッフからの明確なメッセージもポストされていますので、僕の考えを述べるよりもそれを読んだほうがいいと思います。

フォーラムのスレッド:
 http://www.flickr.com/help/forum/en-us/72157633549071436/

スタッフのコメント:
 http://www.flickr.com/help/forum/en-us/72157633549071436/#reply72157633533344529

僕のように自動更新にしていない Pro アカウントは失効後、更新できなくなります。
ですが、 flickr のチームは自動更新契約するためのフォームを準備中のようです。

(そのフォームができる前に失効してしまう人は困るでしょうね。expire する前に更新しとけばいいのでしょうが)

スタッフのコメント2:
http://www.flickr.com/help/forum/en-us/72157633549071436/#reply72157633533510777

おそらく今のところは(たぶん 8/20 までは) Pro をやめて Free になる決定を明示的にしない限り、 Pro アカウントには何も起きないということでしょう。


flickr は他にもいろいろと変わりました。
アップローダも新しくなりましたし、 Photostream の上部にあるカバーイメージはスクロールすると昔のゲームのレイヤーみたいでちょっとかっこいい。
Help フォーラムのリンクは画面下部にあるのに、タイムライン表示の状態で一番下までスクロールするのが事実上不可能だとか、そういう腐ってる部分もありますが。

まぁ、ちょっと心配しましたが、僕の flickr アプリ "Heurickr" は問題なく動いています。
確かに Pro バッジは Contacts リストに表示されなくなっているけど、それ以外は何も変わりありません。

2013年5月3日金曜日

最適化 etc, リアルタイム作戦大失敗

とりあえず前回のエントリでリアルタイム処理は特殊だ、ということだけ解ってもらったと思います。
まぁこれは100メートルリレー400mとフルマラソンの違いであります。

リレーでは前の走者をトリガーに自分が全力で走ります。
「ここまで勝ってるからゆっくり走っていいよね」ではシバかれます。
お前は全力で100m走れ、最低でも11秒で走れ、速ければ速い程いい、 と言われるのがリアルタイム処理の世界だと思ってください。

実際に失敗例と成功例を見てみましょう。
便宜上失敗例といいますが、本当に大失敗したものは消えていますので同世代の比較ができません。ここでは「非常に優れているが、比較的の上では一歩及ばないもの」のことです。失敗例扱いされたといって気にしないでください。


Android のタッチパネル


僕は詳しくないのですが、どうも iPhone と比べて遅いらしいのです。
どのデバイスもハードウェアは常にポーリングを行っておりデータの入力があればメインのプロセッサに報せます。
このときに使われるのが割り込みというシステムです(敢えて割り込みを使わないということも考えられますが、ここでは割り込みとします)。
具体的には、ポーリングを行っているタッチパネルの制御用マイコンから、ホストのメイン CPU に信号がくるわけですね。
この信号を受けてホストのメイン CPU がデータの処理用のコードを呼び出すのですが

  • CPU の割当が遅い
  • いつタッチポイントのデータ転送を開始できるかわからない
  • そもそもタッチパネルの制御用マイコンというやつの素性がわからない
  • データの処理が遅い

などの理由で、データの処理開始が遅れます。
スタートが遅いとデータを取りこぼしたり、ユーザーへの反映までがずるずると遅れることになります。
データを取りこぼさないテクニックとしてはデータを取ったら後続のデータ処理をキックし、可及的速やかに処理を戻す、ということも考えられます。
割り込み処理中のイベントに対応するため、割り込み処理は可能な限り軽くしておくというのが基本なのですね。

ですがそもそも割り込みが入るのが遅い、となるとシステムレベルのプログラマにとっても厳しい事態となります。
iPhone の場合は、タッチパネルの制御マイコンによく知ったものを使っているので、 OS は最も最適な方法で一連の処理を終えることができます。
Android はベンダーの提供するドライバを呼び出すしかなく、全てをドライバの出来に左右されてしまいます。
ARM というプロセッサは割り込み処理がとても速くなるよう設計されているのですが、海のものとも山のものとも知れないドライバに処理を移すには、やっぱり最悪ケースを考えて移すよりありません。
不要なレジスタを退避し、いつ終わるとも知れないデータ転送を待つか、諦めてコンテキストを分離する……そういう世界です。

更に、タッチパネルというのは一見するよりも扱い難いものです。というのはマウスなどにはないノイズが多く、一回のスキャンで得られたポイント情報をアプリに全部渡すわけにはいきません。
システムはノイズを取り除き、有意な情報として処理したものをアプリケーションに渡します。この処理には、実際には数フレーム分の時間をとってしまうことがあります。


これら全て、ユーザーから見ればほんの一瞬の出来事ですが、下手をするとその一瞬は 0.1 秒くらいになってしまうかも知れません。或いは 0.03 秒で済むかも知れません。出来によります。
iPhone と Android では iPhone のほうがパネルの反応がよいとされるのは、ドライバやタッチパネルの制御用チップの出来の善し悪しに以外にもそうした事情があると思われます。
このことはユーザーにとっても、とても大きな問題です。詳しくは後述するような理由からです。


3d-coat 「書き味」の問題


3D-coat というとても素晴らしいソフトがあります。
これはスカルプチュアと呼ばれる 3D モデリングに使うソフトで、他に著名なものでは ZBrush や modo というのがありますね。
3d-coat もとても優れたソフトなのですが、フォーラムでは常に ZBrush と比較されてしまいます。
なぜか?
僕はアーティストでないのでそこまで拘りがないのですが、3D のアーティストの間では「書き味」というのがしばしば話題になり、 3d-coat の書き味は ZBrush には及ばないというのですね。
これはアーティストがペンタブで描いたものが、どれくらいよくポリゴン上に反映されるかというものです。
3D-coat はマルチレベルのボクセルを使用しており、これはとても高度で造形しやすいのですが、計算は重くなります。
アプリケーションはタブレットの入力を受け、2Dがボクセルモデルのどこに対応するかを計算し、ブラシを適用します。ブラシの適用は一回ではなく、内部的に何度も適用しますので、単位時間あたりの処理回数が多ければ多いほどアーティストのニュアンスを適用しやすくなります。
従って、重たいボクセルモデルを使用しているときと軽いボクセルモデルのときとでは、同じようにペンを走らせても結果が全く異なるのです。
重い場合はまず描いたものが飛び飛びに反映されてしまいますし、同じだけペイントしたつもりでも適応量がささやか過ぎたりします。ですからユーザーは(画面に反映したかどうか確認しつつ)ゆっくりとペンを動かさねばなりません。
ユーザーへの反映——これをフィードバックと呼びますが——フィードバックが細かく、速く、正確であるほど人間の動きも正確になります。ですので、フィードバックが遅いということはアーティストにとって手足を繋がれているのも同然だという意味です。

アーティストのいう「書き味」を科学的に考察すると、それはフィードバックの速度と精度のことであります。

enchantMOON が拘っているという「書き味」もまったく同様に、フィードバックの速度と精度だと思われます。


Android 4.1 以前 のサウンドシステム


Android は linux をベースとしています。
これはリアルタイムシステムではありませんので比較的時間にルーズな OS であります。
CPU の計算資源が足りない時にルーズになるのは仕方がないとしても、日頃から結構ルーズであります。
たとえば linux のサウンド出力のシステムは /dev にマップされた抽象化デバイスとして実現されており、プログラムはいくつものバッファを経て音を再生します。
バッファを経るということは、たとえば CPU の計算資源が割当られず、サウンドデータを出力できない期間があったとしても、割当てられたタイミングで沢山データをバッファを供給しておけば音が途切れずに再生できるというメリットがあります。
その一方、出力しようとした音が実際に出力されるのがいつになるかはっきりと解らないというデメリットがあります。
一般には、 1000ms 分のバッファがあったとしたら音が出力されるのは 1000ms 後です。遅過ぎます。
まぁ 1000ms というのは極端で、実際は 100ms くらいでしょうが、効果音がズレるなどという事態はゲームにとっては非常に致命的です。
その代わり1秒くらい CPU の時間が回ってこなくても大丈夫ですし、レート変換などもシステム側で行うことができるので、アプリは音を出すのがずっと簡単になります。もしレート変換を自分で行うとしたら結構大変です。変換するレートの最小公倍数ぶんの時間がかかると思ってください。

一方、 iPhone は MacOS の CoreAudio という薄いレイヤのアーキテクチャを利用しています。
これは OS がサウンドデバイスの管理をアプリに任せる反面、プログラムがデータを出力してから即座に音を出す事ができます。

さらに、前述したタッチパネルの遅延があることも思い出してください。
このため、 Android にはリアルタイム演奏のアプリケーションが少ないですし、奥深いアクションゲームの体験といった点においても遅れをとっているわけです。

チケットゲート


生憎、皆さんが比較体験できない例です。
もう大分前の話ですが、仕事でオンラインチケットを検査してゲートを開閉するシステムを作っていたことがあります。
正確には僕が作ったわけではなく、最初につくったシステムがあまりにも遅かったら、その高速化を頼まれたのです。
研究所からの要求はチケットの検査から結果が出るまで 120ms  というものでした。それが実際は 2000ms 以上かかっていたのです。
仮に、駅の自動改札に Suica をタッチして2秒待たされたと考えてください。
事故になりますよね。
ETC とか考えただけで憂鬱になります。
僕のはそこまでシビアなシステムではありませんでしたが、最終的には目標の性能を達成できました。
Suica もえらい苦労したと聞きます。
自動改札を通るとき、たまには思い出してあげてください。ゲートを速やかに開けるために何ヶ月も休まないでプログラムを書いた人がいることを。

卑近な例としてチケットゲートを上げましたが、所謂組み込みでは大概リアルタイムです。
ロボットや車の操縦なんかですね。
人工衛星やロケットなど真空に近い状況下で動作するシステムは

USB

リアルタイムシステムというと組み込みプログラミングという印象強いでしょうが、デバイスドライバだって優れた応答性が要求されます。
USB デバイスは言わずと知れた拡張端子の傑作であります。
USB 以前のことを考えてください。RS-232C, パラレル、 SCSI のアンフェノールピン……。
USB コントローラチップはパワフルですが、反面システムに対する要求も高いものでした(OHCI と UHCI で仕様が分かれたのもまずかったけど)。

まず 32bit の PCI アドレス空間が必要です。これで Win3.1/DOS は対応できなくなりました。さようなら。 Windows95 ですら OSR2.1 以降のスペシャルバージョンが必要でした。
PCI アドレス空間の問題を解決したあと、待っていたのは CPU 計算資源の問題でした。
USB には割り込み転送モードやアイソクラナス転送モード、バルク転送モードがあります。
バルク転送モードは CPU を消費せずに大容量データを転送できるモードですが、それ以外では USB コントーラーの割り込みに対して CPU が高速に反応しなければ、HUD ではマウスカーソルが飛びますし Web カメラの映像は途切れてしまいます。
高速な CPU と優れたOS/ドライバがなくては USB のように CPU 食いのバスを快適に利用することはできません。USB3.0 が失敗例にならないことを祈っております。


焼きガニ、TCP/IP, Ethernet, ブロードバンドネットワーク


TCP/IP や Ethernet が失敗?いえいえそんなことは決してありません。
ただ TCP/IP がそれまでのネットワークプロトコルのなかで最も CPU 資源を食うということを知って欲しかっただけです。
TCP/IP は沢山のポートやソケットを使って並列的に通信を行い、アプリケーションの実装とも分離されているのでそれまでの PC のシングルタスク OS では実装が困難でした。
タイマ割り込みという方法で、擬似的に TSS (時分割スケジューリング)を行ってCPU資源を分散する実装もありました。(Waterloo TCP など)

そして Ethernet カードはコモディティ化に伴い、高価なハードウェアのバッファをケチるようになりました。
Ethernet カードに内蔵するバッファが小さいということはブロードバンドネットワークで大容量のデータを転送する際に頻繁に CPU に割り込む必要があるということです。
「バッファが一杯だから速くデータを拾ってくれ!」と CPU に言うわけですね。CPU が割り込みを受けてデータを拾ってくれるまで、 Ethernet は次のデータグラムを受信できません。
USB のときと同様、帯域を使いこなすにはリアルタイム性の高い処理をこなす必要があるのです。
かといってあまりにケチると Realtek のチップのように燃えてしまうこともあります。俗にいう焼きガニというやつです。

不出来なチップとドライバの組み合わせでは、一度に大容量データを転送するとシステムが死んでしまうこともありました。
当時の遅い CPU と OS の組み合わせでは、 100Base の LAN の帯域を使えないことがありました。
現在でも、不出来なルーターを使うとルータのCPUの処理が追いつかず、ネットワークのスループットを下げることがあります。それは仕方がないことで 1Gbps もの帯域を非力な組み込みプロセッサで処理し、ルーターやファイヤーウォールを実現するのは簡単なことではないのです。

ゲーム機


ゲーム!
まさにゲームというのセンシティブな入力のフィードバックのスピードが要求されるシステムの最たるものです。

ファミコンのコントローラが優れていたのは、ただのスイッチではなくマイコンを内蔵していたことでした。
いちいち本体まで信号を送らずとも、その場で処理していたからこそ細かい入力のニュアンスを伝えるだけのクロックを実現できたのです。
もしコントローラがスイッチを並べただけのデバイスだったら、本体までの長いケーブルを考えると高いクロックを供給できませんし、遅延や電圧降下の問題はプレイヤーに及んでいたことでしょう。
そうでなければカセットビジョンのように本体とコントローラをまとめるしかないのです。

最近ですと、例えば PS3 版と Xbox360 版のスト4とでは遅延が PS3 で大きいということは問題視されました。
さらに同じ PS3 であっても、発売直後と現在のハードウェアとではゲーム中に PS ボタンを押したときの快適さが大分異なります。
ゲームプラットフォームの世界ですと、ほんの1ms以下の違いがフレームをまたぐかまたがないかというところで体感可能な差に見えてしまうものなのです。
Rocksmith という実物ギターで遊ぶ音ゲーは、信号レベルの遅延を嫌って音声をアナログ出力することを推奨しています。

……というのはソフトウェアの話ばかりでなくハードウェアレベルでの応答性の話になってしまいましたが。
Xbox360 では kinnect といった入力システムを備え、ユーザーの体全体の動きをゲームに反映させることに成功しています。
PS2 では Eyetoy, PS3 では PSEye/Move といった入力システムもあります。
こうした入力デバイスはフィードバックの時間差の問題が関わりますから、 システムの消費する CPU 時間が大きくなってしまいがちです。そのためゲーム開発者からは支持を得難いという側面があります。
フィードバックはゲーミングの命であるからです。

かつて Windows CE を採用してしまった失敗ハードウェアというのが少数ながら存在します。 Gizmond, Dreamcast などです。
Pipin@ やマーティがどうだったかは知りませんが、池袋GIGOで料理の注文受付システムとして余生を過ごす Pipin@ を見た事があるので、きっと似たようなものだったのでしょう。
これまで見て来たように、リアルタイムシステムに求められるものは高速な割り込みアーキテクチャと、TCP/IP や USB のように CPU を浪費するコンポーネントが身の丈にあっていること(=コストがコントローラブルであること)です。
先進的な(CPUを食う)デバイスと、高速な処理は互いに矛盾する要求に見えますが——何も不可能を可能にしなければいけないわけではありません。
リアルタイムシステムは、アプリケーションに対して「〜この処理をするのに最悪xx秒かかるよ」ということを保証すればいいのです。
アプリケーションはそういうものだと思ってシステムを使用すればいいのですから。

そうしたものをざっくりオーバーヘッドと呼んでしまいましょう。
システムを利用するのにアプリケーションが犠牲にする実行時間のコストのことです。
WindowsCE を利用したゲーム機はこの高価なオーバーヘッドを支払う必要がありました。早い話が、遅い OS だったわけです。
幸い、 Dreamcast  は WindowsCE を使うか使わないかをゲームが選べました。なので本当に失敗したゲームはほんの僅かです。使ってしまったゲームはフレームレートや描画オブジェクトの数などに多大なペナルティを受けました。

誤解なきよう、 Linux や BSD, Windows など現存する OS の出来が悪いのではありません。
そうした OS は不出来なアプリケーションから他のプロセスやシステム自身を守るため特権モードを備え、アプリケーションが動作するユーザーモードとは異なる空間を保護しています。
ですので特権モードにスイッチするシステムコールで、オーバーヘッドが大きいのはどれも共通です。
重要なのはユーザー(アプリケーション)の要求に合っているかどうか、だけなのです。
だって今時、インターネットやLAN/Wi-Fi, Bluetooth, USB などはどのゲーム機でも対応必須じゃないですか。機能を削れないのなら仕方がないことです。

従ってゲーム機では時として、アプリケーションは OS の機能を OS を使わずに実現する、というようなことすら行います。
ゲームに限ったことではありませんけれど、ゲームでは特に重要度の高い OS の代替技術があるものです。例えばスレッドコンテキストスイッチングを減らす fiber, メモリの割当を自前で行う dlmalloc などはとても人気がありますね。

iPhone

最後に、失敗例ではありませんが、 iPhone についても言及しましょう。
iPhone はとてもゲーム機に似たシステムです。
個人的には iPhone のプログラミングなど真面目にやったことはないのですが、 WWDC で聞いた内容からして、ゲーム機そっくりのアーキテクチャです。少なくとも Android とは基本的な発想からして異なっています。
iPhone のスレッドスケジューラは Mach と同様 PC ライクでリアルタイム的ではないのですが、それ以外はとてもゲーム機に似ていると言えるでしょう。

iPhone3G 当時、システムのオーバーヘッドを軽くするためにマルチタスキングを廃し、60Hz のメインループを共有するアーキテクチャでした。
Jobs CEO は基調演説で、マルチタスクを行うとこうなってしまう、と WindowsCE の画面を見せました。
身の丈に合わないシステムは外すという思い切りはそんじょそこらのアーキテクトには到底真似できない決定でした。
iPhone はハードウェアを一本化して VM なしのネイティブコードですし、 Android とは正反対のアーキテクチャであります。
CoreAudio, CoreGraphics などの薄いレイヤを備えた応答性の高いシステム、 Cocoa はバグだらけの実装でしたが、まぁそれは未だに Android だってバグだらけです。

ともあれ、その実直なアーキテクチャが指に吸い付くような素敵なホーム画面(アイコン一覧)を提供してくれていたのです。
もっとも、 iPhone3G は CPU が遅い上、ネットワークもゴミ以下ときていたのでアイコンの一覧を華麗にスワイプする以外では何の意味もありませんでしたが……。
今僕が特に不満もなく Android を使えているのはあの頃の iPhone を触っていたからだと思います。
素晴らしいメニュー画面と劇遅のブラウザ、一週間遅れて届くメール、認証中に画面がブラックアウトする IMAP4……それらの対比が、いい感じの中庸を齎してくれた Android 端末の登場によって媒介されているのです。

ですがよい話ばかりではありません。
iPhone3G が日本で発売された直後、そのあまりにも遅い OSK (On Screen Keyboard) は問題になりました。
何やら色々あったと聞きますが——最終的に、ある方が泥を被って寝ないで修正したのだそうです。
悪い事に、 OSK が遅いとフィードバックが得られずに誤入力が増えるばかりか、他のアプリケーションをもブロッキングしてしまいます。
これは致命的でした。
それでも今尚 1GHz の snapdragon の Android と iPhone3G の改善版の OSK とを比べると(漢字変換精度はともかく)入力しやすさという点では圧倒的に iPhone のものが優れているとさえ思えます。

当時の iPhone3G を使っていた人なら、リアルタイムシステムの難しさというのを身に染みて体感できたと思います。

最適化に関するetc たかが17msされど17ms

個人的に尊敬するUEIの清水さんが書かれていた最適化話、これは enchantMOON に特化した話であると思うのですが、内容はさておき twitter での反応は「ほんと?」ってのをちらちら目にしました。


本日見たところ、清水さん自身が追記をなされていましたがちょっと雑感を書いておこうと思います。

パフォーマンスの最適化については目的別に二種類あって、遅い処理を高速化することと、遅くちゃいけない処理を速くすること、です。
前者は非常に解り易い話、一般に最適化といったらこちらです。
こちらの場合は、まずはプロファイラなどを用いて本当に遅い箇所を見付け、対処します。
殆どの場合は何万回も同じコードが使われる場所があって、これをボトルネックと呼びますが、そこを最適化すると全体のパフォーマンスが大幅に向上することも少なくありません。
パレートの法則に倣い、コード中の20%を改善すればパフォーマンスが80%改善するさえ言われているものです。

最適化の鉄の掟は二つあります。

ボトルネックから優先的に行うこと
遅そうだ、速そうだという感覚でやらないこと


つまり必ず前後で測定しましょうということ。
こちらのほうが速そうだと思って書き換えたらなぜか遅くなったーーこういうことはよくあるものです。
ですので、上に引用したようなツイートは指摘としては至極真っ当なものです。
その一方、(別に引用しませんが)「そんなのコンパイラに任せていい」など的外れなツイートもありました。

よくある勘違いとしては、「近年の最適化コンパイラの吐くコードは素晴らしく、アセンブリレベルでは人間の手が入る余地がない」というものです。
前半はとても正しい。
確かに近年の最適化コンパイラの吐くコードはとても素晴らしい。だからといって人間の手を入れる余地がないとは限りません。
コンパイラが古い命令セットしか知らない場合もありますし、そこまで極端な場合でなくともコンパイラの吐くコードを見て初めて問題に気付くということもあるものです。
コンパイラは仕様に反するコードは吐かないから、プログラマが完全に言語と処理系の仕様を知らないと最適化には足枷がつくものなのです。

(まぁそれもこれも"最適化"コンパイラの話。 JIT などのコンパイラはコンパイル時間そのものもパフォーマンス要求として考えられますので、最適化なんてものは殆ど行われないのです。少し前と比べりゃほんの少しマシになったかも知れませんが、今のところはまだ最適化というより「いくつかのケースでは最悪を避けられるようになった」と考えるべきです)

いくつか実例を交えて説明することもできますが——今回のエントリのメインはその一般的な最適化の話ではなく、後者の「遅くちゃいけない処理を速くすること」のほうなので脱線する前に話を戻しておきましょう。

まず「遅くちゃいけない処理」とはどういうことか?
これは例えば実時間に関連した処理のことです。

  • ユーザーのインプットを受けて、次の画面の更新までに処理を終える
  • 50ms以内にPCMサンプルを1000サンプル処理する
などは実際の時間に追いつくように処理をしなければいけません。
仮に十分とか、そういう時間の単位で見た場合は予想時間内に収まるとしても、ある瞬間を見た場合に追いつけなければ、ユーザーがイライラしたり、音が切れて不愉快なノイズがスピーカーから出たり、マウスのポインターがカクカクしたり、そういう処理のことです。
こういうのをまとめてリアルタイム処理といいます。
リアルタイム世界では「1秒あたり100回処理するということは、一分間で6000回処理できればいいのね」というのは正しくありません。仮に一分後に6000回処理できているとしても毎秒100回の処理が50回になったり150回になっては困るのです。
過ぎた時間は戻らない。統計のトリックでは誤摩化せない。それがリアルタイムの世界。

enchantMOON はユーザーの入力を決して取りこぼさないよう、優れた書き味のために最適化を施しているとされますので、文脈からいって件の記事はリアルタイム処理を前提としたものだと考えていいと思います。
リアルタイム処理をリアルタイムで処理できないということはどういう結果を齎すか、幸いというべきか皆さんが日頃から体感できることですので別のエントリであげつらうとしてここではリアルタイムの最適化とそうでない最適化では話が違うということを解ってもらえれば充分です。

最も強調したいのは、こういう遅延はプロファイラでは観測しにくいものだってことです。
だってユーザーの入力が一秒間に何万回もあるはずはありません。サウンドのデータが一秒間に何百万サンプルにも増えるというのは(今のところは)ありません。
普通にプロファイラをかけて発見できるようなのはもっと長い時間単位での支配的な処理ですので、 vector の操作だったり、 list のつなぎかえだったり、システムコールの呼び出しだったりするものです。
だからリアルタイムの最適化ではプログラマの勘と経験がモノをいうことも多々あるのです。
そうした事情を踏まえてこそ件の清水さんの記事は面白く読めるのであって、「こんなの意味あんの?」と思って読むのはズレていると思う。
(もちろん、そういう遅延を発見するためのプロファイラの使い方テクニックはあるのですけどもね)

清水さんの記事には追記があって、最適化前後のデータが数値で表されているわけですけども、どこで誰が試しても23msが6msになるというわけではないから、数値として意味があるわけではないでしょう。これはそういう前提に立てない人向けに信憑性を高める意味であって、そういう前提に立てない人がこの数値を見たところでやっぱり本質的なところは理解できず、「なるほど速くなったね。でもそれって意味あるの?」とか言う気がする。
リアルタイムの処理では23msと6msは雲泥の差です。支配的なボトルネックでないなら、全体が4倍になるということはあり得ないけど、それでもこの17msが惜しいということはあるんです。
僕も20ms以上かかっていた処理を6msまで最適化したことがあるけども、これがどれくらいの差かというと BBC Internet Blog の Anthony Rose の記事で言及されるくらい。

——「でもそんなの、CPU が速くなれば問題ないでしょう?」
7-8年くらい前なら僕もそれに同意できたかも知れません。
でも、ここ数年 CPU の進化は止まっています。CMOS の低電圧化が限界になり、プロセスルールも頭打ちするなかでクロックは上がらなくなっています。ここ三年ほどは特に顕著に出ています。おそらく次の三年も状況は大きく変わらないでしょう。

と、前提を踏まえたところでリアルタイム処理のための最適化に関する細かい技術の話はまた別のエントリで、と致しましょう。

以下余談です。
CPU のクロックが鈍化し、遂には殆ど止まってしまったような昨今ですが反対にソフトウェアは仮想化が進んで、ネイティブコード以外の配布形態も多くなりました。
Android は Dalvik VM をアプリのランタイムにしているし、enchantMOON なんて JavaScript の VM をミドルウェアに据えているわけです。
ハードはそれほど速くなってないのにソフトだけどんどん重くなっちゃったわけですね。
背後にはモバイルプロセッサの飛躍があるわけですが、バッテリーに技術革新がなければそれも頭打ちです。

ソフトウェアの生産性のためには VM が素晴らしいのですけども、そのソフトウェアの生産性ってやつがユーザーの要求にマッチしなくなれば結局廃れる運命にあるでしょう。
JavaScript でアプリが書けるんだぜぇ〜と山ほど生まれて来た有象無象の web アプリで生き残っているのってなんでしょうか?結局開発者と投資家が喜んで、ユーザーは喜んでないのではないかという疑念はここ数年ずっと晴れてません。
僕だってユーザーだが、PC をアップグレードする理由は自分の仕事を速く済ませるためであって開発者に楽させるためでは断じてあり得ないわけです。
そのユーザーが「 Facebook アプリはネイティブで(僕らのいうネイティブとは違うけど)提供しろ」と言ったわけで、この意味は大きいと思うのですが……。
Twitter は web に回帰しつつあるけど、成功するかは解らない。
ソフトの生産性重視、実行時パフォーマンスの度外視といったトレンドはもうそろそろ古い常識になるかも知れないなぁ、とここ数年は考えるのでした。