シフト演算

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ft

シフト演算

#1

投稿記事 by ft » 15年前

こんにちは。PSPにて弾幕ゲーを再現しようと試みております。
ある画像がスライドしながら次第に大きくなっていく状態を300カウントでループし描き続けようと思い、
次のようにしてみました。
A:サイズの倍率
B:初期倍率
C:変化量
として、画像サイズが256カウントでA=1(倍)となり、300カウント後に最初に戻るというものです。
float A,B,C;
int cnt;

B=0.5f;
C=0.5f;
cnt++;
while(300<=cnt)cnt-=300;

A=B+C*(float)cnt/256;
このままでも動作するのですが、複数用いるため/256(*0.00390625fとしております)部分がネックとなりPSP上の動作が不安定です。
そこで/256は右シフトでも表せることを利用したのですが
A=B+C*(float)(cnt>>8);
とやるとうまくいきませんでした。どのように書けばいいのでしょうか?

Justy

Re:シフト演算

#2

投稿記事 by Justy » 15年前


>右シフトでも表せることを利用したのですが

 シフト演算ができるのは整数だけです。

 とりあえず whileを ifにし、cntを floatにしてint->float変換を無くし、
Cの 0.5を定数化して

A=B+cnt*0.001953125f;

とすればわずかに早くなるかもしれませんが、ほとんど効果はないでしょうね……。


 本題とは異なりますが、本当にそこがネックになっているのでしょうか?
 そこがネックになっているとはにわかにはちょっと信じがたいのですが、
パフォーマンスを測定したらその行に問題があった、ということでしょうか?

 あと、試しにコードの最適化オプションをつけてビルドしたり、
或いはその画像の表示命令だけをコメントアウトして実行するとどうなりますか?

ft

Re:シフト演算

#3

投稿記事 by ft » 15年前

256という数字を沢山見て、シフトできる→ここが重い、という考えに直結していました。
ここの描画をコメントアウトしたところ、確かに処理が重くなる原因は他の箇所にある事が分かりました。

あと最適化オプションはどうやるのでしょうか?
VC++を使っておりまして、最適化オプションについて調べてみたのですが、説明していることと表示されるウィンドウがどうも違っておりうまくいきませんでした。

box

Re:シフト演算

#4

投稿記事 by box » 15年前

>  シフト演算ができるのは整数だけです。

質問者さんは

>A=B+C*(float)(cnt>>8);

のように、int型のcntをシフトした「後で」float型に
キャストしています。
指摘になっていないというか、質問者さんが「実際に」行なったことを
なぞっているだけというか…。

Justy

Re:シフト演算

#5

投稿記事 by Justy » 15年前

 ftさん
>ここの描画をコメントアウトしたところ、確かに処理が重くなる原因は他の箇所にある事が分かりました

 実際観てみないことには詳細はわからないのですが、
CPIの負荷でなく描画の負荷が高いという可能性もありそうですね。

 なんにしても一度きちんとパフォーマンスを測定して、
ボトルネックを正確に絞っていった方がいいかと思います。


 最適化オプションの方は makefileの中のコンパイルオプションに -O2とか -03を
つければいいはずです(ひょっとしたらもう付いているかもしれませんが)。


 ftさん、boxさん
>int型のcntをシフトした「後で」float型に キャストしています

 あ、ほんとですね。少し寝ぼけていたようです。
 失礼しました。
 

ft

Re:シフト演算

#6

投稿記事 by ft » 15年前

最適化オプションはどうやら付いていたみたいです。


あと、何度か試しても何か動作がおかしいのでどこかで情報が落ちているのかもしれません。
具体的には画像の大きさがずっと変化しないままスライドしていき、ある時間でいきなり大きく変化する状態です。

Justy

Re:シフト演算

#7

投稿記事 by Justy » 15年前


>大きさがずっと変化しないままスライドしていき、ある時間でいきなり大きく変化する状態です

 それは [color=#d0d0ff" face="sans-serif]A=B+C*(float)(cnt>>8) [/color] の場合の話ですか?
 cntが 256を越えるまで cnt>>8 の結果が 0なので
そういう挙動になるのだと思います。

 元の [color=#d0d0ff" face="sans-serif]A=B+C*(float)cnt/256[/color] にすれば直ると思うのですが、どうでしょう?

ft

Re:シフト演算

#8

投稿記事 by ft » 15年前

やはりそうでしたか、ありがとうございます。元に戻すことにします。
256という数字に妙にこだわり過ぎていました;

ft

Re:シフト演算

#9

投稿記事 by ft » 15年前

やはりそうでしたか、ありがとうございます。元に戻すことにします。
256という数字に妙にこだわり過ぎていました;

閉鎖

“C言語何でも質問掲示板” へ戻る