SlimDXからSharpDXへの移行
最新のSharpDX(3.0.x)への移行は大変だと判明。古い機能がことごとくさようなら。
SharpDXのリリメモはこれなんですが、 https://github.com/sharpdx/SharpDX/releases/tag/v3.0.0
など。というわけで、まずは2.6系への移行を試してみます。3.0系への移行は追々。
2.6系への移行も、とてもとても面倒だと分かりました。必要に迫られない限り、私は対応しないことにします・・・。
お疲れ様です。 私がソース見て涙したのもそのあたりです。orz
実は、SST のほうで SharpDX 3.0.2 ベースの FDK がもう完成して動いてます。(プロジェクトのオリリポには入れてませんが)
で、DTXもそれで再構築できんかなーと思ってみたのですが。
無理でした。
サウンドが WASAPI のみの対応になるなど DTXMania との互換性もいろいろぶったぎることになりますしね。
# いやまあ 互換性を重視するならSSTなんて別ブランドを作ったりしませんでしたが。(汗
とりあえずできたっぽいので、チケット担当いただきます。
feature ブランチとして push しました。しばし様子をみてから develop にマージしたいなと。
どなたか Windows7 での動作チェックお願いします(汗
あと、Visual Studio 2017 Community でビルドしてます。
マジお疲れ様です。
私はちょっと今は外に出ていますので、私のところでの動作確認は明日以降でやりますね。
ちなみにfromさんの動作確認環境はどんな感じでしょうか。osはwin10 creators updateの64bit版辺り?
私、Windows7の環境ですのでfeature/#36529を取得して一通り動作させてみました。DTXManiaは問題なく動作しております。安定しております。DTXCreatorは、DTXManiaGRでViwerを開こうとしたときに「System.NullReferenceException: オブジェクト参照がオブジェクトインスタンスに設定されていません。・・」というエラーメッセージで終了してしまいます。
私は Win10 Pro CreatorsUpdate の x64 ですよー。
で、koh-heyさん報告ありがとうございます。Null例外が発生する不具合を修正して、またfeatureにpushしました。
Windows7 64bitで動作確認しました。
気になった点
-DirectSoundが使えない。下記ツイートにエラー時の写真貼ってます(今回の検証ではASIO4ALLを使用しました。WASAPIはRel105以降から使用できず。何故だ?)
https://twitter.com/kairera0467/status/860812179250978816
-DirectInputのキーボード入力で、実際に入力したキーとDTXManiaで認識されるキーが一致しない。
とりあえずキーボードでの演奏とオートで確認を行いましたが1曲しか流していないので、明日電子ドラムで何曲か演奏したいと思います。
kairera0467さん報告どもですー。
DirectSound についてはこちらでも再現しましたので、それらしき箇所を修正しました。
WASAPI も、rel.105 で BASS_Init() が移動された際に変数の内容が変わってましたので、それを修正してみました。
あと、現在進行中なので、このチケットの優先度を上げときました。
# ひとつのチケットで既存の修正も入っていく…… けっこう大きく変更するチケットだからいいですよね(汗
キーボードの不一致については、SlimDX.DirectInput.Key と SharpDX.DirectInputKey がぜんぜん違う配列になっているせいでした。(涙
dinput.hのDIK_xxに沿った正式な配列は、SharpDX のほうになります。
で、
Config.xml に記載のキー番号が SlimDX か SharpDX を判別する仕組みがない以上、SharpDX 版に移行するにあたって もう一度キーアサインしなおしてもらう のが手っ取り早いと思うのですがいかがでしょう。
とりあえず、表示とConfig.xmlの初期状態が SlimDX 配置になってるので、これらは SharpDX 配置(DIK配置)に修正しておきます。
自宅に戻りました。ものすごく簡単ですが、動作確認しました。(Win10 64bit Creators Update)
自分でもソースを見ますが以下取り急ぎ。
その1。某様のBGAがちゃんと再生できているとのことでしたので、さっそくおばたけを再生してみましたが・・・ちょっとデグってました。
ま た お ば た け か
具体的には、DEEPEST REDの、21-22小節の、背景がワイプで入ってくるところで、背景がなぜかプルプル震えています。座標系がSlimDXとSharpDXとで違うのだろうか・・
(注: 本体のFullHD化でBGAを拡大表示したことに伴って表示にノイズが入る点は従来同様なのでここでは無視)
アーカイブが見当たらないようでしたらこちらから: http の、 27.120.112.19 の、 DTXFiles.OVERTAKE.7z 。
その2。なぜかギターのInputAdjustが0でなく1になってます・・・が、以前からそうだったかは未確認。環境問題かどうかも未確認。
その3。一時的とはいえ、キー設定が全部飛ぶのはとてもつらいです。なので、108以前から109以降にアップグレードするときには設定値を自動変換するようなロジックを入れておくつもりです。
その4。コミッタがfさんだったりkさんだったりしましたがスルー。
おっと、もう一つ。
その5。ウインドウ内にマウスカーソルを入れて静止させると約2秒でマウスカーソルが消えるはずが、消えない。
動作確認どもですー。
とりいそぎ、ご回答まで。
その1
再現しました。 いったい何度われわれの前に立ちはだかってくるのかおばたけだむす。
その2
再現できず。新規に出力させたやつでは 0 でしたよ。
その3
せっかく自動変換ロジックを入れるなら、DIKtoKey() を復活させて、内部ではSlimDX配列のままにするのがいいですね。
その4
Git設定はグローバルがkさんでローカルがfさんのところ、リポジトリを再クローンしたらグローバルに戻ってしまいました orz
その5
再現できず。うちでは、2秒たったらカーソルは正しく非表示になりました。
その6(え
.gitignore への追加ですが、Python Tools の項目に追加されてしまってますね(汗
実は User-specific files はファイルの冒頭にあったりします。
これだからVS仕様は。
色々出ている問題は、ウチだけなのかな・・・
その1(おばたけ)は、BGAの最後に出てくる年号を見たら、元ネタは25年前のものでした。年を食ったものです。
その2(GuitarのInputAdjust)はまだ未調査。
その3のキーコードは、んー、通常動作時にSlimDXの香りを残さなくてもいいんじゃないかなと私は思います。
その5のマウスカーソル(2秒で消去)について。どうもうちの環境では、CDTXMania.cs にある CCounterのccMouseShow が期待通りに動作していないっぽい。ccMouseShow.n現在の値 が、0から始まって1秒後に1になることがあるが、すぐに0に戻っているため、いつまで経っても2秒後のカウンター終了条件にたどり着かない模様。ただ、ほかのCCounterは期待通りに動いているようなので、ccMouseShowのt開始()の引数設定の問題かもしれない。
その6は・・・うちはSourceTreeを使っていたものですから、こうなってしまいました。今後はVisualStudioに統合されているほうのgitを使うのが無難かな。
その7。DebugビルドをVS2017からF5でデバッグ実行して、DTXManiaのウインドウが表示される前に別のウインドウをクリックして最前面に出すと、DTXManiaがそのウインドウの裏で起動してきて、その後例外が発生する。tポーリング()のときに、
>HRESULT: 0x80070005, Module: General, ApiCode: E_ACCESSDENIED/General access denied error, Message: アクセスが拒否されました。
となっている模様。要調査・・・
その8。なぜかウチでは、songlist.dbのキャッシュ読み込みに失敗するのか、本体起動開始直後に選曲画面に入っても、1曲も曲が登録されていない状態になる。最初はSSD対応の影響かとも思ったが、同ロジックを無視して強制的にファイルを書き出させるようにしても結果は同じ。これも要調査・・・
その7(HIDのE_ACCESSDENIED)について、調べたところポーリング以前の問題で、最初のAcquireでE_ACCESSDENIEDになっていた模様。
ということで、ぐぐって、
https://www.gamedev.net/topic/184057-directinput-acquire-fails/
この辺りを参考にして、試しに SetCooperativeLevel で Foreground でなく Background を指定してみたところ・・・
HRESULT: 0x80004001, Module: General, ApiCode: E_NOTIMPL/Not implemented, Message: 実装されていません
ときたもんだコンチクショウ。
今日はもう寝ます・・・
# なお、SlimDX版では、この問題は出ていませんでした。
その1
「年を食った」を.gitignore に追加しまs
その3
ももももう遅いー。
従来のキーアサイン番号のまま使えるように、内部でSlimDXのKeyに置き換えるよう修正してpushしちゃいましたー。(汗
その6
VSのGit(チームエクスプローラー)はなんか使いにくいので、.gitignore の生成くらいにしか使ってなかったりします。
その7
非アクティブだと失敗するAPI…… Keyboard の Acquire くらいしか思いつかないですねー。
と思ったらやっぱ Acquire でしたか。
Acquire() & Poll() 時のエラーチェックをコメントアウトしてしまったので、それかも。
その8
ビルド後イベントをいじったときにエンバグしたかな?
とりあえず、私も今日は寝ます(_ _)ノ
その5(マウスカーソル)の、先の記載は寝ぼけてましたねすみません。終了値=1なんだから、2にならないことは問題ではなく、1の時点で直ちに0に戻されていることが問題でした。さて、どこで0にされてるんだか・・・(もう寝ます)
その1
BGAの表示方法を変えました。
これでどやぁ(ドヤァ
その1のBGA: 仕事から帰ってきたら、いつぞやから放置していた、「いったん別サーフェースかどこかに等倍で書いておいて、最後に拡大しつつ転送」がいつの間にか実装完了していたとは・・・。お見事です。おばたけがばっちりになりました。おかげさまで、やっとコンストラクター紹介のところが綺麗に表示されるようになりました。ありがとうございます。ありがとうございます。ありがとうございます。
その3の、キーコード処理の更新もありがとうございました。
その9。BGA表示が良くなった代わりに、AVIが表示されなくなったけどな!(AVIの上から、BGA領域を黒四角で上書きされている模様)
その10。演奏画面でALT+ENTERしてフルスクリーンとウインドウモードを切り替えると、Device Lostして? INVALID OPERATIONの例外発生。演奏画面以外では問題なし。(なのでBGA周りの修正の副作用のような気がします)
さて、それでは私は、昨日見つけた問題の調査を再開します。
その1
意味ありげな未使用変数があったのでそんな気はしてました。ひしひしと。
その7
何度やっても、うちのDTXManiaは後ろに隠れてくれませぬ。
その9
きゃー
バックバッファと同じフォーマットのままやからAがXになってるはー
しかし
BGA いじると AVI がってパターンはもはや既視感を通り過ぎて歴史すら感じます。
その10
例によってうちでは再現しません…… が、BGAの内部テクスチャのせいな予感がMAX。
あっ 子Activity に入れてねぇ
その9
修正しましたー。
D3D9 は対応するフォーマットが少なくてよかった。
その10
この時代のFDKでは、CTextureはまだActivityじゃありませんでしたね。
そして、Pool.Default をつけた Texture は Manged じゃなく Unmanaged でしたね。
ということで、修正しましたー。
修正いただきありがとうございました。BGAの黒抜きと、演奏画面のDevice Lost問題が発生しなくなることを確認しました。
その7(DTXMania本体をforegroundじゃなくして起動すると、Acquireに失敗する) は、うちでは簡単に裏に回すことができる(5割程度)のですが・・・そちらのPC環境が良すぎるのでしょう。きっと。電源プランを省電力のやつにしてみるとか、裏で動画ファイルなどのでかいファイルをコピーさせながらVS2017上でデバッグ実行させてみるとか、そんな感じで再現できませんか。(どうしてもだめなら、Program.csのDLLチェックのところ辺りで1秒程度sleep()を入れてみるとか)
・・・まあ私もこれからこの辺を調査するのですけれども。
その8(常にsongs.dbがない状態で起動するような感じになる) は、やはりSSD対応の影響でした。こいつを挟むと、BinaryWriterのWriteで、prefixとして文字数の情報が出力されなくなっていて、その結果書き出されたファイルを読み込むとDBが壊れているとみなされてました。取り急ぎSSD対応部分は呼びださないようにして問題回避しつつ、ほかのところをまずは調査します。
その7(DTXMania本体をforegroundじゃなくして起動すると、Acquireに失敗する)の簡単な再現方法:
program.csのMain()の頭に、以下の1行を追加。 Microsoft.VisualBasic.Interaction.AppActivate("メモ帳");
そして、あらかじめ中身が空のメモ帳を起動しておいて、VS2017からDTXManiaを実行。
その7
おおー。再現しました。
……Acquire じゃなくて、CDTXMania.Instance.Input管理.Keyboard が null になっての null 参照例外でしたが。
はい。それです。先ほど暫定対策をつっこみました。
とりあえず、バックグラウンド時に Acquire で発生している例外が E_ACCESSDENIED ではなく DIERR_OTHERAPPHASPRIO だろうことが推測できます。(両者は同じ値です。)
これは普通に発生する(通常はエラーコードで返されるところ SharpDXだと自動的に SharpDXException に変換されて throw される)ものなので、無視しておいてよいかと思いますがいかがでしょう。SSTでも、実行中に裏に回したら Acquire 失敗メッセージがいっぱいでますが放置してます。
はい、そうですね。キーボードとマウスについては、無視する (そして、deviceはDisposeせずに維持する) でよいかなと考えます。(で、先ほどのコミットはそういう動作になっているはずです。(念のため、後で、keyboard/mouse両者のAcquire/Pollをtry/catchしておきます)
つーことで、先ほどのコミット箇所を、発生した例外が DIERR_OTHERAPPHASPRIO 「以外」だった場合にのみデバイスの種類を問わずRemoveするように修正してしまいました(過去形(汗))が、いかがでしょう。
挙動がSSTとまったく同じになりました。
あ、ども。それでよいです。ありがとうございます。
その5(マウスカーソルが消えない)は、なぜか1秒に1回、MouseMoveのイベントが発生しているために起きていると判明。(知人がマウスイベントを拾ってスクリーンセーバーを抑制するアプリを作っているのですが、Win10CreatorsUpdateでスクリーンセーバーに入らなくなったと言っていたのはこれのことか・・・。なのでウチの環境に限った問題でもなさそうです)
仕方がないので、MouseMoveだけでなく、マウスの座標もチェックすることで回避するようにします。
その5(マウスカーソルが消えない)の対策をコミットしました。ただ、うちではどうも、1秒経過で一瞬マウスが消えて再度現れ、さらに2秒するとマウスが消える・・・という動作になるようです。いかにも、取得しているマウス座標が1つ古い、的な挙動ですが、なぜにこうなるのやら。
さて、ここまでまだ残っている問題は、
ですね。明日、その8を調べます。
SharpDX への移行自体に関する不具合はもうなくなった感じでしょうか?
そろそろdevelopへマージしてもいい頃合い?
その5
もしや、「HID準拠マウス」が複数あるとか?
なくなった感じだと思います。developにマージしちゃってください。さりげなくC# 7が使われていてビビりました。(間違えてVS2015を起動してしまい、なんで今日はビルドできなくなったんだ~と悩んでました)
HID準拠マウスは1個だけですよ。
SSD対応は作りが無茶苦茶だったので、作り直します・・・最近寝ぼけてるなぁホント・・
マージ完了しましたー。
では、このチケットはいったん閉じますね。
VSyncWaitを切り替えると、画面表示が乱れるようです。
・・・んー、私が昔作ったところのような気もしますが(汗;;;
会社から備忘録: ジョイパッドからの入力動作の確認が必要。 主にタイムスタンプ周りと、軸対応関係。
いずれも、slimdxに手を入れていたところなので。
チェックしましたー。
修正ありがとうございます&凡ミスすんませんでした。
manifest内に、SlimDXへの参照定義が残っていたため、削除しました。(Rev. 25a3701fcdef521f479158f1494323f4b5bc63ca で対応済みです)
VS2015以降への移行のため、SlimDXからSharpDXに移行してみる。