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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0409
coin一括描写と毎回描写の速さの違い3解決


coin

リンク

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+"ミリ秒"



この記事に返信する


As

リンク

2008/4/9(Wed) 01:19:01|NO.15013

全体を毎回描画しなおすと、開発言語に関わらず高負荷になってしまいます。

なので、全体を描画する必要がないときは再描画が必要な箇所だけ再描画するようにし、

画面のフェードインなどが必要な場合に限り、今までデフォルトウィンドウに描画していた

ものを全てバッファに描画しなおすようにするといいとおもいます。




”描画先ウィンドウIDを切り替える”ための仕様が必要になるかもしれませんね。



osakana

リンク

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回ほど書き直しました。何回もスミマセン。



coin

リンク

2008/4/12(Sat) 11:14:20|NO.15060

 Asさん、osakanaさん、ありがとうございます!

Asさんへ>
 そうですよね、やはり毎回描画しなおすのは、いくらなんでも…でしたよね。いい案かと
思ったんですが、映像効果のために毎回描写しなおすにしても、せめて背景と人物の絵くらいは
固定してそれを基にやる、など、ちゃんと考えねばなりませんよね…。

osakanaさんへ>
 改造までしていただき、お手数おかけいたしました!そして、この結果の差にびっくりです。
まさかwaitが差を無くしていただなんて…。こちらでは、
毎回書き換え での処理時間... 15703ミリ秒
画面ごとコピー での処理時間... 8469ミリ秒
画面ごとコピー最小 での処理時間... 4875ミリ秒
画面ごとコピー最小2 での処理時間... 390ミリ秒
でした。ここまで違うだなんて、書き換え処理の大変さを甘く見ていました。
 それと、改造していただいたスクリプトのきれいなこと!自分の煩雑さがいささか恥ずかし
いです;すごく見やすく、今さらながらwaitとawaitの違いを考えることが出来ました。

 状況に応じて、再描画をしなくていいものと描画したいものを考え分けて、できる限り書き
換えをしなくていいように頑張ってみます。お二方、ありがとうございました!!



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