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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0604
きのよーフレームレートが下がってくる……。2解決


きのよー

リンク

2014/6/4(Wed) 20:31:40|NO.62298

現在、ノベルゲームのエンジンを組んでいます。
学校の文化祭に出す予定ですが、その後ネットで公開しようと思っているので、現在のソースコードをOneDriveにアップロードしました。
https://onedrive.live.com/redir?resid=6F81D6102603947B!380&authkey=!AHDCV7H49Ip8seg&ithint=file%2c.zip
この圧縮ファイルに格納してあるソースコード等をすべて解凍してそのディレクトリ構造をそのままに実行すると、
最初にフレームレートを計測するプログラムが実行されると思います。
このプログラムは「system」フォルダ内の「main2.txt」に記述されていて(Manifest.txtは読み込み準備)、
そのコードを元にエンジンが動作している状態です。

私が教えて欲しいのはその動作についてです。
このプログラムを延々と実行しておくと、だんだんとフレームレートが下がってきます。
意図的に下げる処理はさせていないので、原因は全くわかりません。
同じプログラムを実行しているはずなのに、何故かフレームレートが下がってきてしまうのです。
フレームレートが30になった時に停止中の画面に飛ぶようにしていますが、その後画面をクリックするとまた起動直後のフレームレートに戻っています。
main2.txtには「stop」と書かれていますが、実際にはawait20をずっと繰り返す処理をしています。
なぜこの処理を挟むだけでフレームレートが上がるのかも、謎です。

プログラムも文章も書き方が拙いですが、どうか原因をご指摘いただけると嬉しいです。
ご回答よろしくお願いします。



この記事に返信する


m

リンク

2014/6/4(Wed) 22:37:40|NO.62305

*read1 の直後あたりに logcons = "" を挟むと殆ど停止しないようなので
ログ書き込みの負荷が原因ではないでしょうか?

単純な文字列結合は文字列が長くなるにつれて負荷が高くなります。
ログのサイズを自前で管理してmemcpyで書き込めばこの負荷は大幅に下げることができます。

#uselib "winmm.dll" #cfunc timeGetTime "timeGetTime" #module // log_write "書き込み文字列", ログ変数, 現在のサイズを保持した変数, 最大サイズを保持した変数 #deffunc log_write str p_string, var p_var, var p_index, var p_max, local _temp, local _len _temp = p_string _len = strlen(_temp) // バッファのサイズ拡張、拡張サイズが小さいと頻繁に実行されて遅くなるので大きめに。 if (p_index + _len) >= p_max { memexpand p_var, p_max+65536 p_max += 65536 } memcpy p_var, _temp, strlen(_temp), p_index, 0 p_index += _len return #global time_old = timeGetTime() sdim buf, 65536 buf_index = 0 buf_max = 65536 *MAIN await fps++ time_cur = timeGetTime() if (time_cur-time_old) >= 1000 { title "fps: "+fps+" / buf="+strlen(buf)+"bytes" fps = 0 time_old = time_cur } // 単純な文字列の結合の場合 buf += "\nlog" // ログ書き込み用関数の場合 ;log_write "\nlog", buf, buf_index, buf_max goto *MAIN



きのよー

リンク

2014/6/5(Thu) 19:18:41|NO.62315

m様
>>ログのサイズを自前で管理してmemcpyで書き込めばこの負荷は大幅に下げることができます。
この方法でログを管理したところ、ほとんどフレームレートが下がらなくなりました。ありがとうございます。
HSPは文字列管理がしっかりして安心していたのですが、まさかこういうところに穴があるとは思っていませんでした…。
簡潔なサンプルを少し改造して

#deffunc log_add str log_add_str2 log_add_str=log_add_str2 log_add_len=strlen(log_add_str) if(log_add_len+log_nowlen)>=log_nowmax{ memexpand logcons,log_nowmax+65536 log_nowmax+=65536 } memcpy logcons,log_add_str,log_add_len,log_nowlen,0 log_nowlen+=log_add_len return
の形で実装することにしました。
本当にありがとうございます!



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