プレイ日記
myu314 myu314
【4K434E3S】 TIME$とMAINCNT監視して、1秒間に何回描画してるのか確認してみたら少し不思議な結果に。 基本的に60フレームで、89秒おきぐらいに45フレームが挟まれる。 何故こんな処理に…。
6そうだね
プレイ済み
返信[1]
親投稿
みむ*mim hidemimtp
私も自分でソース組んで(TIME$ではなくTMREADで)やってみました。 ほんとだ!同じ現象が起きました。 でもこれ、1秒が45フレームになるんじゃなくて、45フレームの時だけ1秒じゃないですね。89秒に一回、短い秒(計算上は0.75秒)が入ってるみたいです。これでTIMEがズレていないなら、1秒が実は1.0085秒って事になりますね。
2そうだね
プレイ済み
返信[2]
親投稿
MIKI ifconfig
時間を刻む石と vsync を刻む石が同期してないって話かな?? 明日になればれいさんが解説してくれそうな気がする。
0そうだね
プレイ済み
返信[3]
親投稿
おちゃめ ochame_nako
3DSの内蔵時計は0.001%以下の誤差しか発生しないと思われるためそれはVSYNCが1/60秒からずれているためだと言えます。 ちなみに私が以前TIME$を元にVSYNC 1の速度を計測してみた結果は1/59.835秒でした。
0そうだね
プレイ済み
返信[4]
親投稿
myu314 myu314
60F手前でふらつくんじゃなくて、基本60Fで45Fを挟んで調節するあたりが不思議ポイントですかね。 あとどうも1秒が短いタイミングが存在するっぽいのも面白い。
0そうだね
プレイ済み
返信[5]
親投稿
みむ*mim hidemimtp
VSYNCやWAITなしでWHILE 1でTMREADしながら、「秒」が変化したらPRINTされるようにしてみたんですが、ずっと一秒刻みで表示されていた行が、88秒に一回、パパッと2行表示されて、それが45フレームの時なんです。 私も以前VSYNCのズレを試しましたが、59.5くらいの時と、59.8くらいの時があり、この88秒が含まれたかどうかでまた差が出ていたのかもしれません。 。。。ていうかもし秒がズレるなら、ストップウォッチアプリで「スタートから「秒」が変わるまでのフレーム数を取っておいてコンマ以下を計算する」ってのが不可能になり、どうあがいても正確な経過時間は算出できないですね。 ちなみに全て興味本位で、何も困ってませんけど(笑)
0そうだね
プレイ済み
返信[6]
親投稿
れい rei-nntnd
俺に話をふるのか。 別にそんな疑問じゃないっしょ。みむ氏で正解でてる。 3DSのVSYNCは約1/60秒。0.016715secくらい。 1/60は正確じゃないけど、早くなったり遅くなったりはしない。いつも同じ間隔。1/45秒になったりしない。 TIME$はRTCの石見てる。時間は正確だけど、DSからの名残で「秒」以下の単位がないし、別石なので通信しないと更新されない。通信に遅延があるので、プチコンが勝手に15vsyncに一回通信して内部TIME$を更新してくれてる。 15vsync=0.250725≒0.25秒に1回「秒」の単位を見に行く。 だいたいいつも「4回」見に行ったら更新されるんだけど この0.000725だけの差があるから0.25/0.000725≒345回目あたりで誤差(ジッタ)がたまって「3回」で秒が更新されちゃう。 345回の見に行く=約87秒。
3そうだね
プレイ済み
返信[7]
親投稿
Hanzo rzsense
VSYNCは、1画素を描画するためのピクセルクロック(3DS液晶パネルのスペックは存じませんが多分数十MHz)を、水平方向のピクセル数(表示されていない部分を含む)×垂直方向のピクセル数(表示されていない部分を含む)で割った値なので、ぴったり60Hzにはならず、例えば59.94Hzなど、中途半端な値になることがあります。
0そうだね
プレイ済み
返信[8]
親投稿
れい rei-nntnd
追記しとくか。 > どうあがいても正確な経過時間は算出できないですね。 できるよ プチコンが内部でTIME$を更新するのは MAINCNTが(15の倍数+14)の期間の「後半」。 VSYNCが1/60からずれてるのもわかってるし TIME$更新タイミングもわかってる。 きちんと考えれば時間分解能1/60秒、精度0.001%程度のストップウォッチはできるよ。 それより時間分解能高いものは音声使わないと無理。
0そうだね
プレイ済み
返信[9]
親投稿
れい rei-nntnd
Hanzo氏 一般的なシステムの話をするならVSYNCはHSYNCの整数倍にならない時もある。 VSYNCは文字通り、垂直同期。 1画面の更新と同期したシグナルと見たほうがいい。
0そうだね
プレイ済み
返信[10]
親投稿
みむ*mim hidemimtp
れい氏、すばらしい。 私も00:00:00からの総秒数なりMAINCNTのMODでできるんじゃないかとよぎりましたが、これを仕様として作るのはアップデートや今後出るWiiU版(上位互換)考えると仮にそうだとしてもそこに頼るのはちょっとなーと思ってました。 でもプログラミングとしては面白そう、MAINCNT MOD 15==14を考慮したストップウォッチ(笑) そうか、BGMPLAYを使う手もあるんですね。T600で0.1秒、そしてBGMCHK・・・試してみよう。
0そうだね
プレイ済み
返信[11]
親投稿
myu314 myu314
あーなるほど! 時計見に行くのは毎フレームじゃないんだろうとは思ったんですが15Fもあるとは。 でも現象だけみれば明らかでしたね、一発で説明できるし。 浮かばなかったのが悔しい! でも時計作ってみたら妙に秒がふらつく感じがした理由もわかってスッキリしました:) ありがとうございます!
0そうだね
プレイ済み
返信[12]
親投稿
れい rei-nntnd
もうちょっと単位に気を付けないと。 「秒」がTIME$の数字なのか実際の秒なのか混乱してる。 フレームってのもVSYNCとは違う。
0そうだね
プレイ済み
返信[13]
親投稿
myu314 myu314
>れいさん 僕宛、でいいのかな?もうちょっと詳しいと助かります。 ゲーム的なメインループの1回分の意味で、MAINCNTが同じ値の間をフレームと呼んでます。一般的だと思うんだけど…。 vsyncと混同してるかなぁ。 MAINCNT増加のタイミング自体はvsync由来(vblank期間中とか)ではあるんじゃないかと思うんですが、それも間違ってる? ユーザープログラム側からはシステム変数以上のものは取れなくて、その視点だけで書いちゃってるからおかしいのかな。
0そうだね
プレイ済み
返信[14]
親投稿
れい rei-nntnd
その辺適当な人多い。 意味通じてる範囲ならべつにいいけど、こういう話題するときは正確にしないと間違う。 フレームってのは枠だから、動画の中の一枚分のこと。 一枚一枚描いてるときにその一枚を指すときに使う。 VRAMとか、2Dメディアじゃないとだめ。 時間の単位じゃない。 テレビや3DSの場合、走査して表示してるんで、一枚一枚描いて、描き終わったら表示してるわけじゃない。 場合によっては一点しか光ってない。 こういうのは走査開始点まで戻ってくる間隔、同期信号を周波数や時間で表す。VSYNCって書いちゃうときもある。 画面外描いたり、なにもしてないときもある。 普通はVRAMに描いたものを走査して表示する。VRAMに描くのにマシンパワーが足りなくなったりするけど、走査が遅くなることはない。
0そうだね
プレイ済み
返信[15]
親投稿
myu314 myu314
詳しい解説ありがとう! 混同ポイントは大体理解できたと思います。 どうせハード叩くわけじゃないし、とぬるく書きすぎたな、と。 ただやっぱり時間の単位でフレーム使っちゃうかなあ。 れいさんの書いてあることは解るんだけど他に適切な言葉が浮かばない。 軽く検索したらゲーム系独特っぽいんだけど、プチコンもゲームプログラムの作法にのっとってるわけし。
1そうだね
プレイ済み
返信[16]
親投稿
れい rei-nntnd
その理解ならやっぱり違うな。 それはゲームプログラミングの作法にのっとっていない。 今どきの「完成されたゲーム」はちゃんと1枚1枚描画してて、速度も十分あるのでフレームでも大抵意味が通じる。 「3フレーム以内にキーを入れろ!」とかね。 プチコンでも、1枚1枚絵を描画してて、その時の枚数の単位ならフレームでいい。 でもやっぱりフレームは時間の単位じゃない。 動画のコマの「枚数」の単位。 フレームが時間の単位になりえるのは単に「処理が間に合っていてフレームレートが足りてる」からってだけ。 処理の多いプログラムで1Vsync以内に1フレーム分描画できなくなったとき、フレームを時間として使ったら話が通じなくなる。 ゲームプログラミングでならより一層その辺きちんと使わないといけない。 Vsyncとフレーム、音とフレームの同期問題とかいろいろ面倒なことがあるんだ。
0そうだね
プレイ済み
返信[17]
親投稿
myu314 myu314
今更ですが。 れいさん丁寧な解説していただいたのに反応できなくてごめんなさい、ちょっとばたばたしておりました…。 あの話の流れで「ゲーム内時間」と「時間」思いっきりごっちゃにしていて超恥ずかしかったです;) もう多分大丈夫と思いたいです。
0そうだね
プレイ済み