HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0108
蒟蒻砂漠ゲーム等を作るときのウェイトについて7解決


蒟蒻砂漠

リンク

2018/1/8(Mon) 14:10:08|NO.82220

私はいままでhspでゲーム画面を描いて毎フレームhspdxで取り込んで表示し、
es_syncでウェイトを取るという暴力的な方法で60fpsを維持していました。
しかし、最近hspdxは非推奨になったと知ったので、これを機にhspdxを使わない
プログラムに変更しようと思います。

そこで、普段皆様が使っている60fpsが維持できるウェイトの取り方を知りたいと思いました。
ご教授よろしくお願いします。



この記事に返信する


あまら

リンク

2018/1/8(Mon) 14:29:44|NO.82221

ざっくり説明すると、
1回ループ毎にどれだけ時間がかかったのか計測
計測結果によってウェイト時間を変化させる。

という手順で可能です。

↓こちらで実践なさている方もいます
https://blog.mono0x.net/blog/2011/02/28/

モジュール化の例
https://wiki.hsp.moe/Module%EF%BC%8FFPS%E5%88%B6%E5%BE%A1.html


私がやる場合はモジュールに近い方ですが、
どちらもやってることはほとんど同じです。

注意として、時間計測の精度を高めるためにtimeBeginPeriodを使用することが多いのですが
これを使うと少々負荷が上がります。



ZAP

リンク

2018/1/8(Mon) 14:32:16|NO.82222

標準命令だけで作る場合、こうしています。

60fpsの場合、1ループあたりのウェイト時間は16.6666秒なので、
3回に2回は17ミリ秒、3回に1回は16ミリ秒のウェイトをとって
擬似的に60fpsにする。

メインループ

repeat redraw 0 (キー入力、移動、判定等ゲーム内各種処理) (描画処理(gcopy、grotate等)) redraw 1 Counter++ await 17-(Counter\3==0) // 1/60秒ウエイト loop



ZAP

リンク

2018/1/8(Mon) 14:37:24|NO.82223

awaitの精度もバージョンアップして高精度タイマーを用いるようになって
だいぶよくなったと思いますし、単純にawait利用でもいいような気がします。



あまら

リンク

2018/1/8(Mon) 14:56:49|NO.82224

あー説明が足りませんでしたね
失礼しました。

大量に描画するなどループにやたら時間がかかる場合
例えば1ループで8msほど描画や計算で時間が取られる等の場合
更にawait 17なんかをすると合計25msで40fps程になってしまうので、
そういった場合に私が書き込んだ方法を使うと安定して60fpsが実現できます。

それでも、ウェイト無しで17msを超えるような場合には意味が無いですが。


そんなに時間が取られない場合はZAPさんの方が負荷も少なく
簡単にできるのではないでしょうか。



リンク

2018/1/8(Mon) 15:15:43|NO.82225

awaitは前回awaitしてからの経過時間なので、
処理が16ms以内に抑えられている場合は問題なく60fps相当の処理になります



ぜーっと!

リンク

2018/1/8(Mon) 16:13:32|NO.82226

・蒟蒻砂漠さん
>es_syncでウェイトを取るという暴力的な方法で60fpsを維持していました。

いや、垂直帰線(だったかな?)を待って同期更新するという方法、hspdxを使用する時は
それが普通だったと思うので、とくに暴力的ではないかと思いますよ。

標準に比べるとまだ機能制限多いですが、hsp3dishなどを使用すればhspdx同様、openGLやDirectXの
高速描画の恩恵受けられるので良いですよ。加えてawaitなどの精度も標準に比べて高いとのこと。
ただ、キャラの自動移動などの便利機能は、hgimgなどに引き継がれていますが、
hsp3dish自体には無いので自作が必要ですけど。

何となく思うに、以前に比べて標準命令だけで動かしても高速になったと思います。
CPUのごり押し力、OSのパワーアップ、HSPのパワーアップ。どれなんでしょうね。

・あまらさん
なるほど、細かく見ると誤差を吸収しないと、安定はしませんよね。
ゲームは特に1フレームが大事だからキチンと処理しないといけないのは確かです。

>それでも、ウェイト無しで17msを超えるような場合には意味が無いですが。
もしそこまで処理に時間のかかる状況であれば、処理方法に問題があるとみて再検討が必要ですね。

・ZAPさん
おお、ZAPさんの方法、複雑にならず微妙なところを調整できていいですね。
私は気にしてなかったので普通に await 16を使ってました。(^^;いつもfps 62



蒟蒻砂漠

リンク

2018/1/8(Mon) 17:06:39|NO.82227

沢山の情報ありがとうございます。一通り試して見ることにします。



ONION software Copyright 1997-2023(c) All rights reserved.