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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0206
速度の向上7未解決


リンク

2011/2/6(Sun) 11:01:49|NO.36898

シャッフルゲームを作成しているのですが
なかなか速度が上がりません。
1回のシャッフルの描画回を落とすとなんというかちらつく感じで…
1回の動作で描画するのは
カップ 5つ
背景
メッセージ用の枠
なんですが
私のPCでは 一回の入れ替えを30回描画した時
おおよそ500ミリ秒でした
一回の入れ替えの描画回数を落とす以外に何かいい方法はありませんでしょうが?
ちなみに計算はそこまで与えていませんので表示の問題かと思うのですが



この記事に返信する


ORZ

リンク

2011/2/6(Sun) 11:42:21|NO.36899

画像のサイズ、使用しているライブラリなどの説明がなければわかるわけがなかろう。
君が必死に頭の回転速度を上げて描写した文章は一切忘れて、ソースコードを張りなさい。

・・・30回描画で500ミリ秒ってことは60fps出てるよな。



てれてれ

リンク

2011/2/6(Sun) 12:11:29|NO.36900


randomize dim p1,4 :dim p2,4 :dim p3,2 p1=10,40,50,0 : p2=0,0,50,50 : p3=$0000FF,$000000,$000000,$0000FF buffer 1 :cls 4 :gsquare -257,p1,p2,p3;カップ作成 screen 0,550,150 dim cx,5;カップのX座標 dim cy,5;カップのY座標 repeat 5 cx(cnt)=cnt*100+50;初期のX座標 cy(cnt)=50;初期のY座標 loop gmode 2 flg=3;処理を区別 sp=100.0;1度の入れ替えに要するループ回数 repeat if flg=1{;新しい座標を設定 dim lk,5;新しい座標の重複を防ぐ dim nx,5;新しい座標 ddim msp,5;カップそれぞれの移動速度 repeat 5 lk(cnt)=-1 loop repeat 5 lk(cnt)=rnd(5) cn=cnt repeat 5 if lk(cnt)=lk(cn) and cnt!=cn{ lk(cn)++ if lk(cn)=5:lk(cn)=0 continue 0 } loop nx(cnt)=lk(cnt)*100+50;新しい座標 msp(cnt)=double(nx(cnt)-cx(cnt))/sp;移動速度 loop flg=2 } if flg=2{;移動処理 repeat 5 if absf(nx(cnt)-cx(cnt))<absf(msp(cnt)){;移動が終わったかどうか cx(cnt)=nx(cnt);座標を調整 msp(cnt)=0.0 continue } cx(cnt)+msp(cnt) loop repeat 5 if msp(cnt)!=0.0:break if cnt=4:flg=3;全てのカップの移動が終わっているか loop } redraw 0 color 255,255,255:boxf repeat 5 pos cx(cnt),cy(cnt) gcopy 1,0,0,50,50;描写 loop color 0,0,255 : gradf 0,100,550,150,1,$FF0000,$000000;台を描写 redraw 1 if flg=3{;スピード変更 wait 20 flg=1 sp-10 if sp<=0:sp=10.0 title "SP="+sp+"" } await 20 loop
描写回数を落とさないのであれば
ウェイト数を変更するほかないかもしれません。



リンク

2011/2/8(Tue) 00:00:06|NO.36950

えっとすみません
背景が     800*600 
カップ     140*200 
メッセージ枠  600*200

標準命令の ceload celput を使っています
スクリプトは実行できる形ではありませんがこんな感じです
gosub*カップ ですべての描画を行います
waitもawaitも入れてないのですが
やはり描画数を落とすしかないんでしょうかね

//移動量を求める if cupx(koukann)>cupx(koukann2){ idou=cupx(koukann)-cupx(koukann2) big=1 }else{ idou=cupx(koukann2)-cupx(koukann) ookii=2 } //移動量をfpsで割って1フレーム当たりの移動量を決める amari=idou\fps idou=idou/fps repeat fps redraw 0 gosub *初期化1 pos 140,50 color 0,0,0 mes"シャッフル中…"+syahhuru+"回目" color 255,0,255 //移動量をfpsで割って余った数は後でたす if cnt<amari{ amaritasu=1 }else{ amaritasu=0 } //座標を更新 if big=1{ cupx(koukann)-=(idou+amaritasu) cupx(koukann2)+=(idou+amaritasu) }else{ cupx(koukann)+=(idou+amaritasu) cupx(koukann2)-=(idou+amaritasu) } gosub *カップ redraw 1 loop



先輩

リンク

2011/2/8(Tue) 01:09:08|NO.36954

関係ないけど、ただ単に日本語名の変数をローマ字で使用するくらいなら、
koukann は 交換
idou は 移動
ookii は 大きい
syahhuru は シャッフル
のほうが読みやすくありません?
koukanやokkii、syahuruなど変数名のタイプミスにつながりますよ。
それが結局、
「0でないところで変数が0になって挙動不審なんです。どこが悪いのか教えてください。
「タイプミス。
「あっうっかりしてました。ありがとうございます。
って定番パターンになるんですから。

んで、画面がちらつく症状ですがたぶんfpsにつよいほかの方がfpsについてつっこんでくれると思うので、
僕からは別角度でお話しますね。
>repeat fps
> redraw 0
> gosub *初期化1
> //移動量をfpsで割って余った数は後でたす
> //座標を更新
> gosub *カップ
> redraw 1
>loop
ってことですが、
1:ループ中に何度も「初期化1」してますけど、何度も必要な処理なのですか?
2:「カップ」ですべての描画を行うということなので、このループ処理で一番処理時間を考えなきゃいけないのは
  「カップ」なのでは?よって掲載すべきプログラムコードは「カップ」と思われます。
  処理手順を指して「アルゴリズム」と言う人はよくいますけど、「オーダー」に触れないアルゴリズマーは
  アルゴリズムの本質を理解してない方だと思っちゃいます。

  一般的に「初期化」は重い処理になることが多いです。重い処理なので実行中に1度だけやろう、1度だけ、だから「初期」なのです。
  このプログラムの「初期化1」が重い処理でなければ別にかまいませんが。

  一般的にこのプログラムのネックを考えるとループ中何度も呼び出されている「初期化1」と「カップ」の処理で、
  このプログラム(ループ中)のアルゴリズムのオーダーは支配されているのでそこを見直す必要があると思います。


原因がfpsでしたらお門違い申し訳ありません。



リンク

2011/2/8(Tue) 01:32:45|NO.36957

>関係ないけど、ただ単に日本語名の変数をローマ字で使用するくらいなら、
私はこちらのほうがよかったしほかの言語ではこういうことができるものは少ないので、いつもこうしています。
ですが今回日本語のほうが読みやすいとのことですので
スクリプトについてなんですがいくつかミスがあったために再度載せさせていただきます
問題のミス部分のいつの
gosub*初期化1 の先は return だけとなっていましたが、処理に負荷がかかったとはあまり考えられないです
[カップ]ラベル先は 本当に描画しかしていないので省いてしまいました。すみません

repeat fps redraw 0 //フレームが半分になれば元の位置に下げていく if cnt=fps/2{ if big=1{ 一時=交換2 交換2=交換 交換=一時 big=2 }else{ 一時=交換2 交換2=交換 交換=一時 big=1 } } //移動量をfpsで割って余った数は後でたす if cnt<amari{ 余りを足す=1 }else{ 余りを足す=0 } //座標を更新 if big=1{ cupx(交換)-=(移動+余りを足す) cupx(交換2)+=(移動+余りを足す) }else{ cupx(交換)+=(移動+余りを足す) cupx(交換2)-=(移動+余りを足す) } gosub *カップ redraw 1 loop *カップ pos 0,0 celput 1 pos 0,0 celput 2 //カップの描画 repeat 5 pos cupx(cnt),400 celput cnt+3 loop return



先輩

リンク

2011/2/9(Wed) 01:09:13|NO.36977

同じかどうか細部まで読んでいませんが、変数名を変更しただけのスクリプト掲載はリソースの無駄遣いです。



先輩

リンク

2011/2/9(Wed) 01:15:19|NO.36978

>gosub*初期化1 の先は return だけとなっていましたが
そうですね。まるで他人が書いたかのような言い回しのため、負荷がかかっていたかどうか推測されなかったので
今回見返して負荷がかかっていないと推測されたようですね。
おっしゃるとおりreturnだけならオーダーはO(1)とみてよさそうですね。

>[カップ]ラベル先は 本当に描画しかしていないので省いてしまいました。すみません
いえいえ謝ることはありません。
本当に描画しかしていないのなら、あえて「全て」と強調しなくてもよかったのではと
思うところはありますが、描画に負荷がかかっていないのなら、
私にはお手上げです。


やはり問題はfpsだったようですね。fpsの達人にバトンタッチします。



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