うえぽんSW局

古いタイプの日記ブログです。気まぐれに更新してます。

2010年04月

月花霧幻譚_パケ


 実は最近まで「月花霧幻譚 TORICO」(セガサターン)というゲームがあるのを知りませんでした。
 おそらく、パッケージが地味、タイトルの漢字が読めない、という理由でスルーしてたのかもしれません。
 開発はメガCDの「夢見館の物語」と同じところで、作品のバックグラウンドはつながっているようです。蝶が出てきます。「夢見館の物語」の続編だと思っていいかもしれません。

 さてゲーム内容は簡単な脱出ゲームです。一回クリアしてしまうとゲーム要素はなくなってしまうので、なるべく攻略ページは見ないでクリアしましょう。
 映像はシネパックを使ったプリレンダリングです。今のゲーム機ならリアルタイムレンダリングになるでしょうね。
 評価すべきは街の中を足で移動する速度がスピーディーだということ。風になった感じで移動します。歩く速度までリアルにしてタラタラしたゲームが多いですが、これは見習った方がいいと思います。

 攻略としては、前の持ち主がマップに鉛筆で書き込みをしていたのでそのまま載せます。
 「火事」の「事」を漢字で書けなかったのを晒されるとは前の持ち主は思わなかったでしょうね。

月花霧幻譚_霧の街


 マップとしてはこっちの方が役立つかと思います。塔の数がいくつかすら分からないと結構混乱します。各塔の内装も似ていますが、よく見ると色が違います。

月花霧幻譚_月の街


月花霧幻譚 TORICO
セガ
1996-06-28



月花霧幻譚―TORICO 外伝 (ソフトバンクゲームノベルズ)
福井 健太
ソフトバンククリエイティブ
1996-10T



【余談】
 YouTubeで検索したらフランスの人が日本語版をプレイして紹介してた。
 最後サターン本体が暴走で終了してたのが心配です。
このエントリーをはてなブックマークに追加

「ナイトストライカー」で、


 以前どこかで入手した画像。
 おっさんの中でもシューターしか知らないだろう問題を5歳児に出題するあたりがナイスと思います。
 (これ以外の問題も難しいらしい)

[追記]
 メールをいただきました。クイズ問題はタイトー社内から公募したもののようです。一緒に画像も貰ったの連結してみました。「INSERT COIN」とある通りデパートの屋上なんかにあるアーケードゲームなんですね。
「ナイトストライカー」で、(追加
このエントリーをはてなブックマークに追加

 ネット検索してもメディアンフィルタ(中央値フィルタ)をSIMD(SSE2などのこと)で高速化しているのをあまり見かけないので作ってみました。
 AviUtl用のフィルタです。いつものところにアップしてあります。

 作った理由は、デジカメを最近買って、ごま塩ノイズを除去するのにはメディアンフィルタが一番だろうと思ったからです。

 さてメディアンフィルタは教科書に載っているような基本的なノイズ除去フィルタです。
 仕組みは注目点およびその周辺の8近傍もしくは4近傍をソートし中央値(メディアン)を求め、それを注目点に置き換えるという単純なものです。
 中央値は平均値と似たような値になるので系統としてはぼかし系のノイズ除去になります。平均値との違いは、極端な値(ごま塩ノイズなど)の影響を受けにくいことです。

【サンプル】
 デジカメは露光時間が長くなると白い点がぽつぽつ出てきます。下左の画像は8秒間露光撮影した画像の一部です。下右は分かりやすいように白い点に赤丸を付けました

メディアンフィルタ(ビフォー)メディアンフィルタ(ごま塩箇所)


 処理後は下のとおり。

メディアンフィルタ(アフター)


【分岐しないソート】
 ソートアルゴリズムには様々ありますが、条件分岐があると遅くなるので、分岐しないソートを使うことにしました。
 SSE2には2値を比べてmax(もしくはmin)を求める命令があるので、それを使って比較してスワップということします。組み込み関数を使うとこんな感じです。

#define MIN_MAX_SSE2( A, B ) \
{ \
 const __m128i max = _mm_max_epi16( A, B ); \
 const __m128i min = _mm_min_epi16( B, A ); \
 A = min; \
 B = max; \
}


 SSE2未対応CPU用にMMX版もあります。

#define MIN_MAX_MMX( A, B ) \
{ \
 const __m64 mask = _mm_cmpgt_pi16( A, B ); \
 const __m64 max = _mm_or_si64( _mm_andnot_si64( mask, B ), _mm_and_si64( mask, A ) ); \
 const __m64 min = _mm_or_si64( _mm_andnot_si64( mask, A ), _mm_and_si64( mask, B ) ); \
 A = min; \
 B = max; \
}


 さて、ソートするといっても中央値を求めれば充分なので完全にはソートしません。8近傍(注目点を含め9点)の場合、19回の比較で中央値は求まります。19回の順番はパズルゲームのようなものなので、答えは自分で考えてください。バブルソート風に比較した場合は28回ぐらいだと思います。

 [追記:2010/04/17]
 MMX版は以下のようにXORでやった方が速いようです。楓 software: x86 SIMD Technique アーカイブを参考にしました。

#define MIN_MAX_MMX( A, B ) \
{ \
 const __m64 t = _mm_and_si64( _mm_xor_si64( A, B ), _mm_cmpgt_pi16( A, B ) ); \
 A = _mm_xor_si64( t, A ); \
 B = _mm_xor_si64( t, B ); \
}


 SSE2版も同じように試してみましたが、これは_mm_max_epi*を使用した方が速かったです。もしかしたらCPUによるかもしれません。

【SIMD化】
 上を見れば分かりますが、副作用でSIMD化されてます。
 SSE2はshort型(16bit)を8個同時に計算できるので、平均比較回数は19/8 = 2.375回となります。

【マルチスレッド化】
 処理範囲を分割すれば容易にマルチスレッド化できます。しかもAviUtlにはマルチスレッド用の関数が用意されているので簡単です。
 こういうページも参考になるかと思います。
 並列アプリケーションを作ってみよう - SourceForge.JP Magazine

【高速メモリコピー】
 SIMD化や分岐しないソートで高速化しましたが、ここまでやるとメモリーコピーの速度に近くなります。もっと速くしようとすると高速メモリコピーと同じことをする必要があります。
 高速なメモリーコピーについてはアマレココの作者のこの雑記が参考になります。
 アマレココのサイト:過去雑記2009年12月〜2月
 プリフェッチはあまり効果が無いとあります。たしかにCPUにはハードウェアプリフェッチ機能があるので少し先をプリフェッチしただけでは効果はありません。もし効果を得たいのであればずっと先をプリフェッチする(1ライン先をL2にプリフェッチぐらいのことをする)必要があります。

【ベンチマーク】
 getclk_p.aufで測定。デジカメ用に作ったのでテスト素材はサイズが4000x3000の画像です。有効桁数は3桁。

メディアンフィルタのベンチマーク

 [追記:2010/04/17]
 MMX版をXORにしたところ以下のように速くなりました。

 MMX 4近傍:42.9 msec → 37.9 msec
 MMX 4近傍 輝度のみ:41.1 msec → 37.6 msec
 MMX 8近傍:123 msec → 104 msec
 MMX 8近傍 輝度のみ:77.5 msec → 61.0 msec


 SSE2で輝度のみの方が少し遅くなるのは、SIMD用に並び替えするコストの方が大きいからだと思います。
このエントリーをはてなブックマークに追加

 最近ブログを更新してないので、メモ帳に書き溜めていた脱出ゲームの攻略パターンを放出しようと思います。
 脱出ゲームとは、FLASHで作られているブラウザゲームに多いジャンルで、部屋や家に閉じ込められた状況から脱出するゲームです。

・ベッドやソファーの下に何かある。たまに暗くて見えないが、それは懐中電灯で。
・懐中電灯には電池が入ってない。電池は時計などから調達。
・ソファのクッションの隙間。
・家具の脇の隙間に何かある。
・家具を正面から見た視点は、両脇の死角に何か隠してる。
・ポスターの四隅はめくれる。
・本は一冊ずつクリック。
・額縁は外れる。隠し金庫を発見したり、額の裏に何かあったり。
・蓋付きの入れ物。入れ物の中より蓋が大事。
・箱の中のアイテム。もうアイテムは無いと油断させておいて上げ底。
・取得アイテムは調べると分解できることがある。何気ないアイテムほど調べるのを忘れがち。
・ドライバーやハンマー以外でも分解破壊を試みる。
・アイテムにアイテムを組み合わせる。
・たまに見上げられる。
・カーテンの開け閉めを何度も繰り返すと何か落ちてくる。
・暗号の数字、0,6,8,9で構成されるのは逆さにできる。
・扉を開けてすぐエンドとならないのは分岐がある。
・ANIMAL と 254316 が対応する暗号だった場合、2種類以上の解釈がある。
 (1)数字は文字列の○番目という意味。例では数列最初の2は文字列2番目(N)を指し、それが最初の文字になる。NAMIALが答え。
 (2)数字と文字は一対一で対応。数字は何番目に選ぶかを意味する。例では数字の1に当たる文字(2つめのA)が最初の文字。AAMINLが答え。
・文字列は右側から読む場合もある。
・メモ用紙は裏側も見たり、鉛筆で擦る。メモ帳なら続きがある。
・似たようなものが部屋に点在している場合は数を数える。
・「E」「N」「O」「P」と並びかえできるものがあったら、OPENと並べかえる。
・紙を炙ると字が出てくる
・窓ガラスが曇ると文字が浮かぶ
・同じ作者の作品なら同じ仕掛けやクセが多い。過去の作品を漁るのも攻略の鍵

 下は2ちゃんねるでみつけたコピペです。

鍵(笑)ドライバー(笑)歯車(笑)机の隙間(笑)U磁石(笑)
何か長いもの(笑)製氷器(笑)ノートパソコン(笑)南京錠(笑)
赤いボタン(笑)額縁の裏(笑)乾電池(笑)四つ折のメモ(笑)
ランプ(笑)ソファー(笑)クッション(笑)ハサミ(笑)
画鋲(笑)金庫(笑)スイッチ(笑)六角レンチ(笑)鏡(笑)
ボトル(笑)コップ(笑)蛇口(笑)カッターナイフ(笑)
懐中電灯(笑)金属のプレート(笑)暗証番号(笑)
カード(笑)写真立て(笑)ネジ(笑)バッテリー(笑)ケーブル(笑)
鉢植え(笑)学習机(笑)ポスター(笑)落書き(笑)
釣竿(笑)のこぎり(笑)洗浄剤(笑)ブロック(笑)風船(笑)
テレビ(笑)戸棚(笑)コイン(笑)リモコン(笑)カーテン(笑)
双眼鏡(笑)


【余談】
 空き巣が部屋の中を調べる場所と、脱出ゲームで調べる場所は大体同じ。
 脱出ゲームは空き巣対策になるかも?
このエントリーをはてなブックマークに追加

↑このページのトップヘ