• iPhone Xの動画プロファイルについて【解析中】

    2017-11-08 01:28
    皆様おひさしぶりです。
     iPhone Xを発売日当日【確保】し、翌日に買いに行った彼方です。
     
     iPhone Xに動画を突っ込んでみようと思いまして。しかしどこまで対応してるのか分からないという状況だったので、とりあえずさくっとプロファイル解析してみました。

     た、たぶん、まだ日本語でこの手の記事を書いている人は……少ないか、も?
    (少なくとも検索結果ではまだ何も出てこなかった)


    ■お前本当に高効率で録画してるの?

     iPhone Xではご存知HEVC(h.265)を採用してるのですが、ビットレートとかチャンクに関する情報はまだ見掛けないので、とりあえずまずはさくっと4Kで動画を撮影して、そのデータを確認してみました。

     あくまで参考です。参考。

     4K動画の撮影結果ですが、なんか微妙な結果に。
     まず、拡張子がh265でもhevcでもなく、MOVでした。長時間撮影すると変換される……というのはちょっと考えにくい。
     XMedia Recodeでの解析結果では、
    • MPEG-4 AVC/H.264
    • Profile: High
    • Level:5.1
    • FPS: 60
    • SAR: 16:9
    • DAR: 16:9
    • bitrate: 105574 kbps(約100Mbps!?)
    • (音声は)AAC(mp4a)-LC 91kbps 44100Hz 32bitモノラル
     何かおかしい。
     ということで、同じく1080pでもチェックしたが、やはりコーデックはMPEG-4 AVC/H.264でした。そんなばなな。

     念のため、MediaCoder x64でもチェック。
    • Format Type: Quicktime
    • Format: MPEG-4
    • bitrate: 111Mb/s
    • Video Format: AVC
    • Video Format Profile: High@L5.1
    • Codec ID: avc1
    • Color space:: YUV
    • Chroma subsampling: 4:2:0
    • Bitdepth: 8bit
     ちなみに、1080pの動画も同じようなデータでした。ということは、解析結果は間違っていないということか。わけがわからないよ。
    ※ちゃんとオチがあります。

    ■とりあえず同じ条件で動画を作成してみる

     録画データを確認しながら、とりあえず同じ条件でエンコードして、iPhone Xに食わせてみることにした。4Kの動画は手元にないが、1080pでテストすれば早いだろう。
     とりあえず、AVC/H.264 highプロファイル Level5.1で、手持ちにあったFHD(1080p)動画をエンコードして、iPhone Xに食わせてみる。転送にはiTunesを使わず、iFunBoxを利用。1080pなので、ビットレートは25Mbps程度にセット。フレームレートは元が24fpsだが、60に変換。アニメーションのフレームなので映像調整はアニメーションに。
     音声トラックは同じくAAC-LCにして、44100Hz ステレオ 128kbpsに。
     エンコーダーはXMedia Recodeを使用。

     そして問題発生。なんと転送できない。
    (仕方なく、iTunesで転送する)

     結果は・・・再生OK! まったく問題なし。そりゃそうだ。ごく標準的な設定なのだから。
    ※もちろん、オチが用意されています。

    ■面白くねーぞ!

     という怒号も聞こえてくるかもしれないので、変化球でやってみる。
     次は拡張子をh265にしてみる。
     形式はHEVC Raw Video、拡張子はh265に。
     ビデオコーデックはHEVC/H.265、フレームレートは同じく60に変換。ビットレートは噂によると半分くらいで良いらしいので、12.5Mbps程度。(2-Pass)
     で。H.265なんですが、プロファイルがいくつもある。とりあえずMainにしておいて、レベルは5.1 High tierに、プリセット標準、調整無効に。

     と、ここでおかしなことに気付く。音声トラックが無ぇ!

     よし、ここは困ったときのApple共通規格「MOV」だ!
     おほほほ、ちゃんとコーデックにHEVC/H.265があるじゃないか!
     あとは条件を整えて。音声トラックは同じく44100Hz 128Kbpsに。
     あとはコーデックなんだけど・・・Apple公式から引用すると

    対応するオーディオフォーマット:AAC-LC、HE-AAC、HE-AAC v2、保護されたAAC、MP3、Linear PCM、Apple Lossless、FLAC、Dolby Digital(AC-3)、Dolby Digital Plus(E-AC-3)、Audible(フォーマット2、3、4、Audible Enhanced Audio、AAX、AAX+)

     らしい。しかしエンコーダーの第一候補は「Fraunhofer FDK AAC
     うーん、なんだこれは。調べてみると、オープンソースライブラリとか出てきたな。どうやら品質は高いようだけど……音声比較ではないから、とりあえず、ここは同じでAAC-LCにしておこう。

     エンコード、かーらーのー、iTunes!
     といきたいところだが、ここで大問題。HEVCのエンコード速度が恐ろしく遅い。めっちゃ遅い。当方Intel Core-i7 4770を使っているが、毎秒8フレーム程度しかエンコードできない。ハードウエアでエンコード出来ないと、こんなに効率が違うものなのか……。
     設定を2-Passではなく1-Pass平均に切り替え。(ものぐさ)

     ざんねん! このファイルは再生できません!(なんでや)

     どうやら、MOVコンテナ内にH.265を格納できない……いやいや、そんな馬鹿な。Apple公式には

    対応するビデオフォーマット:HEVC、H.264、MPEG-4 Part 2、Motion JPEG

     ってちゃんと書かれている。ちゃんと最初に、HEVCって書かれてるよ。
    ※これも、ちゃんとオチがあります

    ■トラップ発動! 設定の落とし穴!

     ということで、ここでオチを発表。
     なんと、HEIFとかHEVCはパソコンに転送するとき、自動で変換されます!
     わーい! すっごーい!

     じゃねぇよ!

     設定>写真> メニュー内に「MACまたはPCに転送」って項目がある。
     そこで「自動」にチェックが入っていると、なんと自動でMP4とかJPEG(写真の場合)に変換されてしまうんですねぇ。
     ・・・いやまて、これ凄いんじゃね? だって、ファイル転送するときにハードウエアエンコードしながら、それをストリームとして出してるんでしょ。これ地味にとんでもない機能なんじゃないの?

     と、とにかく、これを「元のフォーマットのまま」で再転送してみましょう。
     そして開いてみるとー?
    • MOVコンテナ
    • コーデック:HEVC
    • プロファイル:Main
    • フレームレート:60fps
    • SAR/DAR:16:9
    • ビットレート:48151Kbps
    • カラーモード:YUV 4:2:0 Planar 12bpp
    • 音声:AAC-LC 91kbps 44100Hz 32bitモノラル

     はい、回答いただきましたー。ちなみにこれは4Kのファイルのほうですが、たいへん参考になりますね。この設定通りに作ってみましょう。変換がめっさ重いので、24fpsのままで作ってみます。(ただし、XMedia Recodeではビットレート設定がちょっと不安定なので、そこは様子を見ながら)
     で、ここでプロファイルはMainで作るようですが、プリセットが見えない。こっちはMediaCoderからデータを取得したところ、L5.1 Highだそうで。おそらく5.1 High tierだと思われます。
     ・・・あれ、さっきとだいたい仕様同じじゃね? まあ、とりあえず変換してiTunesに突っ込んでみましょう。

    「このiPhoneで再生できないため、コピーされませんでした」

     ……ぇー。
     ちゃんとコーデックもレベルもプロファイルも合わせてるのに、なんで再生できないの?

     ちなみに、iFunBoxからのアクセスも受け付けてくれません。
     コンピュータからファイル操作の要領でDCIMディレクトリにファイルを突っ込もうとしても、デリートやコピー(コンピュータへ)は出来てもiPhone Xへの転送は出来ない仕様。さて、どうしたものか。

    ■ファイル見れた!

     何時間も格闘して、いい加減に頭にきて強硬手段に打って出た。
     DropBoxなら問題なくファイルが見れるだろう!

     HEVC再生成功。

     どうやら再生できないファイルってのは嘘なのか、iTunes側でまだ許可していないのか。あるいはiOSのバージョンの問題なのか。とりあえずよく分からないけど、DropBoxにファイルを突っ込んでみたところ、まったく問題なく動画が再生された。ビットレートは20Mbpsくらいと、かなり高い設定だが、ネットワークの通信速度が普通にそれ以上なので問題なさそうだ。
     あとは、どうやって安定的にファイルを送り込めるか。反響があれば引き続き検証してみたいと思う。(先にiTunesのアップデートが来るかもね)

     ということで、おさらい。
     以下の設定にすればHEVCは再生できるようです。

    • MOVコンテナ
    • コーデック:HEVC
    • プロファイル:Main
    • レベル 5.1 High
    • フレームレート:any
    • SAR/DAR:(ファイルによる)
    • ビットレート:any(ファイルサイズによる)
    • カラーモード:YUV 4:2:0 Planar 12bpp
    • 音声:AAC-LC 44100Hz (モノラル/ステレオ・ビットレートは自由?)
     ただまあ、試してみた結果なんだけど、画質、いまいちな感じがするんだよねぇ。気のせいだろうか。
  • 広告
  • HTML5とFirefoxの動作について

    2017-04-22 07:362
    お久しぶりです。
     前回の「Flash Playerに見る様々な問題点」が、妙にアクセス数の多い記事になり、Google検索してみると関連キーワードで上位に表示されるように。

     どうしてこうなった。

     さて、2年ほどサボってしまって申し訳ない。私事で色々ありまして。
     今回は前回の続き、FlashPlayerではなく、HTML5についての話。といっても、相変わらず「千年戦争Aigis」絡みではありますが。これはこのゲームだけでなく、今後出てくるHTML5で動作する系のゲームやコンテンツすべてに対する話になるので、我慢せずに書くことになりました。
     千年戦争アイギスが、いつの間にかHTML5で動作するゲームになっていた。もしかして最初からだったのか? いやでも、FlashPlayerで動かしていたような記憶が。
    ■前置きのようなもの
     で。
     最近、千年戦争アイギスをプレイするのが億劫になってきた。理由は「1ステージクリアできるかどうか怪しいから」である。当方Firefox32bit版でプレイしているのだが、とにかく頻繁どころではないレベルでハングアップを起こしてゲームが停止する最悪、ブラウザを巻き込んでクラッシュしてしまう。
     いい加減、頭にきた私は懐石ツール誤字ではない。ネット黎明期を彷徨った勇者なら分かるな?)を走らせ、about:memoryで内部的な動作を見守ってテストした。
     結果から述べれば、これはHTML5で動作するゲームやアプリケーション(ニコニコ動画も例外にあらず)、バックグラウンドで動作するすべての処理に関する問題となることを突き止めた。ゲームの作りが悪いというわけではない。個人的意見を述べるなら、HTML5でよくもまあここまでやったもんだと素直に賞賛したい。
     が。開発環境が恵まれているからなのか、それとも動作試験してるのがGoogle Chromeだからなのか分からないが、あまりにもとんでもない状況になっているようなので、ここでちょっと情報を公開しようと思う。
     Windows7以降の64bit版OSかつ、FirefoxやInternet Explorerとかでゲームプレイしている人がいたら、ちょっと参考になるかもしれない。

     念のために述べておくが、コンテンツを見下したり、批判する意図はない。賞賛する意図もない。あくまで自分と似たような環境で困っている人のための書置きのようなものだ。この点留意して頂きたい。

    ■環境か、実装か、コンテンツか。

     今回のクラッシュ問題についてだが、前から挙動の怪しさについて指摘していた。
     FireFoxで起動しようとすると何も表示されない→プロファイルかキャッシュがブッ壊れていて、FireFoxをリフレッシュすると何事も無かったかのように動き出す
     ・・・とかね。ページやタブを開きすぎていた場合、「Out of memory」とか表示されて、こちらも動かなかったり。(e10s、つまりFireFoxの並列処理機能でメモリが無駄食いされていてゲーム側までメモリが回ってこない、なんてことも、しばしばあった)

     ここ最近、FireFox(32bit版、通常リリースのほう)でゲームを起動すると、ゲーム中にハングアップしたり、ブラウザを巻き込んでクラッシュしたりする頻度が劇的に増えた。ゲームにならない程に。で、先に書いたように、これはFireFoxに実装されている機能というより、実装そのもの、あるいはプラットフォーム依存の問題なのではないかと私は感じた。

    ここで、ちょっとコンピュータに詳しい人なら知っている「メモリの壁」「32bitと64bitの壁」について、ふつーの人でも分かりやすい程度におさらいしようと思う。

    オペレーティングシステムが32ビットの場合、
    ・32bitアプリケーションは2GB(実質1.7GB程度?)まで物理メモリを扱える
    ・64bitアプリケーションは動作しない
    ・オペレーティングシステム自体は4GBの物理メモリがあっても3GB少々までしか認識できない(Win8以降の32bit版の実装については詳しくないので割愛)

     という制約がある。語弊を恐れずに述べれば、ディスクを管理するファイルシステムにFATというものがあるが、あれがFAT12からFAT16、そしてFAT32になったり、exFATなんてのが出てきたのも、これ絡みの問題である。ようは、一度に処理できるデータ量の問題で、Windowsの場合は1バイト8bit(1オクテット)で、2バイト処理とか4バイト処理が「ひとつの」処理単位だった時の名残というか、つまり古い規格の問題だったわけだ。
     だから「理論上は4GBまで物理メモリを扱える」32bitのオペレーティングシステムでも、処理の都合上、あるいは実装の都合上、4GB目一杯までメモリを認識することができなかった、という話。

    オペレーティングシステムが64ビットの場合、
    ・32bitアプリケーションは3G少々(実質3.2GB~3.3GB程度?)まで物理メモリを扱える
    ・64bitアプリケーションは、物理メモリを全部使える
    ・オペレーティングシステム自体が扱えるメモリサイズは「エディション」(実装)によって異なる

     となる。同じ64bitのWindows7であっても、例えばWindows7 Home Premiumではメモリは16GBまでしか認識しない(例え32GB搭載していても超過分は無視される)、Professional以上だと192GBまで認識できる。余談となるが、確か現在発売されているWindowsの、最新かつ最高グレードのやつは、メモリが24TB(テラバイト)まで認識できるはずだが、まあそこは置いておく。
     共通認識というか、ここで注目すべき点は「64bitオペレーティングシステム上で動く32bitアプリケーションの扱える物理メモリ量が、32bitオペレーティングシステムで扱えた物理メモリ量とだいたい等しい」ことだ。

     そう、コンテンツより、実装より、環境がまず第一の壁なのだ。
    ■壁が見えない処理

     話を戻そう。FireFoxは通常リリースされているものは、32bit版である。コンピュータに物理メモリをたっぷり積んでいても、32bitアプリケーションなので3GBの壁が存在するのだ。

     最近のウェブコンテンツは昔と違って、リッチだ(データ量が多い)。ちょっと見栄えの良いサイトや動的コンテンツ、リアルタイム処理を要求されるようなところでは、データ通信量もそうだが、メモリを壊滅的に使う。利用者の環境が「最近の事情に合った どんぶり勘定」されて作られているのだ。まったく、困ったものだ。

     千年戦争アイギスとか御城プロジェクト:RE(だっけ?)なんかを動かすと分かるが、とにかくメモリを要求される。これでもか、これでもか、と。後者は確かFlashコンテンツだったと思うが、間違っていたら申し訳ない。
     まあ別にゲームに限った話ではないんだが、リッチなコンテンツは、とにかくメモリ要求が激しい。これはウェブブラウザで見るウェブサイトだけでなく、アプリケーションも同じなんだが。私の環境はWindows 7 Proで物理メモリは16GBほど積んであるが、こういう環境だととにかくメモリ問題に引っ掛かる。最近のコンテンツに合わせてアプリケーションを動かすと、メモリの壁にブチ当たってアプリケーションがクラッシュする。

     長い前置きになってしまったが、結局のところ、「壁が見えない(見えてない)処理」によって、利用者が不都合を被っている。
    ■解決策について
     FireFoxの場合、これを解決する手段はある。FireFox Developer Editionである。これは64bit構成されているFireFoxで、32bit環境では動かない(はず)。メモリの上限を気にすることなく使える。また、Flash Playerも64bit環境が既にリリースされている。リリースされたのは、かなり前の話だけど。これを使えば、上記のような問題はまず発生しない。使えるメモリの上限が、「許される限り、すべて」だからだ。最近のInternet Explorerもしくは後継のEdge?だっけ?は、恐らくOSのエディションに沿った実装がされていると思う。たぶん。

     注意すべきところは、コンテンツ制作側が、64bit側での動作を想定していないことが考えられる点。32bitブラウザ環境でテストしてリリースしてて、64bit側は確認していないよ、ということ。(逆も考えられる、64bitでチェックしてるから32bit環境では分からん、という場合。但し、単一のアプリケーションの場合はそもそも動作しない)
     ここらへんをちゃんと考慮したうえで、状況に応じてウェブブラウザを変更したり、アプリケーションやコンテンツを取り扱いたい。というか可能なら両環境でちゃんとテストして欲しいよね。

     勿論、どの環境においても、コンピュータの物理メモリは潤沢に欲しい。現在のウェブ環境下で、物理メモリが4GBに満たないコンピュータは、それだけで動作が厳しいと思う。お財布が痛いのは理解するが、貧弱な環境でリッチなコンテンツを楽しむのは無理があることも心得ておこう。

    ■HTML5についてそして何があったのか

     実は私はHTML5が大嫌いだ。設計思想が先進的なのは理解できるが、なんでもかんでも基本は1言語で処理してしまえ、といわんばかりのパワープレイ実装が大嫌いだ。
     おそらく、動的かつリッチコンテンツなFlashを駆逐する最強の対抗馬なのだろうが(恐らくと述べているがほぼ確実にそれっぽい)、それが利用者の環境をブッ壊すような代物になっているのがとにかく気に入らん。
     ビデオの再生サポート、描画を標準機能としておき(従来はユーザー環境依存)、それにJavaScriptやAjaxとか、そういうものを組み入れてダイナミックなウェブコンテンツが形成できる。まあこれは分かる。
     ただ、実装されている機能がデカ過ぎて、どうにもなってねーんじゃねぇの?と、私は考える。

     例えもへったくれも無く、「千年戦争アイギス」で例えよう。

     まず、ブラウザを起動する。落ち着いたら、ゲームプレイ画面を開く。タイトル画面が表示され、データを選択する。ここまでは別に良い。
     データを選択すると、コンポーネント(実際のゲームデータ)のダウンロードが始まる。ダウンロード量は150MB程度だ。これをダウンロードし、展開するだけでメモリは300MB近く使用される。

     FireFoxにはガベージコレクト機能(以下GC)が当然実装されていて、これは「使っていないメモリをいったん掃除する」機能なのだが、状況によってはロード・ダウンロード中にこれが起きる。GCがロード中に発生するのは、他のタブやページが起因することもあるので、正常な動作のうちには入るだろう。ただし、邪魔な割り込み処理が入って瞬間的に排除されるが、どっちにしてもゲームの動作には必要なので結局メモリは再確保される。

     ミッションを選択してゲームを開始すると、状況は一変する。キャラクターの会話で使用メモリが増え、ミッション開始で一気に使用メモリが増える。ユニットを配置してメモリが増え、ユニットを選択して瞬間的にフリーズし(裏でGCが働いている、そしてまたもメモリ再確保)、さらに固有能力があるユニットが混じると計算が複雑になるのかさらにメモリを要求される。
     これを執筆している現在の「緊急ミッション」は「オーク格闘家の王子軍入門」なのだが、これの最終ミッションは凄まじいことになっている。会話が終わってスタートした瞬間に、数十を超える敵ユニットが一気に配置、さらに自分たちのユニットを配置する状況。この段階でメモリを2GB要求された。自軍ユニットを3~4ほど置くと、さらにメモリのおかわりを要求され、ユニットのスキルを使用するとさらにさらにメモリのおかわりを要求される。
     ここでGCが働くと、「メモリのごみ掃除」「メモリの再確保」「メモリの追加要求」がほぼ同時に発生する。ただでさえ32bitの環境ではカツカツな状況、しかもGCしても効果がない状況(私は仮想メモリをゼロにしている)でこれをやられると、ハングアップが発生する。(メモリの追加要求をされても、もう1アプリケーションあたりのメモリの上限量まで使い切ってしまっている)
     こうなると、他のタブを開いても真っ白、再起動要求をしても応答しない。そして少しするとブラウザが動作限界を迎えて突然死する。
     おそらく「掃除中に瞬間的にメモリが空いた瞬間に追加要求されたうえ、再確保でまとめて持っていかれて、再確保も追加要求もどっちも出来なくなる手詰まり状態でロックされてしまった」という状況なんだと推測する。

     ちなみに、64bit版のFireFoxへ切り替えたところ、ちゃんとクリアできた。但し、メモリの要求量を確認したところ、ピークで4GB以上を要求されていた。これはアプリケーション全体ではなく、コンテンツを開いていない、落ち着いた状態のメモリ量を差し引いた量である。(アプリケーションの総使用メモリ量は5GBに迫る状況だった)

     これでは32bitアプリケーションのブラウザで動作するわけが無い。

     これはまず、(ゲーム)開発側のアプリケーション実装の問題がある。仕方が無い点もあるが、ユニットが増えてグラフィックが増えて、計算が増えて、とにかく常時処理とメモリが必要になるうえに、各種効果を使えば即座に計算を変更してグラフィックも変えなければいけない。破綻は目に見えている。かといって逐次処理(必要になった都度ダウンロードする)はオーバーヘッド(処理の無駄)の発生となるのでパフォーマンスの深刻な低下をもたらす(グラフィックなりをダウンロード完了するまで次の処理に進めない)。
     これらはトレードオフだから仕方が無いのは理解できる。が、それにしたってこれは異常だ。もうちょっと何とかならないものか。

     アプリケーション(ウェブブラウザ)側の処理の問題も大きい。私は仮想メモリを切ってコンピュータを動作させているが、ブラウザ側には「ディスクキャッシュ」機能がある。使っていないタブのデータを一時的にディスクへ収納したり、取り出したり出来る。やろうと思えばフォアグラウンド(或いはフォーカスされている、つまり現在実行中)のタブに対しても、ここらへんの処理は多少出来るはず。スクリプトから要求された通りにガンガンにメモリを明け渡してしまって良いのだろうか。また、メモリ不足でクラッシュする前に、まだ出来ることがあるのではないだろうか。(そうは言っても、1つのページで数ギガバイト単位のメモリを呼び出される処理のほうが異常なのかもしれないが)
     でも、このままでは、例えばウェブコンテンツとしてのエディタ(文章だろうがドロー[描画]系だろうがなんでも良い)やリアルタイムな通信を要求されるもの、生データをダウンロードしてブラウザ上で描画するもの(例:株価の長期チャートのようなグラフ)等、ウェブベース・クラウドベースなアプリケーションが今後増えるにあたって、こういう事態が頻発することになりかねない。

     結局のところ現状は、ユーザーが出来ることの有無、というより、ユーザーが「割と最新の環境にあること」を強いられている状態だ、と言わざるを得ない。
     開発者は余裕を持った環境でテストできるかもしれない。でも、ユーザーは開発者とは違う。マシンは自腹で購入するものなのだから。会社が用意する「理想のマシン」とは何もかも違う。

     まったく。環境の誤差を吸収したり、あるいは感じさせないために生まれたはずの規格が、ハードウエアやクライアントソフトウエアに振り回されるとは、何とも皮肉な話だな。



  • Flash Playerに見る様々な問題点

    2015-05-06 17:164
    2016年9月8日追記
     本記事は既に古くなっていますのでアテになりません。
     ・・・が、HTML5で動くアプリもFlashPlayerで動くアプリも、ここしばらく重いばかりですね。それなりに良い環境で動かしている筈なんですが・・・。
     ちなみにアイギスは、ぶらぶらネットサーフィンして戻ってくると「out of memory」のエラーが出て起動せず(ブラウザの再起動が必要)。Firefox Dev. Editionでは、いよいよフリーズして動かなくなった。厳密には動いているのだが、HTMl5のスクリプトの処理系統に問題があるようで、固まったと同時にCPUの使用率が1コアだけ100%になり、すぐに別のコアが100%になり、となり、コストを10貯めるのに1分以上かかる。どうやらプリフェッチに失敗しているか、スクリプトのパイプライン処理に問題があるか、あるいはセマフォ・ライブロックといったメモリアクセスか演算系で躓いている模様。32ビット版Firefoxだとフリーズしにくい、と追記しておく。
     ちなみに、ウェブブラウザが全体的にメモリリークの傾向が見られる。動的ページ、Ajaxなどのテクノロジは資源(リソース)をゴリゴリ削っていくのは逃れられない宿命のようだ。


    ……などと謳っているものの、実際はHTML5もCSSも、果てはGoogleのホームページからニコニコ動画まで含む、つまり似たような、あるいは似通った話である。アドビシステムズ株式会社さんに(そこまで)恨みはないものの※1、もっとも分かりやすい話であるので、あえてこのようなタイトルにさせて頂いた。
     途中にいろいろ挟んでいるものの、内容としては有用だと思うので(自画自賛)、気になる人はサッと読んで貰えると嬉しい。

     ちなみにDMM.comさんによる「千年戦争アイギス」をFirefoxでプレイ中にハングアップ・ブラウザクラッシュする人にとっては割と有用な問題かもしれない、と一応書いておく。それっぽい記事を探したものの、出てこなかったので。

     なぜかGoogle検索で上位に表示されるようになっちまったので色々と加筆訂正しています。
    【追記2015年12月9日 さらに12月18日 追記と訂正あり】

    ※1:Macromediaを買収した話を除く


     さてさて過激なタイトル(ニコニコ風に言うなら「煽っていくスタイル」か?)にしたのには理由がある。
     私は暇な時間にゲームを嗜んでいる。最近はDMM.comさんの「艦隊これくしょん -艦これ-」や「千年戦争アイギス」にハマっており、仕事にならない時(雨の日や深夜など)は、これらのゲームをプレイしている。
     事の発端は、その「千年戦争アイギス」から始まった。

    ■問題はメモリリークによるものなのか?
     ゲームをプレイしている最中に、突然ウェブブラウザが落ちたのだ。
     Firefoxの小窓(Firefoxは動作不良でダウンすると、自動的に起動するクラッシュリポーターウインドウがある)には、いわゆる「申し訳ありません」の文字が。最初はメモリリークによるものかと思ったのだが、どうも違う。再現性があるのだ。しかも完壁ではない再現性である。
     趣味プログラマとしては、こういう「微妙に再現性のあるような無いようなバグ」というのは気になって仕方がない。しかし千年戦争アイギスは時間単位で回復するシステム(それ以上の行動をするためには通称「結晶」を割らなければいけない。パズドラと似たようなシステムといえば分かるか?)を採用している。せっかく溜め込んだ結晶をパリンする前に、どこが原因でクラッシュしたのか、を探さねばならない。

     もちろん、このゲームに限らず過去に何度か「動作中に不安定になった」ということはあった。ニコニコ動画で動画再生中にフリーズしてFlashPlayerプラグインがまとめてハングアップしたり、普通にウェブブラウジングしていてフリーズすることがあった。
     そこで例外なく当てはまったのが「Adobe Flash Player」が動作していたことだったのだ。ご存知のとおり、ニコニコ動画では動画再生にFlash Playerを使っているし、最近ではウェブページの広告すらFlashで作られていて、しかも動画が再生される広告だったりする。(性質が悪いことに、Flash(or HTML5)+ムービーの広告はマジで重い)

    ■問題は、あるイベントから始まった。
     千年戦争アイギスを引き合いに出す(というよりサンプルとして提示する)理由として、過去のミッション(イベント)の中に、「ヴァンパイアの逆襲」もしくは「砂漠に眠る財宝」というものがあり、どうもこのあたりから顕著にゲームシステムが不安定になっていた。すでにイベントは終了しているものの、その前にあった「錬金術師と賢者の石」では特にひどい問題ではなかったのだ。(実際には「ドルイドの巫女姫」あたりから不安定さが少しずつ増していたのだが)
     スタンプカード新システムがこの頃に実装されるものの、実際にユーザーが操作するようなUIではないので除外。
     トラブルが起きるのが、もっぱらゲームプレイ中、しかもユーザーが操作するタイミング(ユニットを設置するタイミングや早送り中)であったので、メモリやCPUの使用状態を監視し続けた結果、まずは環境依存問題がひとつ目にあった。

    ■Audiodg.exeが、メモリを食い潰し始めた。→対応する
     Audiodg.exeはWindows搭載のオーディオ関連の「まとめ役」的なプログラムである。実行ファイルには「Windows オーディオデバイスグラフアイソレーション」と説明がある。Microsoftサポートには、このプログラムによるメモリリークに対応するためのパッチがある。
    私がダウンロードした時はベータだったが、今は正規の修正プログラムになったのだろうか。
     まぁとりあえず、このAudioDG.exeが、物理メモリを占有し始めたのだ。そして1GBほど食べると、突然何も仕事をしなくなる。つまり音が出なくなるのだ。
     千年戦争アイギスをプレイ中に注意深く使用状況を確認したところ、効果音(SE)やBGMの再生開始時にAudioDG.exeがメモリを食い、開放しないまま次の効果音が鳴り、そこでまたメモリを食い、を延々と繰り返していた。
     こりゃあいかん、とパッチをダウンロードしてインストールしてみたものの、効果なし。このAudioDG.exeは音楽を再生する時に(簡潔に申し上げれば)サウンドデバイス(あるいはデバイスドライバ)とWindowsをつなぐ橋渡しをしているようなもので、そうなるとサウンド関連のデバイスドライバ側からAudioDG.exeをコールする時(これ、もしかして順番逆?)に何か問題が起きていると判断した。
     で、サウンドカードのデバイスドライバにAudioDG.exeを使わせない(使わせないという表現が正しいかどうかはさておき)方法として、
     [Windows7 SP1では]コントロールパネルからサウンドを選択、現在使っているサウンドカード(オンボードだとSoundMAXやRealtekのデバイスが多い)のスピーカーを選択して、ウインドウ右下の「プロパティ」を押す。タブ一覧に「拡張」という項目があればそれを選択し、「すべてのサウンド効果をオフにする」をオンにして、OKボタンを押す。
     これで、AudioDG.exeにあれこれと仕事を押し付けなくなるので、AudioDG.exeの問題は片付くはずだ。実際に、私はこれ以降、AudioDG.exeによるメモリリークの問題からは開放された。

    ■ウェブブラウザが落ちる、メモリリーク?→対応する
    ※2015年12月現在、アップデートによってかなり改善されています。
     さて、AudioDG.exeさんを対応しても、まだ落ちる。最初はAudioDG.exeによるメモリ圧迫かとも思ったのだが(ブラウザがサウンド再生を伝えるが、Audiodg.exeがハングしていて巻き込まれたのだとばかり思っていた)、しかし私のマシンは物理メモリ16GB、スワップ(仮想メモリ)はゼロである。空き物理メモリは10GB以上残っているFirefoxのメモリ使用量は1GB程度(タブ30枚くらい開いているだけ)・・・これはおかしい。
     そこでウェブブラウザに目を向けてみた。Firefoxは通常x64(64bit環境)ユーザーにおいてもx86版、つまり32bit版が提供されている。しかし実は、Firefox Developer Editionというベータ版ながら64bit環境が提供されているのだ。こいつをインストールしてみる。
     32bit版の環境が残っているが、ツール>オプション>一般の中に、Firefoxと同時起動を許可するという項目があり、これをオフにするとFirefox Developer Editionで32bit版のFirefoxの中身を引き継ぐことができるようになる。(当然、32bit版Firefoxは一旦封印)
     実際に導入してみて分かったのは、[注:筆者の環境では]32bit版ではFirefoxが1.2GB以上のメモリを使用すると動作が極端に不安定になり、2GB近い物理メモリを使用しようとすると突然死する、ということだった。Firefox Developer Editionは現在過負荷テスト中だが、1.3GBを超える物理メモリ使用でもスイスイと動く。おそらく4GiBの制約(32bit版では4GiBまでしかメモリを確保できない)から開放されたことによるものだろう。

    ■残っているものはFlashPlayerだった。→対応する 無理なんとかなりそう
    ※FlashPlayerアップデートで結構トラブルは減ってきました。

     で、最後に思いつくのはFlash Playerだった。ただでさえ最近、冗談ではないようなアップデート頻度だったので、バグが発生しやすいとするならここしかないだろう、と。ちょうどここでスタミナとカリスマが回復したので、千年戦争アイギスを起動して、曜日ミッション「空からの贈物・極級」をプレイしてみた。
     ブロマガではたぶん画像の貼り付けができないのでテキスト起こしになるが、この数字を見ていただきたい。

    Firefox.exe (*32ではないので64bit動作)
    CPU使用率27%(我がマシンは Intel Core-i7 4770である)
    メモリ(プライベートワーキングセット):5,171,348K
    メモリ(コミットサイズ):6,424,740K

     FlashPlayerは執筆時最新、17 NPAPI版である。
     見て分かる通り、瞬間的にではあるが最大で6.4GBものメモリを要求して使っている。32bit版ではプラグインは実行ファイルとは別枠として動作しているようだが、ゲーム開始前のFirefoxのメモリ使用量は1.2GBしかない。千年戦争アイギスを起動すると400MB程度のメモリを使用するが、それでも差分は4.5GB近くはある。
     これでは32bitモードで動作しているアプリケーションはメモリが確保できずにダウンして当然である。しかも「早送り」(倍速)にすると、SEの再生タイミングも早くなるため、メモリをもっと一気に確保する必要が出てくる。
     これではクラッシュするのは当然である。
     32bit版Firefoxで何度か試して分かったことなのだが、等速では滅多に異常終了を起こさず、倍速にするとクラッシュする頻度が上がる(というかほとんどクラッシュする)。しかもこれは「モンスター出現時」に限って発生する傾向がある。64bit版ではまだテストしきっていないが、この分だとクラッシュする可能性が非常に高い。理由は、Flash Playerが64bitに対応していないからだ。※注:Adobe Labsでベータ版がダウンロード可能なようだが、アクセスしても通常版のFlash Playerのダウンロードページに飛ばされるだけ。仮に現在インストールされているAdobe Flash 17 NPAPIが64bitだったとしても、本当に64bit版なのか確認する手段が分からない。
     これでは問題は解決できない。
     というか、音を再生するのになんでメモリを4GBも瞬間的に消費するのか。謎である。しかも、SEを再生し始めるか再生が終わると、メモリが開放されて、一気に3GBくらいメモリ使用量が減少する。「艦隊これくしょん -艦これ-」ではこのような問題は発生しないので、おそらく「千年戦争アイギス」のほうに問題があると思われる。
     追記
     Firefox Developer Editionはともかく、Adobe Flash 20.x (x64対応)がダウンロード可能になり統合されました。わりと安定して動作しています。

    ■「公式」に問題を報告してみた。
     こんな辺鄙なブロマガで書いたところで見向きもされないだろうから、トラブルが発生し始めた頃に公式にメッセージを送ってみた。
    すると、こんな返事が戻ってきた。
    >メモリ不足かもしれないから不要なタブやウインドウは閉じてね
    >ページキャッシュサイズを1024MBに設定してね
    >タブの数を減らしてね
    >GoogleChromeにウェブブラウザを変更してね

     全滅である。
     メモリ不足話は先の通り、64bit版でガンガン使えるようになっているので問題ない
     キャッシュサイズは1024MBに設定してある
     タブの数を減らすといっても動作不安定になるような数ではない。
     GoogleChromeはユーザー情報をガンガン吸い取ろうとするトロイの木馬のようなものだと認識しているので一度たりとも触りたくない。(調べればすぐに出てくる情報)

    【追記2015年12月9日 追記】
     ここしばらく、どうやら64bit版でプレイできない様子。いろいろと試してみるが、どうも相性がよろしくないようだ。
     残念ながら32bit版でプレイするほか無い様子だ。
     メモリリークは結構解消されてきたようだが、しかしながら相変わらずメモリを食いまくるので、重くなってきたら再起動させるしかなさそうだ。
     また、Flash Playerのバージョンが20になったが、残念ながら動作は確認できず。

    【追記 2015年12月18日】
     本日、プレイ中にブラウザを再起動させてみたところ、突然スタート画面から動かなくなりました。またもFLASH Playerかと思いましたが原因はそれだけではないようです。
     動作を追いかけてみたところ、Firefoxに保存されているデータそのものにトラブルが起きやすい模様。これはキャッシュ削除を行っても改善しないところから、どうやらプロファイルデータのほうで問題が発生している模様。いまのところ推定されている条件は以下のとおり。

    1.たくさんのタブやページを開いていて、Flash Playerが頻繁に使われている。
    2.ブラウザがメモリをたくさん消費している。
    3.1と2が重なりデータの保存のタイミングで何らかの衝突が起きている

     てっとり早い方法が、こちら
    https://support.mozilla.org/ja/kb/refresh-firefox-reset-add-ons-and-settings
     Firefoxのリフレッシュである。プラグインは全部削除されるものの、Cookieやお気に入り、パスワードなどは引き継がれます。壊れかけのプロファイルは放棄する(厳密にいえば最新規格にあわせて作り直している)ので、トラブルが起きていていまいちよく原因が分からないというときには試してみると良い。
     レイアウトなどは初期化されてしまうが、かなりの不具合はこれで直りそうです。(実際に直りました)
    「メニューバー(ファイルとか編集といった画面上部のバー)どこ行った!?」という方は、Firefox表示中にAltキー(Windows)を押せば出てきます。

    ■本題-Flash Playerに見る様々な問題点
     昨今、ウェブページに情報を凝縮しよう、とか、高機能にしよう、という動きが激しい。
     ゲーム、広告、ポップアップ等々、回線高速化やブラウジング環境の高性能化にかこつけて、ウェブページをダイナミックページにしすぎている、と私は思う。
     このブロマガを購読している方はニコニコ動画の・・・確か「原宿」あたりのバージョンで、ページの表示が刷新された(激重化された)ことに反感を覚えたユーザーも居ると思う。また、GoogleのトップページにHTML5で施された変な機能(まるっきり検索の邪魔)、Ajaxを活用したサジェスト&リアルタイム検索、果ては検索結果ページでリンクをクリックすると、Googleのリダイレクトで白紙ページを挟んでリンク先に到達すること等々。情報を調べるためにWiki(Pediaのほうではない)を開けば、どこもかしこも広告まみれ。
     昨今のウェブページはダイナミックではあるものの、どうみても情報過多なうえ、開くだけでCPUが高温になる呪いのページと化している。しかもダイナミックなページにしたのは良いものの、ウェブサーバが大量のリクエストに応えるまでにタイムラグがあり、最悪、広告が読み込めないという理由でページの表示に時間が掛かるという超々ヘタレな状況に陥っている。
     FlashPlayerに至っては、ダウンロードしようとするとウイルスチェックソフト(但し駆除はしない?)まで押し付けようとする始末である。しかもバージョンアップ毎に機能追加と称して動作が緩慢になる始末である。
     各種フリーソフトにしてもそうだ。インストールするときに次へ、次へをそのままクリックすると、各種変なアプリも漏れなくてんこ盛りでインストールされる始末である。
     お前らいい加減にしろ。

    ■結局、どうすればいいのか。
     はっきり言えば、どうにもならない。
     恐らく、どのアプリケーションとかプラットフォームも、継接ぎで肥大化したソースコードや最新規格のコンピュータを基準にして作っているものが殆どだと思うので、利用者側でそれらを考えて、応急処置的な方法で解決するしかない。
     今回は分かりやすく千年戦争アイギスとAdobe Flash Playerを引き合いに出したものの、それ以外のアプリケーションや、それに付随するプラグインなんかも最近のものは結構ひどい。ハードウエアやオペレーティングシステムとの兼ね合いなんかもあるだろうから、各々が出来ることを少しずつやるしかない。

    ■まとめ
     バグの無いプログラムなんて存在しないけど、デファクトスタンダードになったから、とか、有名になったから、代替ソフト・コンテンツがないからって、ユーザーの声を「聞かなかったことにしてしまえ」「テンプレで返事しておけ」とするのは、業界の、あるいは会社の凋落を自ら引き起こしているのだよ、と、大きな声では言えないものの、主張しておきたい。
     
     iPhoneがFlash Playerを導入しないのも、MicrosoftがSilverlightを作ったのも、HTML5でWebGLやマルチメディア対応していることも、結局のところ、Adobeが圧倒的シェアで有頂天になっていたのが原因なのではないかな、と、私は常々思っているのだが、果たしてどうなんだろうね、これは。