2025年3月25日火曜日

続3:中華linuxゲーム端末でセガサターン

前回に引き続き、yabasanshiroがメモリを消費しまくる原因を探している。

 _ZNSt10_HashtableIjSt4pairIKjiESaIS2_ENSt8__detail10_Select1stESt8equal_toIjESt4hashIjENS4_18_Mod_range_hashingENS4_20_Default_ranged_hashENS4_20_Prime_rehash_policyENS4_17_Hashtable_traitsILb0ELb0ELb1EEEEC4Ev
toolchain/aarch64-rocknix-linux-gnueabi/include/c++/14.2.0/bits/hashtable.h:539 (discriminator 2)
_ZN10DynarecSh210SetContextEP10SH2_struct
yabause/src/sh2_dynarec_devmiyax/DynarecSh2.h:320
SH2Reset
yabause/src/sh2core.c:180 (discriminator 1)
YabauseStopSlave
yabause/src/yabause.c:966
_Z11yabauseinitv
yabause/src/retro_arena/main.cpp:272
main
yabause/src/retro_arena/main.cpp:440 (discriminator 1) 

このあたりでメモリ消費が大きいという事で、ファイル名からしてダイナミックリコンパイルの処理の模様。

試しにインタプリタ方式で実行してみると嘘のようにメモリ消費量が下がった。変更するところは以下。src/retro_arena/main.cppのyabause_init()内、

yinit.sh2coretype = 0;

とすると、上の方で定義しているSH2Interpreterが選ばれる模様。ただ、これだとインタプリタなので遅い。 早く動かしたくてstandalone版を何とかしようとしているので、本末転倒になる。

次はこのダイナミックリコンパイルの処理を何とかしないといけないという事だ。

メモリリークの場所

探すのにだいぶ苦労したが、 DynarecSH2.cppのInit部分

void CompileBlocks::Init()
{
  dCode = (Block*)ALLOCATE(sizeof(Block)*NUMOFBLOCKS);
  memset((void*)dCode, 0, sizeof(Block)*NUMOFBLOCKS);

この関数は最初だけじゃなく、結構何回でも呼ばれる。そのたびにdCodeが新しく確保されていく。とりあえずNULLじゃなかったら確保しないようにすればメモリリークはなくなる。

最初はdCodeのサイズ自体が大きすぎるのかと思って削減用のコードを書いてしまった。半分くらいに減らしたところで、よく見たら16MB程度であり、何かのきっかけで20MB程度増えるという現象に合致する数字であることに気づくという失態。

本家のソースを見るとすでに対処済みのようだった。見当がついた時点でそっちを見ればよかった。

root        2897  227 26.1 1060784 262320 pts/0  Rl+  01:46  22:07  |           \_ /tmp/yabasanshiro -r 2 -i /storage/roms/saturn/AdvancedWorldWar.chd
root        2897  227 26.1 1060784 262360 pts/0  Rl+  01:46  22:09  |           \_ /tmp/yabasanshiro -r 2 -i /storage/roms/saturn/AdvancedWorldWar.chd
root        2897  227 27.1 1060784 271604 pts/0  Sl+  01:46  22:11  |           \_ /tmp/yabasanshiro -r 2 -i /storage/roms/saturn/AdvancedWorldWar.chd
root        2897  226 25.2 1050692 252664 pts/0  Sl+  01:46  22:12  |           \_ /tmp/yabasanshiro -r 2 -i /storage/roms/saturn/AdvancedWorldWar.chd
root        2897  226 25.0 1049160 251088 pts/0  Sl+  01:46  22:12  |           \_ /tmp/yabasanshiro -r 2 -i /storage/roms/saturn/AdvancedWorldWar.chd

 何回か戦闘してもメモリ250MBくらいに収まっている。仮想メモリは1GBくらい行っているので最悪それくらいまでは消費し得るのかもしれないが、今のところ大丈夫そう。おそらくは前回確認したcurrentQuadの部分だと思われるが、際限なく増えるわけではないのでとりあえず良し。

あとはGRANDIAのムービーが激重でコマ送りになっているのが何とかなればいいんだけど、これはちょっと見当つかないな。

 

0 件のコメント:

コメントを投稿