ページ 11

インタプリタを高速化したい

Posted: 2014年12月24日(水) 13:24
by taka
最近またエミュレータを作っているのですが、思うように速度が出なくて困っています。
エミュレータのほうは遅くなる要素がほとんど無いのですが、インタプリタのせいかあまりfpsが出ません。
インタプリタ本体は配列アクセスからswitch文に変えたのですがまだ遅いです。
それとcpu->r_pc(実行ポインタ)をフルで使おうとするとなぜか破壊されます。
どうにかなりませんか?

==やりたいこと==
1.エミュレータのほうで画像ずらし120fps
2.r_pc破壊の阻止
3.GPUのほうで透視投影とフィルポリゴン描画して10万ポリゴン/秒

アセンブラとリファレンスもつけておきます。

追記: インタプリタを高速化したい

Posted: 2014年12月24日(水) 13:51
by taka
インタプリタのv2とv1同梱で添付しておきます。

Re: インタプリタを高速化したい

Posted: 2014年12月24日(水) 14:33
by h2so5
Windows環境が手元にないので試せないのですが、まずどこがボトルネックになっているのかきちんとプロファイリングしてください。

もしVMの命令フェッチの分岐がボトルネックになっている場合にはこの記事が参考になると思います。
しかし、VisualStudioではGCCのようなgotoの拡張が使えないのでアセンブラで書くしかないかもしれません。
http://magazine.rubyist.net/?0008-YarvManiacs
taka さんが書きました: それとcpu->r_pc(実行ポインタ)をフルで使おうとするとなぜか破壊されます。
フルで使うという意味が分かりません。

Re: インタプリタを高速化したい

Posted: 2014年12月24日(水) 15:23
by taka
h2so5 さんが書きました:フルで使うという意味が分かりません。
については

コード:

UINT8 opcode = cpu->r_memory[(cpu->r_pc & (0x80000000 - 1)) + cpu->r_segs[0]];
とありますが、このcpu->r_pc & (0x80000000 - 1)をなくすとなぜかr_pcが破壊されます(0xccccccccになる)

Re: インタプリタを高速化したい

Posted: 2014年12月24日(水) 15:48
by h2so5
よく分からないのですが、単純にcpu->r_pcにどこかで不正な値が入っているということでは?