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


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0613
アイドルたまに背景がカクつく4解決


アイドル

リンク

2017/6/13(Tue) 22:37:55|NO.80229

皆さんこんにちは。
今回は処理落ちに関してわからないところがあるので質問に来ました。


5〜10回ぐらい起動するとたまに背景がカクカクしてしまいます。
FPSが原因なのかな?っと思って、自分が理解出来る範囲で色々試してみたのですが、
どうやってもたまにカクカクになってしまいます。

カクカクになっているときはFPS60前後をキープしているし、カクカクしていないときもFPSは60前後です。
なので原因がわからず困っておりますのでお力を借りれられたら幸いです。


背景がカクカクになるのは判断しずらいと思うので、画像と動画付きのファイルをアップしておきました。
(動画は右側がカクカクする側です)
https://yahoo.jp/box/JWucL9


■解決したい内容
・5〜10回ぐらい起動するとカクカクしてしまうのを修正したい
・上記の対応をしたとき、エスケープを解除してもなるべくFPSが乱れないこと
・可能であれば、ウインドウをしばらくクリックして話してもFPSが乱れないこと

■私の実力
モジュール、ビット計算、マクロは理解していません。



#include "d3m.hsp" ;FPSを調べるために入れる screen 0,610,480,,450,200 buffer 90 picload "map.bmp" gsel 0,1 ;FPS KIDO_TIME = d3timer() ;タイマー (起動してからの経過時間をms (ミリ秒, 1/1000 秒) 単位で返します) ;***************メインループ************ *メイン redraw 0 : color : boxf ;*************エスケープー************** stick ESC if ESC = 128 { ;ESCを押した時実行 repeat getkey keyZ,90 ;決定 (Zキー) if keyZ = 1 : break ;エスケープーから抜ける ;awaitの場合ここから fps = d3getfps() GET_TIME = KIDO_TIME + 1000.0 / 60 * fps_c ;起動時間 + 1000.0 / 60 + 0 if ( d3timer() < GET_TIME ) { ;起動時間 < 計算した時間 repeat await 1 if ( d3timer() >= GET_TIME ) : break ;FPS > FPS + 1000.0 / 60 loop } else { skip++ await 1 } fps_c += 1 ;ここまでコメントアウトする loop } ;************ゲームカウンター*********** color ,255 pos 450,100 : mes "SKRORU_c " + SKRORU_c pos 450,120 : mes "fps " + fps pos 450,140 : mes "KIDO_TIME " + KIDO_TIME pos 450,160 : mes "GET_TIME " + GET_TIME pos 450,180 : mes "skip " + skip ;awaitの場合、↓のコメントアウトを解除する // pos 450,230 : mes "FPS " + d3getfps() ;**************マップ******************** SKRORU_c += 2 ;スクロール速度 pos 32,SKRORU_c+10 gmode 0, 380,450 - SKRORU_c,255 : gcopy 90 if SKRORU_c not= 0 { ;0以外の時「実行」 pos 32,10 gmode 0, 380,SKRORU_c,255 : gcopy 90 ,,450 - SKRORU_c } if SKRORU_c = 452 : SKRORU_c = 0 ;スクロール数を「リセット」 redraw 1 /*【起動時間を計算する場合】 ・エスケープ解除してもFPSは乱れない ・ウインドウをクリックして離すとFPSが乱れ、高速化してしまう*/ ;awaitの場合ここから fps = d3getfps() GET_TIME = KIDO_TIME + 1000.0 / 60 * fps_c ;起動時間 + 1000.0 / 60 + 0 if ( d3timer() < GET_TIME ) { ;起動時間 < 足し算した起動時間 repeat await 1 if ( d3timer() >= GET_TIME ) : break ;FPS > FPS + 1000.0 / 60 loop } else { skip++ await 1 } fps_c += 1 ;ここまでコメントアウトする /*【awaitの場合】 エスケープ解除するとFPSが乱れる ウインドウをクリックして離すとFPSが乱れる*/ ;awaitの場合、↓のコメントアウトを解除する //await 16 goto *メイン



この記事に返信する


Yuuki

リンク

2017/6/14(Wed) 22:14:21|NO.80234

こんな感じでどうでしょうか。
ウィンドウタイマーを使う方法ですが。

#include "d3m.hsp" ;FPSを調べるために入れる #include "user32.as" screen 0,610,480,,450,200 onerror *error #define WM_TIMER 0x0113 buffer 90 picload "map.bmp" gsel 0,1 ;FPS KIDO_TIME = d3timer() ;タイマー (起動してからの経過時間をms (ミリ秒, 1/1000 秒) 単位で返します) oncmd gosub *メイン,WM_TIMER SetTimer hwnd, 1, 15, 0;ウィンドウタイマー onexit *exit stop ;***************メインループ(ウィンドウタイマー)************ *メイン redraw 0 : color : boxf ;*************エスケープー************** stick ESC if ESC = 128 { ;ESCを押した時実行 repeat getkey keyZ,90 ;決定 (Zキー) if keyZ = 1 : break ;エスケープーから抜ける ;awaitの場合ここから fps = d3getfps() GET_TIME = KIDO_TIME + 1000.0 / 60 * fps_c ;起動時間 + 1000.0 / 60 + 0 if ( d3timer() < GET_TIME ) { ;起動時間 < 計算した時間 repeat ;await 1 if ( d3timer() >= GET_TIME ) : break ;FPS > FPS + 1000.0 / 60 loop } else { skip++ ;await 1 } fps_c += 1 ;ここまでコメントアウトする loop } ;************ゲームカウンター*********** color ,255 pos 450,100 : mes "SKRORU_c " + SKRORU_c pos 450,120 : mes "fps " + fps pos 450,140 : mes "KIDO_TIME " + KIDO_TIME pos 450,160 : mes "GET_TIME " + GET_TIME pos 450,180 : mes "skip " + skip ;awaitの場合、↓のコメントアウトを解除する // pos 450,230 : mes "FPS " + d3getfps() ;**************マップ******************** SKRORU_c += 2 ;スクロール速度 pos 32,SKRORU_c+10 gmode 0, 380,450 - SKRORU_c,255 : gcopy 90 if SKRORU_c not= 0 { ;0以外の時「実行」 pos 32,10 gmode 0, 380,SKRORU_c,255 : gcopy 90 ,,450 - SKRORU_c } if SKRORU_c = 452 : SKRORU_c = 0 ;スクロール数を「リセット」 redraw 1 /*【起動時間を計算する場合】 ・エスケープ解除してもFPSは乱れない ・ウインドウをクリックして離すとFPSが乱れ、高速化してしまう*/ ;awaitの場合ここから fps = d3getfps() GET_TIME = KIDO_TIME + 1000.0 / 60 * fps_c ;起動時間 + 1000.0 / 60 + 0 if ( d3timer() < GET_TIME ) { ;起動時間 < 足し算した起動時間 repeat ;await 1 if ( d3timer() >= GET_TIME ) : break ;FPS > FPS + 1000.0 / 60 loop } else { skip++ ;await 1 } fps_c += 1 ;ここまでコメントアウトする return *error KillTimer hwnd,1 dialog strf("#Error %d in line %d\n-->内部エラーが発生しました(%d)",wparam,lparam,wparam),1,"Error" end *exit KillTimer hwnd,1 end



アイドル

リンク

2017/6/17(Sat) 08:15:49|NO.80254

Yuukiさん。ソースコードありがとうございます!

見たことがない命令があったため返事が遅れました。
SetTimerなどで検索してP1などがどういう動作なのか理解してきました。割り込みなんてあるんですね。

しかしエスケープ中にウィンドウが動かせなくなってしまったので、色々やってみたのですが解決方法がわからず(´・ω・`)


そして参考にしているゲームではどうなっているのか見たところ、
ウィンドウをクリック中は止まり、ウィンドウを離すとFPSが乱れました。
それと検索などをして見たところ、ウィンドウクリックによるFPS乱れ対策が難しいようで・・・・

上記の「元にしているゲーム、FPS乱れ対策」などを考慮すると、
プレイ中はあまり動かさないようにreadme.txtに書くのが一番いいのではないかと思いました。
せっかくのソースなのにすいません(´・ω・`)


しかし、Yuukさんのソース処理を変えたところ、背景カクカクしている原因らしきもおんがわかりました。

「SKRORU_c の値」
カクカクするとき :446→450→2(450→2のところでカクつく)
カクカクしないとき:444→448→0→4

どうも処理の仕方がわるかっただけのようなので、処理を変えれば多分回避できるかな、って思ってます。
回避できたら解決にします!



暇人

リンク

2017/6/17(Sat) 10:47:13|NO.80257

ウィンドウクリックしてる時に停止して
離したら普通に動き出すで良いなら
>goto *メイン
の前に↓を挿入

Over_Time = d3timer() - GET_TIME if Over_Time > 1 {KIDO_TIME + Over_Time}



アイドル

リンク

2017/6/17(Sat) 17:21:21|NO.80265

暇人さんありがとうございます。
おぉ、そんな方法もあるんですね。参考にします!


背景カクカクに関しては
if SKRORU_c = 452 : SKRORU_c = 0 ;スクロール数を「リセット」
if SKRORU_c >= 450 : SKRORU_c = 0 ;スクロール数を「リセット」
に修正しました。多分これでカクカクしないはず・・・!
処理の仕方が少し間違ってたことが原因だったので解決できました(タブンネ
皆さんありがとうございます。


#include "d3m.hsp" ;FPSを調べるために入れる screen 0,610,480,,450,200 buffer 90 picload "システム\\map.bmp" gsel 0,1 KIDO_TIME = d3timer() ;タイマー SKRORU_c = 400 ;確認する用に下の方に移動しておく ;***************メインループ************ *メイン redraw 0 : color : boxf ;*************エスケープー************** stick ESC if ESC = 128 { ;ESCを押した時実行 repeat getkey keyZ,90 ;決定 (Zキー) if keyZ = 1 : break ;エスケープーから抜ける await 1 loop } ;************ゲームカウンター*********** color ,255 pos 230,300 : mes "SKRORU_c " + SKRORU_c pos 230,330 : mes "FPS " + d3getfps() ;**************マップ******************** SKRORU_c += 1 ;スクロール速度 pos 32,SKRORU_c+10 gmode 0, 180,450 - SKRORU_c,255 : gcopy 90 ;下の部分 if SKRORU_c not= 0 { ;0以外の時「実行」 pos 32,10 gmode 0, 180,SKRORU_c,255 : gcopy 90 ,,450 - SKRORU_c;上の部分 } if SKRORU_c >= 450 : SKRORU_c = 0 ;スクロール数を「リセット」 redraw 1 await 16 goto *メイン



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