ほんとにあった!呪いのプログラム

この記事はSYSKEN Advent Calendar 2016 8日目の記事です。

くだです。
今回はプログラムを作るときの注意点のようなものを話したいと思います。

【はじめに】

さて、私は以前こんなゲームを作って弥生祭で展示をしていました。
しかし、皆さんにプレイしてもらっているときにいくつかの不具合が発覚しました。

【不具合一覧】
1.音ゲーなのにたまにBGMが鳴らなくなり無音プレイする羽目になる
2.キー入力しても反応せずノーツが流れてくるのを見るだけのゲームになる
3.そもそもノーツが流れてこない
4.それどころかゲームが落ちる
5.さらにはWindowsが固まる

なんだこれはバグのオンパレードじゃないか。
これではさすがにまずいということで1日がかりでどうにか解決しました。

【恐怖の現象】

では、どうやって解決したかの説明する前にまずはこれを見て欲しい。

1

これはゲームを起動した直後の様子をタスクマネージャで確認したものです。
左からそれぞれ CPU使用率・メモリ使用量・ディスク使用率・ネットワーク使用率を表しています。
特にこれと言っておかしな点はないはずです。

次にこちら

2

1曲プレイし終わった状態ですが、勘のいい人はもう気づいているかもしれません。
続けます。

3

はい、2曲プレイし終わった状態がこちらとなっております。

まだまだプレイしようと思います。その結果がこちら

4

お分かりいただけただろうか。

このゲームは、1曲プレイするごとにメモリを馬鹿みたいに食いつぶしてしまう恐怖のプログラムなのだ..!

【原因】

なぜこのような恐ろしいことが起きたのか、それを探るために私はスパゲテイコードをどうにか解析しました。
その結果驚愕の事実が判明しました。それは、

プレイするときに読み込んだ曲データが, プレイし終わった後も破棄されていない

これはどういうことかというと, 曲Aをプレイするときには

	int LoadSoundMem( char *FileName ) ;

で曲データの読み込みを行っていたのですが、このとき読み込んだデータの初期化を忘れていた。ただそれだけです。
それだけではあるのですが、それが何曲も何曲も積み重なるとサムネのような恐ろしい事態を引き起こしてしまうのです。

【解決】

解決手段はとてもシンプルで、何曲かプレイするごとに一度メモリを

InitSoundMem() ;

でクリアするようにしました。
それからはゲームがプレイできないような不具合はなくなり、無事皆さんに遊んでもらうことができました。

【結論】

私から伝えたいことは一つだけです。

「今時メモリ管理とか特に意識しなくてもうまくいくやろー」と思っていてもソースの書き方一つでとんでもないバグプログラムが発生する可能性がある、ということです。

こんな長々とした文を読んでくださりありがとうございました。
では、明日のSYSKEN Advent Calendarもご期待ください。


コメントを残す

メールアドレスが公開されることはありません。