|
|
|
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 *メイン
| |
|
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 *メイン
| |
|