Ticket #36388

VSyncWait設定によって約10ms音ズレが発生する

Open Date: 2016-06-14 14:11 Last Update: 2016-06-16 18:28

Reporter: (del#90411) Owner: yyagi
Type: 性能改善 Status: Open [Owner assigned]
Component: DTXMania MileStone: 不具合確認・バグ修正
Priority: 5 - Medium Severity: 5 - Medium
Resolution: None

Details

VSyncWaitがONの時とOFFの時で10ms程度ズレが発生する。

OFFの状態で音ズレ調整を行い、譜面制作をした後にONで再生すると約+10msズレが生じる(BGMAdjust+10msで音ズレ解消)。 ONの状態で音ズレ調整を行い、譜面制作をした後にOFFで再生すると約-10msズレが生じる(BGMAdjust-10msで音ズレ解消)。

譜面制作者側としては、どちらに統一すべきか悩んでいます(現状、OFF基準で制作中)。 開発側で修正可能でしたら、よろしくお願い致します。 それに合わせてこちらも修正予定です。

Attachment File List

Ticket History (3/10 Histories)

2016-06-14 14:11 Updated by: (del#90411)
  • New Ticket "VSyncWait設定によって約10ms音ズレが発生する" created
2016-06-14 21:19 Updated by: yyagi
Comment

ご報告いただきありがとうございます。もう少し詳しく教えてください。

  • お使いのOS, DTXMania本体のバージョン
  • サウンドタイプに何をお使いか (WASAPI, ASIO, DSound)、ならびにそのバッファ量の設定
  • BGMやチップ音にお使いのサウンドファイルのフォーマット (wav, ogg, xa, ...)
  • お使いのPCの詳細情報 (CPU, グラフチップ)
  • DTXManiaをフルスクリーンでお使いか、それともウインドウ状態でお使いか
2016-06-14 22:06 Updated by: (del#90411)
Comment

・使用OS:Windows 7 Home Premium 64-bit

・DTXMania本体バージョン:DTXMania104(151212)
※1.恐らく、最新バージョンだと思います。
※2.派生作品のver.K(ver3.51)でも確認済。

・サウンドタイプ:WASAPI(21ms)
※3.バッファ量はこれ以上下げることが出来なかった。
※4.自分の環境のASIO設定時のバッファ量を1msと遅延は同等レベルだったため、WASAPIを使用しています。
また、ASIO設定のバッファ量1msだとノイズが激しいためそれも含めてWASAPIを使用しています。

・BGMやチップ音のサウンドファイルフォーマット:BGMはogg、チップ音はxaもしくはwavを使用しています。

・PCの詳細情報 (CPU, グラフチップ) 、CPUは「Intel(R) Core(TM) i5-3570 CPU @ 3.40GHz (4 CPUs)」、GPUは「NVIDIA GeForce GTX 650 Ti」
※5.「DxDiag.txt」を置いておきます(PC名のみ変更しています)。
https://drive.google.com/open?id=0B-iw-cl5I2zyYjlUeHpIOTByOGM

・フルスクリーンモード、ウィンドウモードの両方ともで発生しているように感じます。

ウィンドウモードでの録画になりますが、動画を上げました(本家とver.Kの2つです)。
https://drive.google.com/open?id=0B-iw-cl5I2zyXzloRVJ1ckpPa3M
https://drive.google.com/open?id=0B-iw-cl5I2zyMWlkQnBteG5uMWM
タムが鳴っている辺りが分かりやすいかと。


他に必要な情報や検証がございましたらご連絡ください。
何卒よろしくお願い致します。

2016-06-14 22:49 Updated by: yyagi
Comment

情報ありがとうございました。なるほど、分からん......

すみません、私には違いが判らないようです。(昔は、1フレームずれていればわかる自信があったんですが・・年でしょうか)

ただ、実際の実装として、発声開始のタイミングは画面描画タイミングと同期しています。ですから、VSyncWait=ON時に最大1フレーム分(16.7ms)のずれが発生しえます。

さて、どうしましょうね。試しに全チップの再生開始位置を誤差分だけシークして対応するとか。その場合、全チップの頭の数msが再生されないことになりますが、まずはこれでやってみます。(開発環境再構築中につき、少しお時間ください)

根本的な解決のためには、描画とそれ以外のロジックとでスレッドを完全に分離するしかありませんが、今の設計からそこまで踏み込むのはかなり勇気がいります。(DTXManiaでの反省があって、FROMさんのStrokeStyle<T>は最初の設計からスレッドが完全に分離していますね)

なお、曲データ自身は、VSyncWait=OFF基準で作っていただくのがよろしいかと思います。そのほうが、よりズレが小さいはずですので。

2016-06-14 23:21 Updated by: (del#90411)
Comment

ご確認ありがとうございます。

もっと他に分かりやすいのをご用意出来れば良かったのですが、申し訳ございません。

発生開始タイミングは描画タイミングと同期していたんですね。新しい発見です。
今の状態から分離するのは危険ですので、やめた方が良いですね。
今まで試行錯誤を繰り返した上で構築されてるわけですし。

そうですねぇ、全チップの再生開始位置だと確かに気持ち悪いことになりそうですね。
BGMノーツのみシークさせるというのはいかがでしょうか?

現状、BGMAdjustを調整することでズレの軽減が行えてるわけですので、
その部分のみでも効果はある様に感じます。
まぁ、軽減効果を感じてるのは今のところ自分とあと一人他の制作者さんだけの状態ですが。。

お忙しいようですし、お時間が出来次第試して頂ければ幸いです。

VSyncWait=OFF基準で作っていく方向で今後も進めていこうと思います。
ありがとうございます。

2016-06-15 02:14 Updated by: yyagi
Comment

試しに全チップの再生開始位置を誤差分だけシークして対応するとか。

:

BGMノーツのみシークさせるというのはいかがでしょうか?

その実装、既に入ってました(苦笑);;;

チップ音の長さが5秒以上のものに対して、再生開始時にシークをかけて、正しい再生位置になるように補正をかけています。(CDTX.csのL502~) この機能はRel104でも入ってます。

自分が作った適当なデータを自分の環境でならしてみた限りでは、だいたいVSyncWait=ON時に12ms程度, OFF時に4~8ms程度のシークが発生していました。 まあ、期待通りの動作をしていると思います。

現状確認のために、上記のようなシーク情報をデバッグログに出力するテスト版をお作りいたしましたので、お手数ですがお試しいただけますでしょうか。 https://osdn.jp/users/yyagi/pf/DTXMania_TestBuilds/files/ で、左のDTXManiaをクリックして、右の DTXManiaGR_seeklog.zip をクリックすると、ダウンロードできます。CONFIGURATIONのSystem/Display Options/VSyncWaitのON/OFFを変えつつ、曲データの頭(BGM再生開始のところ)を再生させてみてください。DTXManiaLog.txt に、「再生位置自動補正: なんとか.ogg, 実タイマ値=14745, seek先=7ms, 全音長=245878ms」などとログが残ります。

後でログを開くのは面倒で、リアルタイムで確認なさりたい場合は、dbgviewなどを併用ください。(この試作品は、リリースビルドではなく、デバッグビルドです)

(注: 非公開最新版がベースのため、まだConfig関係の説明がほとんど入ってません。悪しからず)

それと、zipファイルでもう一つ、DTXMania105_D3D9Ex.zip というものを登録しています。これは少し古い本体がベースですが(といっても104よりは新しい)、 画面の描画遅延が1フレームになるように強制設定しているバージョンになります。(通常は遅延フレーム数を設定しておらず、3フレーム程度描画遅延が発生している可能性があります)

こちらをお使いいただくと、何か改善があるかもしれません。よろしければお試しください。(ただし、動画周りの対応が不完全です。あしからず)

2016-06-15 17:53 Updated by: (del#90411)
Comment

なんと、既に実装済と。。
なるほど、5秒以上のものに対してですか。
ソースコードを見る限り、派生作品のver.Kにも入っていました。

最初は「AdjustWaves」かなと思ったのですが、DSoundのみ有効と書かれていますし、
CSound.csのL1213「t再生位置を変更する」でサウンドタイプの判定によって別処理を行ってるので、
また別物なんですかね?

テスト版ありがとうございます。
試してみましたが、やはりズレが発生していました。

ログは出力されていました。とりあえず、1つずつ書いておきます。
VSyncWait:ON→再生位置自動補正: bgm.ogg, 実タイマ値=9564, seek先=5ms, 全音長=101776ms
VSyncWait:OFF→再生位置自動補正: bgm.ogg, 実タイマ値=335850, seek先=1ms, 全音長=101776ms

自動補正処理が逆に何か悪さをしてるのかな?と思い、 実際に「tWave再生位置自動補正」の処理をコメントアウトして試してみましたが、
とくに大きな変化はありませんでした。
(逆に変化していない=機能していない?と思いましたが、聴きすぎて麻痺ってきたのかもしれません)

また、DTXMania105_D3D9Ex.zipの本体でもズレは発生していました。

本体は変わってしまいますが、他の譜面制作者さんがver.K(ver3.40 GD)というものでも実際にズレているか検証して頂いたところ、
同じくズレていたとのことでした。

2016-06-15 21:57 Updated by: yyagi
Comment

ご確認いただき、ありがとうございました。

それでは、CONFIGURATION/System/UseOSTimer=ON をお試しいただけますか。(初期値はOFFです)

これで改善がないようでしたら、直近で改善のアイデアを思いつかないです・・・。

2016-06-16 18:22 Updated by: (del#90411)
  • File DxDiag.txt (File ID: 5270) is attached
2016-06-16 18:28 Updated by: (del#90411)
Comment

コメントありがとうございます。

UseOSTimerをONにしても、音ズレの変化はありませんでした。
むしろ、何かプツプツとした音が発生するようになりました。

「修正可能でしたら、よろしくお願い致します。」ということでしたので、
現時点で他に手が無さそうであれば仕方ないですね。

正直、妥協できるレベルなので、変に弄ってさらにバグっても問題ですし、
現状はこのままでよろしいかと思います。

こちらとしては「VSyncWait=OFF基準で作成を進める」という部分で悩みも解決出来ましたし、
ここまでお付き合い頂きありがとうございました。

yyagiさんの方でステータスの変更はしていただいた方が良いのかな?
変更が必要でしたら、ご対応何卒よろしくお願い致します。

Edit

You are not logged in. I you are not logged in, your comment will be treated as an anonymous post. » Login