【レポート】

JavaOne 2006 - PlayStationエミュレータをJavaで実装

    杉山貴章  [2006/05/20]

    PlayStationは、いわずと知れたソニーコンピュータエンターティメントの家庭向けゲーム機である。米サンフランシスコで16日(現地時間)より4日間にわたって開催された2006 JavaOne Conferenceにおいて、「Writing a PlayStation Emulator Using Java Technology」という興味深いタイトルのテクニカルセッションが行われた。スピーカーはGraham Sanderson氏とMatt Howitt氏。両氏はJavaプログラムでPayStationのエミュレータを実装することに成功したとのことである。

    Sony PlayStationはすでに一世代以上前のゲーム機であるとはいえ、非常に高性能なマシンであったことは間違いない。Javaを用いてそのエミュレータを実装するためには、Javaの性能を最大限まで引き出す必要がある。セッションでは、エミュレータを実装するにあたって用いたいくつかのテクニックが紹介された。これはハイパフォーマンスなJavaプログラムを作成するためのテクニックとして参考になるだろう。

    まず最初にSony PlayStation本体の大まかな性能が次のように紹介された。

    • 32bit RISC CPU @33.9MHz
    • Geometry co-processor
    • Graphics co-processor @33.9MHz
    • Decompression co-processor for video
    • 24 channel sound @44kHz

    今回エミュレータを実装するにあたっては、アーキテクチャの目標を次のように定めたという。

    • オブジェクト指向で実装する
    • すべてJavaで記述する

    技術的な話題に入る前に、両氏は実際に作成したエミュレータのデモを行いJavaプログラム上でPlayStationのソフトをいくつか動かして見せた。図.1はエミュレータを起動した直後の状態である。右下のプロンプトからコマンドで起動しており、画面には「PlayStation」の文字がお馴染みの音とともに表示された。図.2はゲームをプレイしているところ。非常に滑らかな動きだった。図.3はエミュレータを3つ同時に起動し、それぞれ別のソフトを実行した例。

    図.1

    図.2

    図.3

    続いて、高性能なゲーム機のエミュレーションを実現するために用いたいくつかのテクニックが、簡単なサンプルコードとともに紹介された。まず紹介されたのは、命令をデコードするためのハンドラ関数を命令毎に個別に用意したということである。これによって、各命令に対してそれぞれ最適化を行うことができる。

    次にコンパイラだが、コンパイラはR3000のコードユニットをJavaプログラムに変換する役割を持ち、2つのステージに分かれた構成になっているという。ひとつ目のステージはインタプリタから呼び出され、簡潔な変換を行う。ふたつ目のステージはもっと大きなメソッドで使用され、フロー分析などが行われるようになっている。セッションでは各ステージのコードユニットのサンプルコードなども示された。

    PlayStationエミュレータには、上記以外にも多数の興味深いテクニックが使用されているという。例えばオブジェクト指向での実装によりRAM上のR3000コードをオーバーライドできたり、コンパイラを独自に置き換えることなどが可能なことなどである。また、ビジーウェイトを防止する手段を駆使している点などについても触れた。

    両氏はセッションの中で次のように述べている。「PlayStationのエミュレータを作っても当然それ自身がビジネスになるわけではない。しかし、問題を解決するために習得した多くの技術が他の場面で活かされることになる」。

    最後に聴講者より、PlayStation 2のエミュレータも実装するのかという質問が出たが、その予定は全くないとのことである。

    関連サイト

    新着記事

    特設サイトの情報

      人気記事

      一覧

        イチオシ記事

        新着記事

        特別企画

        マイナビニュースマガジン