|
 |
|
2008/4/9(Wed) 00:51:20|NO.15010
こんばんは。AVDゲームを作りたくて、どんな順番で何を表示させようか、と日ごろ考えて
います。
今まで「背景表示→キャラクタ絵表示→メッセージ枠表示→メッセージ表示→画面を別のバッ
ファにコピー→コピーした画面とクリック待ちアイコンを透明度変えながらループして表示」が
基本だと思っていたんですが、別の画面にコピーする必要は無くて、クリック待ちをしている間、
背景・キャラクタ・メッセージ枠・メッセージを毎ループごとに書き換えていけばいいのだと気
づきました。すると、まばたきや雪の処理が簡単に行えるという…!
前置き長くなりました。で、今までのやり方と、毎waitごとに書き換えるやり方で、どれだけ
処理のスピードに差があるのかを計測するプログラムを書いてみました。どのくらい違うのかと
楽しみなので、計測用タイマーに"d3m.hsp"を使用させていただいているので、d3moduleを入れて
らっしゃるお方、ぜひご協力お願いいたします。
私の環境(WindowsNT ver5.1 - CPU: 586 RAM: 490996KB)では、画面ごとコピーが15734ミリ秒、
毎回書き換え16406ミリ秒でした。
#include "d3m.hsp"
buffer 1,800,600
color 0,0,255:boxf
buffer 2,600,600
color 255,0,0:boxf
buffer 3,600,200
color 0,255,0:boxf
screen 0,800,600
title "画面ごとコピー 計測中..."
buffer 4,800,600
pos 0,0:gmode 0:gcopy 1,0,0,800,600
pos 0,0:gmode 0:gcopy 2,0,0,300,600
pos 500,0:gmode 0:gcopy 2,0,0,300,600
pos 100,350:gmode 0:gcopy 3,0,0,600,200
pos 130,380:color 255,255,255:mes "abcdrfg hijklmn opqrstu vwxyz\nabcdrfg hijklmn opqrstu vwxyz\nabcdrfg hijklmn opqrstu vwxyz\nabcdrfg hijklmn opqrstu vwxyz\nabcdrfg hijklmn opqrstu vwxyz"
gsel 0
before=d3timer()
repeat 1000
redraw 0
pos 0,0:gmode 0:gcopy 4,0,0,800,600
pos 750,500:color 255,255,255:mes "■":mes cnt
pos cnt\800,550:mes "■"
redraw 1
wait 1
loop
after=d3timer()
result.0=after-before
title "毎回書き換え 計測中..."
before=d3timer()
repeat 1000
redraw 0
pos 0,0:gmode 0:gcopy 1,0,0,800,600
pos 0,0:gmode 7:gcopy 2,0,0,300,600
pos 500,0:gmode 7:gcopy 2,0,0,300,600
pos 100,350:gmode 0:gcopy 3,0,0,600,200
pos 130,380:color 255,255,255:mes "abcdrfg hijklmn opqrstu vwxyz\nabcdrfg hijklmn opqrstu vwxyz\nabcdrfg hijklmn opqrstu vwxyz\nabcdrfg hijklmn opqrstu vwxyz\nabcdrfg hijklmn opqrstu vwxyz"
pos 750,500:color 255,255,255:mes "■":mes cnt
pos cnt\800,550:mes "■"
redraw 1
wait 1
loop
after=d3timer()
result.1=after-before
cls 0:title "結果"
mes "画面ごとコピー での処理時間... "+result.0+"ミリ秒"
mes "毎回書き換え での処理時間... "+result.1+"ミリ秒"

| |
|
2008/4/9(Wed) 01:19:01|NO.15013
全体を毎回描画しなおすと、開発言語に関わらず高負荷になってしまいます。
なので、全体を描画する必要がないときは再描画が必要な箇所だけ再描画するようにし、
画面のフェードインなどが必要な場合に限り、今までデフォルトウィンドウに描画していた
ものを全てバッファに描画しなおすようにするといいとおもいます。
”描画先ウィンドウIDを切り替える”ための仕様が必要になるかもしれませんね。
|
|
2008/4/9(Wed) 16:59:25|NO.15025
計って見ました。
が、なにやら wait が差を吸収してしまっているようで、
殆ど違いが出ませんでした。
Windows XP, AMD Athlon64 3700+(2.19 GHz), 384 MB RAM
画面ごとコピー :15640
毎回書き換え :15625
それで適当にですが、少し改造して改めて計って見ました。
#include "d3m.hsp"
#define MAX 1000
buffer 1,800,600 : color 0,0,255 : boxf
buffer 2,600,600 : color 255,0,0 : boxf
buffer 3,600,200 : color 0,255,0 : boxf
buffer 4,800,600
screen 0,800,600
text = "abcdrfg hijklmn opqrstu vwxyz\n" :text += text + text + text + text
caption = "毎回書き換え", "画面ごとコピー", "画面ごとコピー最小", "画面ごとコピー最小2"
label = *test1, *test2, *test3, *test4
repeat length(label)
title caption(cnt) + " 計測中..."
before = d3timer()
gosub label(cnt)
after = d3timer()
result(cnt) = after - before
wait 10
loop
screen 0 :title "結果"
sdim text, 1024
repeat length(label)
text += caption(cnt) + " での処理時間... " + result(cnt) + "ミリ秒\n"
loop
mesbox text, 640, 480, 4
stop
*test1
repeat MAX
redraw 0
pos 0,0:gmode 0:gcopy 1,0,0,800,600
pos 0,0:gmode 7:gcopy 2,0,0,300,600
pos 500,0:gmode 7:gcopy 2,0,0,300,600
pos 100,350:gmode 0:gcopy 3,0,0,600,200
pos 130,380:color 255,255,255:mes text
pos 750,500:color 255,255,255:mes "■":mes cnt
pos cnt\800,550:mes "■"
redraw 1
await 0
loop
return
*test2
gsel 4:cls
gcopy 1,0,0,800,600
gcopy 2,0,0,300,600
pos 500,0:gcopy 2,0,0,300,600
pos 100,350:gcopy 3,0,0,600,200
pos 130,380:color 255,255,255:mes text
gsel 0
repeat MAX
redraw 0
pos 0,0:gcopy 4,0,0,800,600
pos 750,500:color 255,255,255:mes "■":mes cnt
pos cnt\800,550:mes "■"
redraw 1
await 0
loop
return
*test3
gsel 4:cls
gcopy 1,0,0,800,600
gcopy 2,0,0,300,600
pos 500,0:gcopy 2,0,0,300,600
pos 100,350:gcopy 3,0,0,600,200
pos 130,380:color 255,255,255:mes text
gsel 0
pos 0,0:gcopy 4,0,0,800,600
repeat MAX
redraw 0
pos 750,500:gcopy 4,750,500,32,40
pos cnt\800,550:gcopy 4,cnt\800,550,16,16
pos 750,500:color 255,255,255:mes "■":mes cnt
pos cnt\800,550:mes "■"
redraw 1
await 0
loop
return
*test4
gsel 4:cls
gcopy 1,0,0,800,600
gcopy 2,0,0,300,600
pos 500,0:gcopy 2,0,0,300,600
pos 100,350:gcopy 3,0,0,600,200
pos 130,380:color 255,255,255:mes text
gsel 0
pos 0,0:gcopy 4,0,0,800,600
repeat MAX
redraw 0
pos 750,500:gcopy 4,750,500,32,40
pos cnt\800,550:gcopy 4,cnt\800,550,16,16
pos 750,500:color 255,255,255:mes "■":mes cnt
pos cnt\800,550:mes "■"
redraw 1, 750, 500, 32, 40
redraw 1, cnt\800, 550, 16, 16
await 0
loop
return
毎回書き換え での処理時間... 8203ミリ秒
画面ごとコピー での処理時間... 5266ミリ秒
画面ごとコピー最小 での処理時間... 3735ミリ秒
画面ごとコピー最小2 での処理時間... 63ミリ秒
// 2〜3回ほど書き直しました。何回もスミマセン。

| |
|
2008/4/12(Sat) 11:14:20|NO.15060
Asさん、osakanaさん、ありがとうございます!
Asさんへ>
そうですよね、やはり毎回描画しなおすのは、いくらなんでも…でしたよね。いい案かと
思ったんですが、映像効果のために毎回描写しなおすにしても、せめて背景と人物の絵くらいは
固定してそれを基にやる、など、ちゃんと考えねばなりませんよね…。
osakanaさんへ>
改造までしていただき、お手数おかけいたしました!そして、この結果の差にびっくりです。
まさかwaitが差を無くしていただなんて…。こちらでは、
毎回書き換え での処理時間... 15703ミリ秒
画面ごとコピー での処理時間... 8469ミリ秒
画面ごとコピー最小 での処理時間... 4875ミリ秒
画面ごとコピー最小2 での処理時間... 390ミリ秒
でした。ここまで違うだなんて、書き換え処理の大変さを甘く見ていました。
それと、改造していただいたスクリプトのきれいなこと!自分の煩雑さがいささか恥ずかし
いです;すごく見やすく、今さらながらwaitとawaitの違いを考えることが出来ました。
状況に応じて、再描画をしなくていいものと描画したいものを考え分けて、できる限り書き
換えをしなくていいように頑張ってみます。お二方、ありがとうございました!!
|
|