Skip navigation.

Error Log

最近電車ばっかり…

Ys SEVEN やりました

5連休全部使って。

仕事の今のプロジェクトが、9月はじめの時点で「連休休めるかどうかが不透明」という状態で、連休は何の計画も立ててませんでした。
いざ休めるとなったときに「Ys SEVEN は 2日あればクリアーできるだろうし、残り3日は気分でどっか日帰りでもしてこよう」というのを想定していました。

いざ、やってみたら、
  • 1日目: ダンジョンを4つくらいクリアするも、話がまだ全然進まない。
  • 2日目: これまでの Ys には全くなかった急展開、全然解決する気配なし。
  • 3日目: さらなる急展開、一気にラストが見えたけれど、ラスボスとおぼしき敵が倒せず。
  • 4日目: 3日目の反省を踏まえてリベンジしてラスボスを倒して、全クリア!
という感じで、約30時間費やしてしまうハメに。今までは10時間で十分だったのに…。

5日目は、ずっと特典の音楽CDやらドラマCDやらを聞いてました。前回の jdk バンドライブで披露された新曲は、当たり前のようにオープニングで利用され、特典の「Ys MUSIC HISTORY」の1トラック目に「INNOCENT PRIMEVAL BREAKER」という曲名で収録されていました。驚いたことにすでにボーカル版「Rush Out!」まで用意されてました。・・・ということは次の jdk バンドはこれを歌ってくれると(^^

ゲーム自体は「楽しい」の一言に尽きます。いい感じで先入観を砕いてくれると思います。
以前の Ys をやったことがあって、Ys SEVEN は見送ろうとしている人は是非。

ゲーム性とかストーリーとか音楽とか書き出すとものすごく長くなりそうなので。。。別エントリで書くかもです。

ComboBox のドロップダウンリストを表示するとメモリリーク… のつづきのつづき

,

だいぶ遅くなりましたが、ComboBox のドロップダウンリストを表示するとメモリリーク… のつづきのつづきです。

自分たちのビルド手順の問題で、パッチが当たっているはずの Flex のバグが治ってませんでした。というのが前回まで。Flex プロファイラで Flex モジュールのインスタンス数を追いかけても、ちゃんと解放されている様子。

でもって「何をもって、メモリリークが解消されたことの証明にするか」という議論になりました。SDK-18268 以外、自分達の書いたコードに解放漏れはありません、と断言できる資料が作れないとお客さんに説明出来ないよね、って話です。コミットチャージの推移? IE の Private Bytes の推移? Flex プロファイラが報告するメモリ使用量 or インスタンス数?

OS や IE のメモリ使用量はあまりあてにならないだろうと、Flex プロファイラの情報でやることに決まり、大測定大会が始まりました。

これが悪夢の始まり。

よくよく見ると、Flex プロファイラの情報が???だらけなんです。。
  • 現在表示している画面の Flex モジュールが、ライブオブジェクト・スナップショットに出てこない。2回目に 1 インスタンスできた、と報告される・・・
  • スナップショットのインスタンス数と、オブジェクト参照ビューに出てくるオブジェクト数が一致しない・・・。

そしてとどめが
「被参照数が 0 のインスタンスが残ってる、しかも大量」
というもの。

どうやら Flash Player は、いくら GC を動かしても、以下のような「不要オブジェクト」を解放しないことがあるようなのです。
  • Mark & Sweep でマークされなくなったオブジェクト
  • 被参照数が 0 になったオブジェクト
でもって、Flash Player が「メモリが足りない」と思ったときに、これら不要オブジェクトを解放するようなのです。GC って何?

そしてそのインスタンスが Flex プロファイラのメモリ使用量&インスタンス数に計上される、というのが悪夢。

Flex プロファイラは控えめに言っても動作が遅く、長期安定試験には向きません。(たまにスナップショット時刻が数時間前になり、オブジェクト数が解析不可能な状態になったり…) かといって数回の操作で計測すると、単調増加とは言えない増え方でインスタンス数が増えていき、メモリリークしているように見える、というオチ。

定期的に System.gc をして、直後にあるクラスインスタンスを new する… といったハック的なコードを書き加えながら、Flex プロファイラ上を数字を追いかけたところ、以下のような挙動をしていました。
  • シングルトンなどの長寿命なインスタンスと同時期に new したインスタンスは、解放されないみたい。(長寿命インスタンスとメモリブロックを共有した様子。メモリブロックの共有については Flex ヘルプに書いてあります)
  • 不要オブジェクトは System.gc() のときに解放されるものと、new のときに解放されるものとがあるみたい。
  • new のときに解放されるのは new しようとしているクラスの不要オブジェクトだけみたい。
  • 解放されない不要オブジェクトの個数は、該当クラスの new の回数と相関性があるみたい。(6 回目の new で 1 個残る、とか)
※ あくまで「僕の目にはそう見える」という話で、鵜呑みにしちゃだめです。Flex プロファイラの数字自体が怪しいし。

結局、Flex プロファイラの情報は使わないことに。業務を十数回繰り返して IE の Private Bytes の推移が安定していることを確認して、折れ線グラフにしてメモリリークの心配は無い、ということにしました。

Flash Player & Flex 開発は、自分の肌に合わないということだけはよくわかりました。メモリ管理と GC の全容が明らかになってないというのが一番いただけない(僕がドキュメントを見つけられてないだけかも知れませんけど)。こういうの、たとえ原因が非公開部分にあっても、「あんたプロでしょ、なんでそんなことも知らないの」って言われて責任をかぶることになるので。

ComboBox のドロップダウンリストを表示するとメモリリーク… のつづき

,

Flex の ComboBox のメモリリーク話のつづきです。

方式G なる人に SDK-19030 の話をして「肩の荷が下りたぁ」と思っていたところ、その人から

おまえんとこ、SDK-18268 のパッチ当たってないんじゃね??


という回答をもらいました。なんでも、
  • 方式Gの環境では、はじめは再現しなかった
  • もしやと思って SDK-18268 のパッチを外して再度試したら、再現した
ということらしい。

・・・
えええっ!!

自分たちのビルド手順を調べた結果、SDK-18268 のパッチ、あたってませんでした orz。

自分たち業務G は、方式G から「フレームワーク」として Flex ライブラリをもらい、その上で開発をしています。この開発スタイルにおいて「SDK-18268 のパッチをあてる」というのは、

  1. Flex SDK の lib ディレクトリに SDK_18268_PATCH2.swc を追加する。
  2. Flex プロジェクトのビルドパスに、フレームワークの「Flex ライブラリ プロジェクト」を追加する。
  3. フレームワークもろとも、Flex プロジェクトをビルドする。
というやり方か、

  1. デフォルトの Flex SDK を利用する。
  2. Flex プロジェクトに、方式G が配布しているフレームワークの .swc をコピーし、ビルドパスに加える。
  3. Flex プロジェクトをビルドする。
というやり方のいずれかの手順を指していたのでした。

  1. デフォルトの Flex SDK を利用する。
  2. Flex プロジェクトのビルドパスに、フレームワークの Flex ライブラリ「プロジェクト」を追加する。
  3. フレームワークもろとも、Flex プロジェクトをビルドする。
という手順では、SDK-18268 のパッチなんてあたる訳ない、というオチ。

方式G が配布しているフレームワークの .swc を使うようにビルド手順を直して、編集画面・確認画面の Flex モジュールのインスタンスが解放されることを確認。

SDK-19030 って、SDK-18268 と重複だったんですねぇ。。。
だから「Flex SDK 3.3 では解消されているから Close して」なんて会話がされていたんでしょうか。。

というのはおいといて、方式Gの人に「お騒がせしました。ごめんなさい」といって終了。
・・・しないんですねぇ、これが。

ComboBox のドロップダウンリストを表示するとメモリリーク…

,

17回、業務を繰り返すと Internet Explorer + Flash Player がハングアップする。
その時の OS 全体の空きメモリ使用容量がほぼ 0MB になる。


そんな申告を受けました。端から見ていると抱腹絶倒もの、自分自身のことになると人生を失った気分になる不具合、「メモリリーク」です。

手元の環境で試してみると、1回の業務(表示画面→編集画面→確認画面→完了画面)で、Internet Explorer のメモリ使用量が 40MB~50MB 増えてました。

編集画面・確認画面は、1つの Flex モジュールになっていて、ViewStack で画面を切り替えています。表示画面・完了画面はこれまた1つの Flex モジュールになっていて、完了画面は表示画面と同じで、上部に完了メッセージが表示されるだけが異なっています。

Flex プロファイラで見てみると、編集画面・確認画面の Flex モジュールが、完了画面に遷移した後でも解放されないという現象が起こっていました。業務を繰り返した分だけ、編集画面・確認画面の Flex モジュールのインスタンス数が単調増加…。

しかし、編集画面表示直後に画面上にある「前画面へ戻る」ボタンで表示画面に戻ると、編集画面・確認画面の Flex モジュールが解放されることを発見。解放される画面遷移から手順を1手ずつ変えていってメモリリークする手順を探っていくと、「ComboBox のドロップダウンリストを表示させた」段階でメモリリーク発見。

・・・
なんじゃそりゃぁー!!

「Flex ComboBox メモリリーク」でググって SDK-18268 を発見。SDK-18268 の方はパッチ適用済みだからそれとは別問題…。「Flex ComboBox memory leak」でググって SDK-19030 を発見。さらに、Flex SDK 3.3 でビルドし直して、メモリリークが発生する画面遷移を行い、メモリリークが解消されていることを確認。ここに達するまで1週間。

ということで、SDK-19030 が原因でしょう、と方式Gなる人に報告して終了。
・・・しませんでした。つづきはまた今度。

イース英伝jdkバンド夏祭り2009に行ってきました

,

今更感たっぷりですが、6/7 の夜の部に行ってきました。
5公演というだけあって、チケットにはかなり余裕があったみたいで、当日券で入った人もいたようです。

今回は PSP 版 Ys I・II の「Ys I&II Chronicles」と、これまた PSP 向けの「Ys SEVEN」の発売が迫ったいたので、演奏された 14曲中12曲が Ys シリーズから。しかも I・II がメイン。

はじめは「MIGHTY OBSTACLE」「Cry for me, cry for you」と、景気づけにボーカル2人の持ち歌を披露してくれた感じです。
ここからが鬼。
  • 3. TOWERS OF THE SHADOW OF DEATH
  • 4. REST IN PEACE・Endless History (MORNING GROW)
  • 5. Victoy!! (SEE YOU AGAIN)
  • 6. TOO MAKE THE END OF BATTLE
  • 7. OVERDRIVE
  • 8. TERMINATION
という曲順。ダームの塔を上って、イースの本が全冊そろって、達成感に浸って、イースに導かれて! ダレスを戦って!! ダームと戦う!!! って意図的にストーリー順に並べた!?

かなり盛り上がってきた(そして自分はヘトヘトになった)ところで、「Ys SEVEN」の新曲のバンドバージョンが2曲立て続けに。その後、「バレスタイン城」「GENESIS BEYOND THE BEGINNING」と今度は I・II 以外の名曲を立て続けに。最後は「RELEASE OF THE FAR WEST OCEAN」で I'm here for you ! って叫んでシメ。
アンコールは Ys SEVEN の新曲の再演奏と「銀の意志 金の翼」でした。個人的にはいい感じのクールダウンでした。

これまでの jdk バンドライブで一番盛り上がって、一番疲れて、一番満たされました。
過去の文明や英雄から力をもらって、この先どんな敵でも倒せそうな気分になったのですが、実際のところは翌日に理不尽なデカキャラに一発 KO 食らったようですが。。。

・・・

ところで、今回のライブはなんと「撮影OK!、アップOK!」という太っ腹なライブでした。あいにく僕は機材を持ち合わせてなかったし、持ってたとしても撮影どころではないのですが、ちゃんと撮影して YouTube にアップしていた人がいました。ということで特に聞いてほしい曲にリンク貼っておきます。(YouTube で「jdk バンド」で検索すると15曲全部見つかります)

June 2006
M T W T F S S
May 2006July 2006
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30