- 2009-03-31 (火) 22:08
- Java
自習室にサンプルゲームが遊べる「プレイルーム」を新設し、それに伴って『14歳からはじめるC言語オンラインゲームプログラミング教室』で作成した落ちものゲームをJava版に移植しました。ソースコードもいずれ公開する予定です。
C言語からJavaへの移植は、ざっくりとした感想をいえば「違いすぎて大変」の一言で終わってしまうのですが、いくつか感じたことをメモ代わりに書いておきます。
(1)やっぱりJavaのほうが重い
C言語と比べたら当たり前なのですが、まったく同じプログラムを作ってみて、改めてJavaの重さを感じました。Javaも昔に比べればかなり高速化されたと言われていますが、「音楽を鳴らしながら高速に画面を描き換える」というリアルタイムゲームの処理はやっぱり辛いようです。
CPUメータを見ながら実行してみると(注:テスト環境はCore2Duo 2.13GHz、メモリ3GB)、C言語のプログラムのグラフはつねに低め安定しているのに対し、Java版ではグラフが激しく上下しています。高いときはおそらくガーベージコレクションをしているのでしょう。
| C言語版 | Java版 |
そこで、なるべくインスタンスの作成・廃棄をしないようにしたのですが、どうしてもmp3の再生処理でかなり高い負荷がかかってしまうため、サウンドはすべて無圧縮のwavファイルに切り替えて、javax.soundで再生しました(注:上のグラフはwav切り替え後のものです)。正直いえば、今時mp3ぐらいサクッと再生してほしいものですが……。
いずれ暇を見てActionScript(Flash)版にも移植するので、その結果が楽しみです。前に調べたときはかなり低負荷だった記憶があります。
(2)変数間の代入に注意
これも常識の範疇ですが、C言語の構造体変数間の代入を考えなしにJavaのインスタンス変数に置き換えると、コピーされずに同じインスタンスを参照することになってしまいます。複製用のcloneメソッドを用意するか、メンバを1つずつコピーしてやらないといけません。コンパイルエラーにならないので場所を探すのが少し面倒でした。
(3)ロビーフォームの呼び出し
このゲームでは、タイトル画面で「対戦」ボタンを押すと「ロビーフォーム」が表示される仕様です。そこで、MouseAdapterクラスのサブクラスにmouseClickedメソッドを書いてそこで表示処理を……とやると、ロビーフォーム内のSwingコンポーネントが描画されません。
Swingのイベント処理・描画処理は「イベントディスパッチスレッド」という単一のスレッドで処理されているので、イベントで呼び出されたメソッド内で時間がかかる処理をやろうとすると、Swingが固まってしまうのです。この状況を解決するために、SwingUtilityやSwingWorkerなどのクラスが用意されています(今回はそれらを使わずに処理してしまっていますが)。
- Newer: [ActionScript]Flashの不思議な軽さ
- Older: [PHP]20MB以上のファイルのダウンロードが失敗する
Comments:0
Trackbacks:1
- Trackback URL for this entry
- http://i-libro.net/wpmu/blog/archives/339/trackback
- Listed below are links to weblogs that reference
- C言語からJavaへの移植 from わくわくプログラミング自習室 Blogs
- pingback from わくわくプログラミング自習室 Blogs - [ActionScript]Flashの不思議な軽さ 09-04-07 (火) 0:00
-
[...] Older [...]
