ティアリング

32.フレームレートの取得 - HGIMG4プログラミングガイド
https://www.onionsoft.net/hsp/v36/doclib/hgimg4.html#FRAMERATE

 ここを読んでいると「ティアリング」という単語が出てきました。画面のちらつきと書いていますがなんでしょうね? そこで検索して調べてみました。

ゲーミングモニターにおけるティアリング・スタッタリングとは?解消方法も合わせて紹介
https://makuring.com/game/about-ts/

 ティアリングは、「ゲーム画面が横にぶった切れる現象」だそうです。なるほどたまに見かける気がしますね。(詳細は上記サイトを読んで下さい。)

フレームレート > リフレッシュレート という状態になっている場合に発生してしまうのですね。

フレームレート   … 「プログラムが画像を送り出す早さ」
リフレッシュレート … 「モニターの画面を更新する速さ」

 つまりこう。

「プログラムが画像を送り出す早さ」 > 「モニターの画面を更新する速さ」

 モニターの画面更新が追いつかない場合に起きる現象だそうです。

 この問題は、フレームレートの待ち時間を調整してリフレッシュレートの速度に合わせる(垂直同期(VSYNC))ことで、ティアリングを解消できるということのようです。 hgimg4では、メインループに入る前、gpresetの前で次のように実行するだけで垂直同期待ちをするようになります。


setreq SYSREQ_VSYNC, 1
gpreset

 マニュアルには、「通常は秒間60フレームごとの動作」となると書かれています。「通常は」ってなんでしょうね。  240Hzのディスプレイ使ったら240fpsで動作しようとするんでしょうか。もしそうならスタッタリングが起きるかもしれませんし、FPS値が想定以上になることでキャラクターの移動速度が高速になるかもしれませんね。

サンプル

 とりあえず使ってみました。


#include "hgimg4.as"

; 画面のちらつき(ティアリング)を防止
; 60fpsに固定になります。
; gpresetよりも前に実行する必要があります。
setreq SYSREQ_VSYNC, 1

gpreset

*main
	;	描画メイン
	;
	redraw 0			; 描画開始(画面クリア)

	;	
	;	各種描画を行なう
	;
	pos 10, 10

	; 描画時のフレームレートを取得
	getreq fps, SYSREQ_FPS
	mes "" + fps + " fps"

	redraw 1			; 描画終了
	
	; 「setreq SYSREQ_VSYNC, 1」でディアリング防止を有効にした場合
	; ・awaitは必ず必要
	;	→ウィンドウが操作できなくなります。
	; ・awaitの待機時間は 1000/60 より小さくする必要あり
	; 	→1000/60を超えるとawatによる待機時間のほうが長くなり、60fpsを下回ります。
	; ・「await 0」で大丈夫
	await 0

	goto *main

await

 垂直同期を設定すれば、awaitがなくても60fpsで動作するようになります。 ただしawaitを入れなければ、ウィンドウがフリーズしてしまうので必ずawaitは入れてください。

 基本的にはawait 0でいいみたいです。 1/60 秒よりも大きな値を入れると、リフレッシュレート(モニターの画面を更新する速さ)よりフレームレート(プログラムが画像を送り出す早さ)のほうが遅くなるため、fps値も小さくなってしまいます。

 高リフレッシュレートディスプレイでの使用を見据えてawaitには 1/60 秒を設定しておいたほうがいいのでしょうか。 テスト環境ないし、ティアリングの症状で困った経験もないのでどういう対応がベストかわかりません。

結論

 とりあえず今まで通り「awat 16」にしておけば安心。ということで進めていきます。 ティアリング?細かいことは気にしない!