投稿
自作関数、 HSV関数とHSL関数の テストプログラムを作っています。 で、このプログラムを 更に高速化したいです。 「○○と書くより、 □□って書いた方が早いよー。」 みたいな、アドバイスをお願いします!
5そうだね
プレイ済み
返信[1]
親投稿
ちなみに、 この状態でかかる時間は、画像の通りです。 目標10フレーム!(無理かな?w 色指定画面を作るのに辺り、 明度や輝度を変えるたびに 書き直せる位の早さにしたいです!
0そうだね
プレイ済み
返信[2]
親投稿
InDoor TheInDoor12
いくつか書いてみますが、間違っているものがあるかもしれないです。 特に、下の2つは怪しい… ・UNTILの100<=Yを100==Yに ・IFの100<=Xを101==Xに ・120+Yを一時置き変数に入れて使う ・CONTINUEを使っている部分を、IF~ENDIFの形にまとめCONTINUEを省く(X=X+1を2回書く必要がなくなり少しスッキリする効果あり)
0そうだね
プレイ済み
返信[3]
親投稿
けい kei0baisoku
直接のアドバイスではないのですが、高速化を探す方法について。 プログラムの処理の重さって人間の作業の時間と違って、まんべんなく時間を食うわけでなく、特定の一行や数行だけが処理時間のほとんどを占めてたりします。 なのでまずは、具体的にどの行がどれだけ時間を使ってるのか調べてみるのオススメです。 この場合ですと例えば、対象の行の範囲から一部分だけをコメントアウトして時間がどうなるかを見てみるとかになると思います。 パッと見た感じ、HSVとHSLの命令が怪しい気がします。 VとLはループを回す間変わらないので、ループの前に計算の一部を済ませたりできないでしょうか?
0そうだね
プレイ済み
返信[4]
親投稿
マギー M191246
半径を小さくすると早くなります。 それと、もし自作関数の中で RAD関数を使っているとしたら、 それを省略することはできないでしょうか?
0そうだね
プレイ済み
返信[5]
親投稿
れい rei-nntnd
高速化の方法はもうだいたい決まってる。 1. よりよいアルゴリズム・方法にする。 2. 無駄な計算を省く。 あとプチコンではダメだけど 3. コードを小さくする 4. 並列化する なんてのがある。 例えばさっきちょっと作ってみたけど、xxxxxを利用して3DSのハードにxxxxxをさせることで1フレーム未満で描画できる。これが1の方法。 2の方法は細かくはいろいろある。 同じ計算をしない。配列のような遅い計算を減らす。ループ・関数を展開する。etc. この方法でちょっと描いてみたら、直径128の円でおおよそ4フレームで描けるものができた。 下に貼っとくけど、見る前に考えた方が面白いかな。
0そうだね
プレイ済み
返信[6]
親投稿
れい rei-nntnd
4フレーム。 1フレームはちょっとずるいwから後で
0そうだね
プレイ済み
返信[7]
親投稿
うわぁ。なんか間違えたみたい。(画像 皆さんアドバイス ありがとうございます! れいさん» なんか色々また知らないものが 書いてあったり・・・。 「<」とか。 勉強しなきゃ! とりあえず、 自分のプログラムを見直して、 それでもうまくいかなかったら、 使わせてもらいます♪
0そうだね
プレイ済み
返信[8]
親投稿
れい rei-nntnd
使うか使わないかじゃなく、どこが違うか見たほうがいいんじゃないかな まず、円って対象だよね Xとyと、それぞれ-100から100までループしてるけど、 0から100まででよくない?
1そうだね
プレイ済み
返信[9]
親投稿
なるほど!そういう事だったのか! ありがとうございます!!! ちなみにこれだけ(画像)で、 107フレームになりました。
0そうだね
プレイ済み
返信[10]
親投稿
MIKI ifconfig
v違いで画像保存しといて随時 load する。 これが意外と速い7フレーム
0そうだね
プレイ済み
返信[11]
親投稿
麗さん» わかったつもり。102frame みき★さん» な、なるほど・・・。 その発想は無かった・・・。
0そうだね
プレイ済み
返信[12]
親投稿
MIKI ifconfig
s=sqr(x*x+y*y) if s<100 ... は ss=x*x+y*y if ss<10000 .. s=sqr(ss) のが全体としてはちょっと速い。
0そうだね
プレイ済み
返信[13]
親投稿
関数の中の範囲を見るIF文を、 消去法で見るようにしたら、 100フレーム越えました! みき★さん» そうですね。ありがとうございます!
1そうだね
プレイ済み
返信[14]
親投稿
ぬに?変わらなかっただと!? 97frame
0そうだね
プレイ済み
返信[15]
親投稿
れい rei-nntnd
90行目、xおかしいよね? Y*Yは毎回計算する必要ある? Ss%が10000を越えたら、次のループでss%っていくつになる? 10000よりさがることってある?
0そうだね
プレイ済み
返信[16]
親投稿
更にループを減らして高速化を図った。 れいさん» なるほど!円の外に出たら、 また円に入るまでループを飛ばせばいいんだ!
0そうだね
プレイ済み
返信[17]
親投稿
れい rei-nntnd
HSV関数のなかみもよくみてみよう HSV(H%,...)とHSV(-H%,...)を、毎回計算してるけど…
0そうだね
プレイ済み
返信[18]
親投稿
ふぅ。そろそろ疲れてきた。 テスト期間中だし・・・。 学校の勉強もしなきゃ・・・。 94frame れいさん» 2回も計算しないで済む方法・・・。 どうやってやるんだろう? ヒント下さい!
0そうだね
プレイ済み
返信[19]
親投稿
そもそも、 HSVとHSLを単体で動く関数にするのが 間違っているのかな。 今更、れいさんの作った プログラムの意味がわかった。 1の方法がどういう事なのか すっごく気になる。
0そうだね
プレイ済み
返信[20]
親投稿
彩度の計算を先にやってしまって、 後で色相だけ個別にしてみた。 これが結構よかった。66frame やっぱり、HSV関数とHSL関数は、 もう使わなくて良いや! 出来るだけこの円を早く描写 出来るようにして、GSPOITで取得するわ♪ そうと決まったら、目標は30fpsだ!
0そうだね
プレイ済み
返信[21]
親投稿
れい rei-nntnd
1フレームの方法は、スプライトの透明処理をつかう。 プチコンのスプライトの半透明合成は乗算、かけ算になっていて、 HSVでV方向はRGBではただのかけ算になってる。 なので、黒いスプライトを重ねて、透明度を指定すればVの指定に代えられる。 最初にV=100%の円を描いて、上に黒い円を重ねておく。 Vが変わるたびにスプライトの透明度を適切に設定すればいいだけ。 0.1フレームも要らない。
0そうだね
プレイ済み
返信[22]
親投稿
なるほど! で、色は自作関数で 取得すればいいんですね♪ 待てよ・・・? HSLは、どうする? 白いスプライトを重ねるんですか?
0そうだね
プレイ済み
返信[23]
親投稿
れい rei-nntnd
いいや。 半透明にするときどういう処理されてるか調べればわかる。 半透明処理ってSPCOLORでやるんだが、これも色を引数にとるよね。 下地の色、スプライトの色、SPCOLORで指定する色。 この3つで実際の表示色が決まる。 場合によってはさらにスプライトが重なるよね。 以上ヒント終わり。
0そうだね
プレイ済み
返信[24]
親投稿
うーん。検索してみたけど、 乗算ってつまり、 色1*色2/250 みたいな計算してるんですよね? スプライトだと、 スプライト色*SPCOLOR色/255 って事になるのかな。 背景も計算に入れると、 (スプライト色*SPCOLOR色/255)*透明度*背景色/255 かなぁ・・・? テスト勉強に追われているので、 半分以上が勝手な思い込みですが、 合ってますかね? って言うか、まず、HSLがどんな処理してるか理解することからか・・・。
0そうだね
プレイ済み
返信[25]
親投稿
れい rei-nntnd
惜しいね
0そうだね
プレイ済み
返信[26]
親投稿
とりあえず、円をスプライトに定義して、 SPCOLORで、暗くしてみた。
0そうだね
プレイ済み
返信[27]
親投稿
ん? SP=スプライトの色 SPC=SPCOLORの色 A=SPCOLORの透明度 BG=背景色 とすると、表示色は、 (SP*SPC/255)*(A/255)+(SP*SPC/255)*BG/255*(1-A/255) かな?
0そうだね
プレイ済み
返信[28]
親投稿
あ、もしかして (SP*SPC/255)*(A/255)+BG*(1-A/255) が、正解かな? 後で、スプライトとくらべてみょう。
0そうだね
プレイ済み
返信[29]
親投稿
なんか違う(`・ω・´;)
0そうだね
プレイ済み
返信[30]
親投稿
リストこれです。 どっかで致命的なミス犯してないかな?
0そうだね
プレイ済み
返信[31]
親投稿
れい rei-nntnd
モザイクかけた砂漠に生えるサボテンの絵か。
0そうだね
プレイ済み
返信[32]
親投稿
お、やったぞー!できたぁ(´^ω^`;) ちなみに、 スプライトの色は、緑で、 SPCOLORの色は、黄色で、 SPCOLORのアルファチャンネルは、100です。
0そうだね
プレイ済み
返信[33]
親投稿
れい rei-nntnd
その式だと黒いスプライトだと透明度や背景色に関わらず全て真っ黒になるじゃん。
0そうだね
プレイ済み
返信[34]
親投稿
おっと、また入れ違った。 サボテン・・・w 確かにそう見えなくもないww
0そうだね
プレイ済み
返信[35]
親投稿
正しい式が出来たみたいです。
0そうだね
プレイ済み
返信[36]
親投稿
れい rei-nntnd
微妙にちがうね。 プチコンのグラフィックの色は下位3ビット意味ないってのを考慮にいれた式にしたほうがいいかな
0そうだね
プレイ済み
返信[37]
親投稿
下位3ビットと言うと・・・。 どういう事ですか? 少数第4位って事かな・・・?
0そうだね
プレイ済み
返信[38]
親投稿
ああ!もうこんな時間。 明日学校だし寝ないと・・・。
0そうだね
プレイ済み
返信[39]
親投稿
れい rei-nntnd
255で塗ったものをGSPOITすると248になるのさ
0そうだね
プレイ済み
返信[40]
親投稿
あーなるほど。 じゃあ、255で割ってるところを 248で割った方が精度が上がるとか そういうのかな?
0そうだね
プレイ済み
返信[41]
親投稿
式を整理してみた。 ちょっとスプライトを近付けてみると、 なんか、微妙にグラフィックの方が 濃い気がする。
0そうだね
プレイ済み
返信[42]
親投稿
興味深いものができた。 8づつ上がってく・・・。 こうゆー事かぁ。 で、これをふまえたうえで、 どうしたら完璧ですかね?
0そうだね
プレイ済み
返信[43]
親投稿
れい rei-nntnd
R*SPR*SPA>>16+BGR*(256-SPA)>>8 あたりのはずなんだけど、おかしいね。 バグありだ。
0そうだね
プレイ済み
返信[44]
親投稿
れい rei-nntnd
横に背景濃度、横にスプライトの透明度。 左上の方逆転してるところある。
0そうだね
プレイ済み
返信[45]
親投稿
横・・・。 どっちがどっちですか?
0そうだね
プレイ済み
返信[46]
親投稿
れい rei-nntnd
あーミスった。 下に行けばいくほど背景が濃い緑。 左に行けばいくほど透明なスプライト。 なので、左下が一番明るくて、右、上にいくほど暗いはず。 なのにY=128あたりでや左上で明るさがなめらかに変わってない
0そうだね
プレイ済み
返信[47]
親投稿
と、まぁ。それはともかく、 HSLの輝度をスプライトであらわすには、 どのようなプログラムにすれば・・・。 自分で考えてはみたんですけど、 うーん。
0そうだね
プレイ済み
返信[48]
親投稿
わからなかったから、 とりあえず自分なりに作った。
0そうだね
プレイ済み
返信[49]
親投稿
結局、白いスプライト重ねてるし!
0そうだね
プレイ済み
返信[50]
親投稿
れい rei-nntnd
できてんじゃんw HSLは加算がいるから、スプライトの合成でどう加算するかが重要で、以前は2枚以上つかってうまく透明度合わせなきゃいけなかったんだが 今は加算合成できるから上に重ねるだけでできるね
0そうだね
プレイ済み
返信[51]
親投稿
え、これでよかったの!? わぁああああああいいいいいいい!!! 色々教えてくださって、 ありがとうございました! それでは、早速、色指定画面作りに 取り掛かりたいと、思います!
0そうだね
プレイ済み
返信[52]
親投稿
れい rei-nntnd
あ、いや、入れ違い。 コードは読んでない。 できたっていうからできてるんだろうなと。
0そうだね
プレイ済み
返信[53]
親投稿
SPCOLOR 1は、HSLのベース SPCOLOR 2は、白いスプライト あってますように・・・!
0そうだね
プレイ済み