S-H-GAMELINKS / Novel.Game.Engine.LINKS

ノベルゲームエンジン「LINKS」
Other
13 stars 1 forks source link

feat: use KeyState class instead of CheckHitKey #28

Open yumetodo opened 7 years ago

yumetodo commented 7 years ago

基本方針

Issue

ref:

yumetodo commented 7 years ago

@S-H-GAMELINKS まだ怖くてデバッグできていないのでマージしないでください。多分大丈夫と思いたいですが・・・。

KeyState&と引数の型がなっている場合はキー操作との同期が発生するが、関数を抜けるまでにflushとupdateがされた状態で関数を抜ける

が実現できていない箇所がある可能性があり、その場合明確なバグです。何回もチェックはしているのですが、変更が多すぎて正直脳内がパンクしそうです。

yumetodo commented 7 years ago

ソースコード内のTODO:コメントにも書きましたが、多くの関数がKeyStateクラスを受け取る仕様になっているのはもともとの関数分けが下手くそだからで(viewとlogicが混ざっている)、そのせいで若干無駄にflushせざるを得ない部分も生じているのでキー操作が絡むものはもっと呼び出し階層が浅いほうに持っていきたいのですが、それをするとdiffが仕事しなくなるのと私の脳が破裂するのでひとまずPull Requestを出しました。

yumetodo commented 7 years ago

恐る恐るデバッグボタンを押したら・・・うーん、あーもーだめだー(AMD)。取り除いたらあかんsleep処理かflush処理を取り除いてしまっているなこれ・・・

S-H-GAMELINKS commented 7 years ago

一通りチェック致しました。

一回、マージして実機で動作させて修正していく方がいいかもしれませんね……。

yumetodo commented 7 years ago

KeyState::flush_streamの中の比較処理が意外と処理コストがかかっているのでSIMD化しないとだめですねこりゃ(それよりも管理人さんにお願いしてキー判定がなくなるまでwaitする関数をつくってもらうべきかもしれない、DxLib::GetHitKeyStateAllのコストも馬鹿にならない・・・)。

S-H-GAMELINKS commented 7 years ago

とりあえず、動作確認してみました。

キーが押されてる間、ずっと式が成立しているようですね……。かなりのスピードでカーソルが……

S-H-GAMELINKS commented 7 years ago

あー、処理コストかかってますか……。

お願いするのが、いいかもしれませんね

S-H-GAMELINKS commented 7 years ago

実際に動作させてる中で、以下の二点もわかりました

・クリック待ち処理がEnterキー二回押すことで終了している? ・セーブ/ロード時に「セーブ/ロードしました!」のメッセージ後にDebug Assertion Failedと出ている。

yumetodo commented 7 years ago

とりあえず管理人さんにはお願いしてきました

http://dxlib.o.oo7.jp/cgi/patiobbs/patio.cgi?mode=view&no=4158

S-H-GAMELINKS commented 7 years ago

ありがとうございます。

今のところ、先ほどの二点が確認されたのみで、そのほかは問題なく動作しているようです。

yumetodo commented 7 years ago

セーブ/ロード時に「セーブ/ロードしました!」のメッセージ後にDebug Assertion Failedと出ている。

手元では再現しないですね・・・。Debug Assertion Failedで再試行してやるとVSのデバッガに飛べるのでそれでまずどのアサートに引っかかっているのかがわからないと・・・

S-H-GAMELINKS commented 7 years ago

デバッガで見てみたところ stdthrow.cpp_CrtDbgBreak() で例外がスローされたようですが…。

S-H-GAMELINKS commented 7 years ago

debug

ちなみに、こちらが実際の画面です。

yumetodo commented 7 years ago

いや、コールスタック張ってくれないとなにもわからないですって・・・。そのDebug Assertion Failedのウィンドウで再試行を押してコールスタックの部分を見てください

S-H-GAMELINKS commented 7 years ago

callstack ……申し訳ない、こちらでよかったですかね…

yumetodo commented 7 years ago

@S-H-GAMELINKS それはmaster(04d7f9233c0708e385588dd100d84a6c6895d51c)では再現しないですか?そのへんはいじっていないはずなので・・・

S-H-GAMELINKS commented 7 years ago

試してみたんですが、再現しないです……

S-H-GAMELINKS commented 7 years ago

試しに、releaseでビルドしたもので動作確認したんですが、問題なく動作してますね……

string subscript out of range で調べてみるとこんなものが見つかりました。

もしや、こちらのデバッグ設定の問題かもしれません……。

yumetodo commented 7 years ago

試しに、releaseでビルドしたもので動作確認したんですが、問題なく動作してますね……

それは当たり前です。C++11からstd::stringが文字列を格納する領域の連続が保証されています。また、std::basic_string::data関数がある以上、std::stringが文字列を格納する領域はNULL文字終端します。つまりstd::basic_string::operator[]std::basic_string::sizeの結果を渡した場合、領域外アクセスですが、多くの実装では\0を返します。Debugでだめなのは領域外アクセスを検知するからですね。

つまりアサートが出る時点でCP==String[SP].size()となっています。

S-H-GAMELINKS commented 7 years ago

…はあ、そういう事だったんですか…

yumetodo commented 7 years ago

だから余計につらいです・・・うーむ。

yumetodo commented 7 years ago

いっそ範囲外アクセスはstd::basic_string:atを使って例外飛ばして補足して握りつぶしてしまおうか・・・

S-H-GAMELINKS commented 7 years ago

その手になりそうですよね…

yumetodo commented 7 years ago

しかしmasterで発現しないのは本当に不思議・・・

S-H-GAMELINKS commented 7 years ago

うーむ。debugで引っかかるわけですし、何らかの設定が変更された…?

いや、それならyumetodoさんの方でも同じ現象が確認されてるでしょうし…

わからんですね…

yumetodo commented 7 years ago

また別の現象発見・・・

マウスが有効の状態でタイトル画面にいると、マウスとキーボード両方で制御を取り合う・・・というよりキー操作が無効にならない・・・

S-H-GAMELINKS commented 7 years ago

マウス有効時のキー操作が無効にならない現象、こちらでも確認できました。

S-H-GAMELINKS commented 7 years ago

すみません、3.00のソースと見比べていて気付いたんですが、もしかしたらキー操作関連の関数に

if (ConfigData.mouse_key_move == 0)がないのが原因かもしれません……

yumetodo commented 7 years ago

@S-H-GAMELINKS でもなぜかmasterでは再現しないんですよね・・・ 対応策としてはご指摘のとおり、キー操作系関数でそれを見るようにすることですが。

S-H-GAMELINKS commented 7 years ago

……そのことなんですが、先ほどのPull request(#29)をマージ後に同様の現象がmasterでも発生しました……

……何なんでしょうかね、これ。

S-H-GAMELINKS commented 7 years ago

えー、それらしい箇所が判明しました。

ウインドウ風とサウンドノベル風の下記の部分がどうも影響していた模様です。

        if (SP != 0) {
            SP = SP - 1;
            CP = EOF;
        }

どうも、CP = EOFとわたっている部分がassertに引っかかってるのではないかと……。

yumetodo commented 7 years ago

反応遅れました。


あああ!リファクタリング初期に「なんでEOFが・・・?」と思っていましたが、すっかり忘れていました。

S-H-GAMELINKS commented 7 years ago

たぶん、ゲームメニューから戻る際に、実装した部分ですね、これ……。

確か、ゲームメニューから戻る際に最後に表示していた行を描画するためだったかと……

vectorで動的配列に変更した際に、この部分がassertに引っかかったんでしょうね……。

いや、申し訳ない……。

yumetodo commented 7 years ago

これEOF-1を想定していますよね?するとstd::vectorじゃなくてもそれをoperator[]に渡すのはUBなので仕様変更しないといけないですね・・・

またそもそもEOF-1とは規定されていないのでそもそもアウトですね。

S-H-GAMELINKS commented 7 years ago

対応策は一応、なんとか用意できました。

SP - 1
CP = EOF

この部分の SP - 1 を取り除いて、 CP = 0 のみに変更することで問題ないと思われます。

一応、手元のbranchでテストしてみましたが、問題なく動作するようです。

yumetodo commented 7 years ago

@S-H-GAMELINKS その手元のbranchをmasterに反映していただけますか?こっちにも取り込みたいので

S-H-GAMELINKS commented 7 years ago

https://github.com/S-H-GAMELINKS/Novel.Game.Engine.LINKS/commit/7481ca6fc6ae710b425fa1a8b7f60f4510cdaea8

こちらのコミットで修正してあります。よろしくお願い致します。

yumetodo commented 7 years ago

@S-H-GAMELINKS WINDOWNOVEL関数の方も修正が必要かと思っているんですがどうでしょうか・・・?

S-H-GAMELINKS commented 7 years ago

とりあえず、修正しておきました

S-H-GAMELINKS commented 7 years ago

あと、fmtのsub module バージョン上げておきましょうか?

ちょうど、4.0.0もリリースされているみたいですし

yumetodo commented 7 years ago

そうですね。Change log見る限り影響はなさそうですし、上げてコンパイルが通ればmaster反映お願いします。

yumetodo commented 7 years ago

@S-H-GAMELINKS とりあえずstd::string::operator[]のassertに引っかかる件は解決でいいですかね?

S-H-GAMELINKS commented 7 years ago

はい。これで解決できたと思います。

yumetodo commented 7 years ago

memo: 東方輝針城では1200msキー移動にラグ

S-H-GAMELINKS commented 7 years ago

キー操作の速さに関してなんですが、物の試しにKeyState::updateのreturnの前に std::this_thread::sleep_for(70ms); を追記してみたところ、キー操作の遅延に成功しました。

あとは、数値をうまく変更してやれば、キー操作の速さはうまくいくかもしれません。

yumetodo commented 7 years ago

やっぱりそういう方向の解決策ですよねぇ。ちょっとやってみます。

S-H-GAMELINKS commented 7 years ago

やはり、こういう方法になりそうですね…。

よろしくお願いします。

S-H-GAMELINKS commented 6 years ago

@yumetodo さん

お忙しいようでしたら、一回こちらでPRをマージしてキー操作の遅延処理を実装しましょうか?

yumetodo commented 6 years ago

あー、いや、完全にこれやるのを忘れていました・・・。 10/7までに終わるめどが立たなかったら再度書き込みます・・・

S-H-GAMELINKS commented 6 years ago

あ、いえ、大丈夫ですよ

承知しました。

あと、本当にお忙しくて難しいようでしたらおっしゃってください。 こちらで実装しますし