トップページ > 過去ログ > 記事閲覧
ティアリングが発生する
名前:minato 日時: 2010/07/12 00:40

フルスクリーン→Alt + Tabでフルスクリーン解除→タスクバークリックで戻る をすると、垂直同期を待たなくなっている(SetWaitVSyncFlagの設定が消える?)せいか、ティアリングが発生するようになってしまいました。 こちらを修正していただくことは可能でしょうか?よろしくお願いいたします。

Page: 1 |

Re: ティアリングが発生する ( No.1 )
名前:いっち 日時:2010/07/12 18:59

少し実験してみましたが、事象を確認できませんでした。 事象の再現できるソースをご提供頂けますでしょうか?
Re: ティアリングが発生する ( No.2 )
名前:なら 日時:2010/07/13 01:33

2010/07/11版に更新したところ、私の環境でもフルスクリーン時に発生しました。 私の場合は、 フルスクリーン→Alt + Tabでフルスクリーン解除→タスクバークリックで戻る 等何もしなくても、フルスクリーンでしばらく動かしているとFPSが上がっていき、ティアリングが発生します。 また、ウィンドウモードでも、FPSが落ちたようにぎこちない描画になります。 以前は発生していませんでしたので、私もSetWaitVSyncFlagの設定がおかしくなるのかな?と思っています。
Re: ティアリングが発生する ( No.3 )
名前:なら 日時:2010/07/13 01:46

追記; 一つ前のテスト版に戻したところ、前記の事象は発生しませんでしたので、最新版のバグかと思います。 管理人さんのご対応を待ったほうが良いかもしれません。
Re: ティアリングが発生する ( No.4 )
名前:Will 日時:2010/07/13 09:34

> minatoさん DXライブラリのバグ報告するならバージョンくらい書くべきかと思います。(テストバージョンなら日付とか) そうしないと、たまたま管理人さんが確認したときに現象が発生するバージョンを使用してくれればいいですが、 そうでなければ「最新版では直っているかも〜」な回答になって二度手間になるだけですよ。
Re: ティアリングが発生する ( No.5 )
名前:管理人 日時:2010/07/15 10:01

お騒がせしてすいません、最新の DxLibVCTest.exeの バージョンではデフォルトで Direct3D 9 の VSYNC 待ち付き画面転送を使用せず、画面転送( 裏画面の内容を表画面に転送する処理 )を行う前に VSYNC まで待つという別の API を使用した後、VSYNC 待ち無しで画面転送を行っています この結果、画面転送の API 自体では VSYNC 中に転送することが保証されない状態に なりましたので、環境次第でティアリングが発生します まだアップしていないかもしれませんが、DxLib_Init の前に SetWaitVSyncFlag( TRUE ) ; を実行すれば今までのバージョンの様に VSYNC待ち画面転送を行うようになっています( or なります ) 以下は今回の仕様変更を行った理由です VSYNC待ち付き画面転送を使用しないように処理を変更したのは ScreenFlip を実行してから 実際に裏画面の内容が表画面に反映されるまでの時間を短縮するためです VSYNC待ち付き画面転送は転送 API を呼んでから実際に転送されるまでに環境によっては 30ms 以上時間がかかるので、入力に対するレスポンスが非常に悪くなり、恐らく アクションゲームなどのリアルタイム性の高いソフトではプレイに支障が出るくらい表示が遅れます ( 特に Windows Vista や Windows 7 が大きく遅延します ) 既存のバージョンでも DxLib_Init の前に SetWaitVSyncFlag( FALSE ) ;と記述すれば VSYNC待ち無し転送が行われるのですが、恐らく殆どの方はデフォルトの VSYNC待ち画面転送の 設定で起動されると思います それを踏まえたときに、デフォルトの動作として 「ティアリングは絶対発生しないけど入力が遅延する」 「ティアリングは発生する場合があるけど入力は遅延しない」 設定次第でどちらの動作も選択できる場合、どちらがデフォルトの動作として相応しいかを考えると 「ゲーム開発用ライブラリとしては後者かな・・」という結論に至りました DirectX7 のように動的に VSYNC待ち転送と VSYNC待ち無し転送が選択できればこんなことを考えなくても良いのですが・・・
Re: ティアリングが発生する ( No.6 )
名前:管理人 日時:2010/07/18 04:15

デフォルトで Direct3D 9 の VSYNC待ち画面転送を行わないようにした仕様はそのままですが、 No.5 の書き込みにある DxLib_Init の前に SetWaitVSyncFlag( TRUE ) ; を実行すると 今までのデフォルトの動作である Direct3D 9 の VSYNC待ち画面転送を使用するようになる バージョンをアップしましたので、もしご必要な方が居られましたらお使い下さい m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい) あと、Windows7 でソフトウエア VSYNC待ちが正常に動作しない( ティアリングが発生する どころか画面転送のタイミングがぐちゃぐちゃになる )不具合がありましたので、それも修正しました
Re: ティアリングが発生する ( No.7 )
名前:なら 日時:2010/07/19 02:51

ご対応有難うございます。 Windows7 環境で、ご説明の通りの動作になりました。 ところで、vista,7 での描画の遅れというのは、こちらのページで解説されているような事が理由なのでしょうか? 『Windows7/Vistaがゲーマーから避けられる要因』 ttp://www.ouma.jp/ootake/delay-win7vista-j.html また、もしそうだった場合、そこで書かれている解決策は DxLib でも有効なのでしょうか?
Re: ティアリングが発生する ( No.8 )
名前:管理人 日時:2010/07/20 03:18

> ところで、vista,7 での描画の遅れというのは、こちらのページで解説されているような事が理由なのでしょうか? はい、そうです > また、もしそうだった場合、そこで書かれている解決策は DxLib でも有効なのでしょうか? はい、有効です というか、開発者向け情報を見落としていました orz Aeroを無効にする機能を使用するかどうかを設定する関数を追加してもよいかもしれませんね・・・ SetMaximumFrameLatency に 0 を設定するのはデフォルトで・・・ 次に作業時間が取れる時に試してみようと思います ご情報ありがとうございます m(_ _)m

Page: 1 |