Bercriber's Blog

プログラミング

2022/03/07 18:41


たなこふ先生のRustでGBE

Rustでゲームボーイエミュレーターを書いた

僕は最初、Rustで書こうとしたが所有権のあれこれをクリアできず挫折した。 メモリをRc<RefCell<Memory>とかでごまかそうとしたけど、さすがにあかんやろて思った。 Rc<RefCell<>>のオーバーヘッドがどれくらいなのか知らんけど、メモリアクセス毎にmemory.borrow()[addr];borrow_mut()[addr] += 1ではむりがあるよなぁと詰んでた。

struct MBC {
  ram: RefCell<Vec<u8>>
}

struct CPU {
  mbc: Rc<MBC>
}

struct PPU {
  mbc: Rc<MBC>
}

こんなかんじで、CPUとPPUからメモリにアクセスしたいと考えていたので構造体に組み込んでいたわけだけど、これじゃだめで


impl Gameboy {
  mbc: MBC;
  cpu: CPU;
  ppu: PPU;

  fn exec(&self) {
    self.cpu.exec(&mut self.mbc);
    self.ppu.exec(&mut self.mbc);
  }
}

こんなかんじになるのかもしれない。不要な時は無駄に引き回したりせずに、必要な時に必要な権限を与えてあげるということを徹底するといいのかもしれない。俺はこの程度のこともわからんかったんだな。。。結局Typescriptで書いたGBEは上側の構造体になっている。

たなこふ先生のCPUのマクロは狂気じみてるが、しこしこ手で書いていた僕も書きながらマクロでなんとかなりそうだなとか思いながらTS書いてたな。ここまでショートカットできるなんて思いもしなかったので怖い。