PythonによるNESエミュレータ開発4

image

パッド入力部分を書いたので、動くゲームも出てきました。といってもまだほとんどのゲームが動かないんですけど。画面は ブルジョアソフトウェア研究所 さんのTkShoot 1.00が動作している様子です。

さて、ここまできたので基本的にはこの企画も終了かなー、という感じがします。目的はPythonのパフォーマンスについて知ることだったので。

作成の過程でかなりPythonのパフォーマンス関連について勉強ができてよかったと思います。

速度

サウンドは作っていないので、それを除くと1frameだいたい0.4秒弱くらいで動きます(もちろんpsycoを導入して)。変にベタ書きしたりはしていません。わりとメソッドはちゃんと分割しています。ただ、LDA $ssss(absolute addressingのLDA)だけ、実行回数が多いので完全にベタ書きしました。

んで感じたのは

  • プリプロセッサでマクロを使えばそこそこ実用的な速度になりえるのではないか
  • bytecodehacks でインライン化すれば結構いけるんじゃないか。ただし、bytecodehacksがオブジェクトのメソッドには対応していないので、classを使わずに書くことになる。
  • 部分的にCで拡張モジュールを書けば、わりといけそう

ってことでしょうか。

まぁただ、JAVAとかC系全く分かりません><っていう人以外は、素直にC系かJAVAで書いたほうがいいと思います。

高速化のためにオブジェクトのプロパティをローカルにだしたり

1read = self.memory.read
2write = self.memory.write
3# .
4# .
5  for i in xrange(foo):
6    code = read(addr)
7    # .
8    # .
9    # .

するので、無駄に行数も増えますし、ぶっちゃけ読みにくいです。それでも普段使い慣れてるLLで書けるってのは大きな利点だとは思います。

10年くらいして、マシンがもっと速くなることに期待しましょう、ということで(笑

その他雑感

現時点でも単純なゲームくらいなら、そこそこ動くのでコンピューターの仕組みの基礎を学ぶには、もしかしたらLLでエミュレータってのはいいかも。当然ですけど、デバッグの段階ではアセンブリ言語を書くことになりますし、そのアセンブリ言語の内容も完全に自分で処理するわけですから、単に本で読むよりは格段CPUやメモリについて詳しくなれると思います。ただ、CPUの仕組みを勉強しながら書くのはきついものがあるかもしれませんが・・・

他の利点としては「俺エミュレータ書いたんだぜ」と自慢できる(笑)、自分の書いたエミュレータでゲームが動くと結構感動できる、というくらいでしょうか。


というわけで、とりあえず動くようになりました。今のところソースをアップする気はないです。(してもほとんどのゲームは動かないし意味無い)

確実にいないと思いますが、もし、「俺もLLでエミュレータ書いてみるんだぜ!だからお前のしょーもないソースも参考にしてやるから見せるんだぜ!ついでにエミュってどうやって作るのか教えるんだぜ!」というような方や「おめーソースがないのに信用できるか!」という方がおられましたら、この記事のコメント欄やはてブなんかのコメントに、「うp」とか書いてください。適当にソースまとめてうpして、それをネタに簡単なエミュの書き方でも記事にします(笑

まぁとにかく書いてて楽しかったです。チャレンジ精神旺盛な方、そして時間があまっている方は是非LLでエミュにチャレンジしてみてください。

#追記  アップしました。コチラの記事へドウゾ。

PythonによるNESエミュレータ開発5

comments powered by Disqus