magicant / bve-plugin-multiplexer

"DetailManager" rewritten in Rust
The Unlicense
2 stars 0 forks source link

コントローラーが使用できない #1

Closed saha209 closed 1 year ago

saha209 commented 1 year ago

コントローラー用入力プラグインを制作/公開しているサハ209と申します。 http://saha209kame.web.fc2.com/index.html

当方で公開しているプラグインを適応の上、そちらのプラグインを使用した車両をプレイするとノッチの入力が反映されずプレイができないことを確認しております。 当方プラグインではC#で開発し負荷対策でThreadでBVE側に値を送信しているため、そちら側でノッチ取得の反映時期が取れずBVEソフトではノッチが動いているのに車両プラグインにはノッチが動かず車両動作しないのかなと仮説をたてております。

ぜひ調べていただけたらと思います。よろしくお願いいたします。

magicant commented 1 year ago

問題が起きているのは外部コントローラー用のプラグインでしょうか? bve-plugin-multiplexer は保安装置用のプラグインであり、コントローラー用プラグインに関係する処理は特に行っていないので、bve-plugin-multiplexer が直接問題を引き起こしているとはあまり考えにくいと思いました。

スレッド絡みの問題だとすると bve-plugin-multiplexer でスレッドローカル変数を使っているのが関係している可能性がなくはないですね。 スレッドローカル変数を使わないようにした bve-plugin-multiplexer をこの後 作ってみるので試してもらえますか?

magicant commented 1 year ago

@saha209 こちらでどうでしょうか pluginmultiplexer-ca3cac6.zip

saha209 commented 1 year ago

既存データの置き換えてみたところ、32/64どちらもそもそも起動せず(半分ほど読み込んだ後フリーズ)でした。

magicant commented 1 year ago

@saha209 だとすると、やっぱりそちらのプラグインでのスレッドの利用方法が何かまずいのだと思います。 TsmcInterface のサンプルコードを見てみましたが、onKeyDown や onLeverMoved は Tick の中から呼ぶ想定に見えます。 onKeyDown や onLeverMoved を別スレッドから呼んでいるとしたら bve-plugin-multiplexer の動作以前に BVE 本体が正常に動作しているかどうかすら怪しい可能性があります。

saha209 commented 1 year ago

いえ、そもそも頂いた版ではコントローラー外した状態であってもシナリオが起動しません

saha209 commented 1 year ago

条件を色々試したところ、 【前提】 BVE5.8.7554.391及び6.0.7554.619 どちらで試しても結果は同等です。

ntfiv様817系ver5.22 https://kty-bvememo.hatenablog.jp/

ntfiv\train\JRK_CT_V52\scenario\Vehicle_tiku_817-1000_2R_JQP.txt

このデータのpluginmultiplexer**.txtには以下のようにプラグインが指定されています ....\dll\Plugins\ntfiv\shock_lite_x86.dll ....\dll\Plugins\ntfiv\door_ptpt_x86.dll ....\dll\Plugins\ntfiv\EmrBrake_x86.dll ....\dll\Plugins\SoundKey\SoundKey.dll Onemanhoso.dll ....\dll\Plugins\CT\DK\x86\ATS-DK.dll ....\dll\Plugins\CT\Oneman\x86\JRQ_CT.dll

またコントローラーはZUIKI製のものを使用しています

【比較実験】 1.そのままシナリオを起動 →シナリオ読み込み段階でフリーズ 2.ひとつひとつ指定のプラグインを消して都度起動、またはそれぞれひとつのみプラグインの指定して都度起動 →いずれもシナリオ読み込み段階でフリーズ 3.pluginmultiplexer**.txt内に指定のプラグインをすべて消して起動 →シナリオ読み込み成功し、コントローラーも反映、動作

4.上記1-3を コントローラー及び入力PIのチェック 外して起動 →上記結果と同様、1と2はフリーズし3のみ正常起動

このことからいただいた版ではコントローラーの動作は正常化し、別プラグイン呼び出し部分で新たな問題が発生していると考えられます

magicant commented 1 year ago

2.ひとつひとつ指定のプラグインを消して都度起動、またはそれぞれひとつのみプラグインの指定して都度起動 →いずれもシナリオ読み込み段階でフリーズ 3.pluginmultiplexer**.txt内に指定のプラグインをすべて消して起動 →シナリオ読み込み成功し、コントローラーも反映、動作

pluginmultiplexer.txt に何もプラグインを指定しなければ正常動作するということであれば、pluginmultiplexer.txt に指定されているプラグインの動作が何らかの不具合の原因となっているのではないでしょうか。 bve-plugin-multiplexer を使わずに直接プラグインを読み込ませた場合の動作はどうですか

saha209 commented 1 year ago

直接プラグインをそれぞれ動かしても動作します。またrock_on氏のDetailManager.dllで同様の記述をしたものを使用しても起動します。bve-plugin-multiplexerを通じて指定した場面でのみ動作しません。

magicant commented 1 year ago

@saha209 こちらでどうでしょうか。スレッド起動時に不要な初期化処理をしていたのを消しました。 pluginmultiplexer-a1cd3ac1.zip

saha209 commented 1 year ago

遅くなりました。確認したところ正常にシナリオが開き、またコントローラー使用も想定通り反映されました。 ご対応感謝いたします。