2025年3月20日木曜日

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

前回何とかAdvancedWorldWarを許容範囲で動かすことができるようになったが、しばらく動かしていると死ぬ問題が発生した。

カーネルログを見るとOOM-killerで殺されているように見える。

ps をwhileで回しながら動かしてみると、画面が切り替わるたびにメモリが増えていき減ることがない模様。そして限界を超えると殺される。 

メモリリークの可能性がある。が、どうやって調べるか。

valgrindは動かなかった。ld.soにデバッグ情報がないため。イメージ丸ごとビルドはできそうだが、現状途中で止まる。 

あとはmallocをフックするやつを作るか、探してくるか。それで調べたところによるとglibc mallocはいけてないらしい。もしかしたらjemallocを使えば解決するのかも。

うーん。めんどくさい。

jemallocクロスコンパイル

また何度かこけるかと思ったが、驚くほどすんなりとクロスコンパイルできた。

https://github.com/jemalloc/jemalloc/tree/master

からとってくる。

yabasanshiroのビルドのログから、 ツールチェーンの場所が分かるので、パスを通し

./configure --host=aarch64-rocknix-linux-gnueabi
make

 で完了。libにできたライブラリをコピーする。

RG353PS上で

LD_PRELOAD=/tmp/libjemalloc.so.2 ldd /tmp/yabasanshiro

で見ると、jemallocが使われそうな感じに見える。

とりあえずこれで実行してみたが、メモリリークっぽい現象は変わらなかった。残念。

起動してタイトル画面あたり。メモリ300MB?(メモリ使用率30%くらい)

root        3363  201 29.9 625348 299948 pts/0   Rl+  00:52   1:07
root        3363  202 30.0 629148 300548 pts/0   Rl+  00:52   1:10
root        3363  202 29.9 629148 300280 pts/0   Rl+  00:52   1:12
root        3363  203 29.9 629180 300376 pts/0   Rl+  00:52   1:14
root        3363  204 29.9 629180 300416 pts/0   Rl+  00:52   1:17

戦闘を何回か行ったとき。メモリ700MB?(メモリ使用率70%くらい)戦闘するごとに20Mくらい増えてそう。800MB超えるといつ殺されてもおかしくない感じになる。

OpenGLの何かを作りっぱなしなのではと思ったが、一応フリーはされてそう。

root        3363  222 66.0 1080976 662092 pts/0  Rl+  00:52   7:15
root        3363  222 66.1 1081588 662728 pts/0  Rl+  00:52   7:17
root        3363  222 67.7 1098036 678596 pts/0  Rl+  00:52   7:20
root        3363  222 68.4 1114484 685876 pts/0  Rl+  00:52   7:22
root        3363  222 69.3 1114612 694828 pts/0  Rl+  00:52   7:24
root        3363  222 69.3 1114996 694768 pts/0  Rl+  00:52   7:27
root        3363  222 69.3 1114996 694856 pts/0  Rl+  00:52   7:29
root        3363  222 69.3 1114996 694920 pts/0  Rl+  00:52   7:31
root        3363  222 69.3 1114996 695044 pts/0  Rl+  00:52   7:34
root        3363  222 69.3 1114996 694704 pts/0  Sl+  00:52   7:36
root        3363  222 69.3 1114996 694776 pts/0  Rl+  00:52   7:39
root        3363  222 69.6 1115252 697852 pts/0  Sl+  00:52   7:41

さて、どうするか。。。 →次回

2025年3月16日日曜日

中華linuxゲーム端末Anbernic 353PSでセガサターン

Anbernic 353PS

celesteが面白かったのでpico-8を携帯できないかと思って中華端末を買ったが、飽きてきたのでホコリをかぶっていたサターンのソフトを引っ張り出して動かしてみた。

端末に入っているのはyabasanshiroとかいうエミュレータで、libretro版とか言われるものと、standalone版が入っている。

yabasanshiro-lr (libretro版)

古の名作Advanced World War 千年帝国の興亡を動かしてみたが、地味にコマ送り気味で遅い。ちょっと使うには厳しい性能。右上の色が変なのも気になる。

 

グランディアも動いたが、戦闘がかなり遅くて厳しい。

yabasanshiro-sa (standalone版)

速度はまあまあ、何とか使えるくらいの速度が出ているが、結構致命的な問題がいくつかある。

Advanced World Warだと武器のリストが何にも見えないので使い物にならない。

グランディアだと戦闘画面で死んでしまう。

yabasanshiro-saの修正

yabasanshiro-lrが遅いので、もっと早い端末が出れば、、としばらく待っていたが出る気配がない。何とかしたいと思って試行錯誤。

ROCKNIXというカスタムファームウェアを入れてみたが、改善はされていないようだ。ただ、dockerで開発環境が準備されているので何とかビルドできそう。

イメージ全部はビルドできずに途中で止まってしまったが、とりあえずyabasanshiroのビルドはできるようだ。

PROJECT=Rockchip DEVICE=RK3566 ARCH=aarch64 ./scripts/build yabasanshiro-sa
PROJECT=Rockchip DEVICE=RK3566 ARCH=aarch64 ./scripts/build yabasanshiro-lr

グランディアが死ぬ問題

VIDOGLVdp1ReadFrameBufferがopenglのスレッドとは別のスレッドから呼ばれ、_Ygl->smallfboを別スレッドから作ろうとして死ぬ。最初に作っておけば死にはしないが、やはり別スレッドからフレームバッファアクセスできず、キャラが表示されない。

どうやらyabasanshiro-lrはOpenGL?でyabasanshiro-saはOpenGLES?で動いていて、サブセットであるGLESだとなんかこういうのがNGになるのかもしれない。

とりあえずフレームバッファをコピーするイベントを追加して、アクセスに来た時に、フレームバッファがコピーされてないならイベントを発行してyieldし、コピーされるのを待つようにした。

グランディアはこれである程度使えそう。

Advanced World Warが真っ黒になる問題

yabasanshiro-lrの方が移植の再現度が高いようなので、とりあえず影響ありそうなソースを片っ端からコピーして持ってくる。lr並みに遅くなるかと思ったが、たいして速度に影響はなかった。libretroが悪いか、OpenGLESが早いのかだと思われる。

セガサターンの中にはいくつか画面があり、問題となるのはNBG3の表示(SSFだと各画面のON/OFFができるのでそれで確認)だ。他の関数呼び出しを止めたりして確認していき、Vdp2DrawPatternPosの中でYglIsCachedに入っているかどうかが関係ありそうな気がしたが、デバッグ用にprintfしたら現象が出なくなるなど、ちょっとお手上げ。

とりあえずNBG3専用にVdp2DrawPatternPosNBG3を作って、cacheaddrをいじったりして、原因不明だが表示はされるという状態になった。他の端末で動かしたら表示されなかったりしそうだが、まあ自分しか使わないので良しとする。

Advanced World Warの背景が変な色になる問題

これは簡単に解決した。色情報にinfo.cor/cog/cobを足しているが、おそらく255を超えているため、色が変になる。Y_MINで255にリミットすれば大丈夫。

        r = Y_MIN(Y_MAX( ((dot & 0x1F) << 3) + info.cor, 0 ),255);
        g = Y_MIN(Y_MAX( (((dot & 0x3E0) >> 5) << 3) + info.cog , 0),255);
        b = Y_MIN(Y_MAX( (((dot & 0x7C00) >> 10) << 3) + info.cob, 0 ),255);

 

 

いい感じ?と思ったら音が途中からガタガタ言い始める。でも疲れたので終了。

追記:しばらく動かしていると死ぬようだ。変更前のものでも同じ。もとから何か問題があるようだ。メモリリークのせい?

2025年3月9日日曜日

セガサターンの仕様

 yabasanshiroのソース調べてたら物凄いサイトを見つけたのでメモ。どう見ても公式の情報なんだけど、なんだこれは?

 https://docs.exodusemulator.com/Archives/SSDDV25/segahtml/index.html

ダウンロードしたい

追記:見れなくなってる 。。。

2025年3月1日土曜日

firefoxが遅い気がする

昔はfirefoxを使ってて、拡張機能の更新?かなにかがあってそれまで使ってた拡張機能が使えなくなったのを機にchromeに移行した。

去年くらいまではchrome使ってたんだが、支払い画面にフィッシングのgoogleADを入れられてからchromeは一切使わないことにした。(金銭的には被害はなかったが、カード番号変えたりで超面倒臭かった)

ちょうどそのころfirefoxがandroidでも拡張機能を入れられるようになり、特別な事をしなくても広告ブロックが出来るようになった。こうなれば最早firefoxに戻らない理由はない。

今はありがたくfirefox+ublockで快適にスマホが使えている。消しても消しても出てくる広告の閉じるボタンをチマチマ狙わなくて良いのだ。

ただ、ページ読み込みの時にしばらくの間止まることが割とあってそこだけはストレス。ublockの処理が終わるまでネットワークを止めているみたいだ。

厳密なブロックのために先読みを止める設定をオフにすると気持ち早くなった気がするが、ublockの為なら我慢して使うしかないか。 スマホがボロいのが悪いのかもしれない。

追記

 アクセシビリティのフォントサイズを自動調整をオフにするとだいぶ快適になる

2025年2月26日水曜日

google検索

長年放置していたせいか、このブログがgoogle検索に一切引っ掛からなくなっているようだ。

大した事を書いてある訳でも無いんだけど、読む価値無しって扱いはひどくねー?フィッシング広告は出してくる癖によー。

まあgoogle直々のフィッシング広告に引っ掛かってからは検索はbing使ってるから別に良いんだけど。(ブラウザは当然firefoxに戻した。スマホでも広告ブロック出来て超快適。chromeとか言うフィッシングブラウザはアンインストール出来ないので無効化している。)

このブログも何処かへ移行しようかとも思ったが、そこまで手間をかける価値も無いのでこのまま放置する。

2025年2月24日月曜日

AwesomeMiner+zpoolでマイニングをやってみる

SBIの株主優待で仮想通貨をもらった。暗号資産の口座ができてしまったので、試しにマイニングをしてみようと思った。

メインで使用しているPCは9年前に買ったMSIのノートPC。一応GPUも乗っているゲーム用ノートPCだったが、windows 11も入らない、かなり時代遅れの代物。

こんなものでどうにかなるのか分からないが、まあとりあえずやってみた。まずNiceHashというのをやってみようとして無理だったので、AwesomeMinerというのをやってみた。

NiceHash

とりあえず検索して目に入ったNiceHashをやってみようとした。ユーザ登録してログインすると、身分証明書を送らされそうになる。

いったん保留して、まずアプリを入れてみる。どっちでもよさそうだが、とりあえず両方ダウンロードする。


firefoxが警告を出してきたが、検索すると、web経由でマイニングさせるツール?と誤検知?しているといったようなことだったので、一応信用して入れてみる。

ところが、実行してみたところ、GPUを認識していないようであった。ソースはgithub公開されているようだったので見てみようかと思ったが、たぶん以下のあたりで、この9年前のPCは対象外なんだろう。

Easy one-click GPU mining for NVIDIA GPUs using microarchitecture (compute capability) SM 5.3+.

 ということでNiceHashはあきらめた。身分証明書を送る前でよかった。

AwesomeMiner+zpool

次に調べたのはAwesomeMinerというもの。いろいろ試行錯誤したが、要は以下を設定しておけばよさそうだった。

インストールしてAdd Newminerで、Managed Profit Miner=>Profit ProfileでnVidia GPUを選ぶ。あとはとりあえずOKにしてFinish。

よくわかっていなかったが、どうやらマイニングをするプログラムとその結果をためておくところ?(pool)は別物のようだ。今どきは個人でマイニングしても太刀打ちできないので、みんなでpoolして、収益を分け合おうという事らしい。

このpoolにもいろいろ有り、どれに参加するかで利益が変わるということのようだ。とりあえずビットコインのアドレスがあれば使える(何の登録も必要なさそう)zpoolというのを使ってみることにした。zergpoolというのも同じやり方で使えるようだ。

OptionsのProfit Switchingでビットコインアドレスを入れておく。zpoolとかzergpoolはいろいろなアルゴリズムでマイニングした結果を、この入力したビットコインアドレスに換金してくれるという事だと思われる。

とりあえずstartしてみる

 

図はいろいろやった後だが、どう考えても電気代の方が高い。やればやるだけマイナスである。こんな時代遅れPCでやるほうが間違っていたという事だ。

マイニング結果はzpoolのwalletで、bitcoinアドレスを検索すると出てくる。

zpool以外にもいろいろ設定できるようだが、分散してしまうので、どれか一つに絞ったほうが良さそうだ。半日~1日くらい動かして、0.00000011BTC、Minimum payoutが0.00075000BTCとあるので、払い出せるほど溜まるまで3500~7000日くらいかかる計算だ。空き時間に小銭でも稼げたらと思ったが、どう考えてもやらないほうがいい。

調整内容

最初は一日0.2円とかだった。いろいろやって改善されてこれである。無意味だったが、一応何をやったか記録しておく。

やったのはベンチマークをとること。

Tools->Benchmarkで計算アルゴリズムの一覧が出てくる。(設定してあるpoolが対応しているもの?)

 

Currentの列がこのPCの計算能力だが、最初は入ってないか、一般的な値?が入れられていたりする。ここで一通り計算して結果を保存しておく。

マイニング中はProfit Switchingのところに、どのアルゴリズムをどういう基準で選んでいるか表示されるようだ。poolとアルゴリズムxPCの計算能力で最も収益が高いものが選ばれて計算されていると思われる。

 

benchmarkをやらずにstartした場合、この指標がなくて、このPCで計算できないアルゴリズムが選ばれたりしており、収益0.02円とかになっていた。(そういう時は計算を実行しているコンソールログにはやれGPUのメモリが足りないだのなんだのとエラーが出ており、まともに計算できてないようであった。)

一応benchmarkを一通り実行することで、計算できないものが選ばれなくなった。ただ、この結果、選ばれるのはCPUアルゴリズムばかりである。GPUが載っている意味なし。NiceHashに対象外されるのも道理だな。