関数PlgBltの速度について

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

関数PlgBltの速度について

#1

投稿記事 by kazuoni » 15年前

お邪魔します。

回転描写PlgBltの動作について質問に来ました。。
768kb,512×512
の.bmpを回転描写させたいのですが、
FPS=60で管理しているプログラムで、毎ループPlgBltで等倍回転させると、
FPS=43ぐらいに落ちてしまいます。

・回転描写なので、関数sin,cosで遅くなっているのでは?とも思いましたが、
テーブル化してもほぼ変化はありませんでした。

・画像を縮小(0.1倍)回転すると、FPS=55ぐらいには戻ります。

・上で示した画像

・回転させなければ(第二引数lpPointの内容が変化しなければ)FPS=60を保ちます。(PlgBltで描写しても)

これはやはりPlgBltの描写速度の問題でしょうか?
この問題の解決は難しいでしょうか?
DXライブラリもどきが完成したと喜んで、ゲーム制作をしていた矢先・・・。

よろしくお願いします。

softya

Re:関数PlgBltの速度について

#2

投稿記事 by softya » 15年前

PlgBltだと全てソフトで回転させていると思います。
GPUハードで回転を行っているDirectXとは雲泥の速度差かと思いますね。
自前でPlgBlt同等なものをアセンブラで組んでSIMD系の命令を駆使すれば、速度が出るかもしれません。
http://ja.wikipedia.org/wiki/Streaming_SIMD_Extensions

Justy

Re:関数PlgBltの速度について

#3

投稿記事 by Justy » 15年前

 まぁ、GDIですからねぇ。
 一度DXライブラリの GPUを使わないモードで出来るだけ同等に近い条件で
動かしてみて速度を比較してみてはどうでしょう?

kazuoni

Re:関数PlgBltの速度について

#4

投稿記事 by kazuoni » 15年前

持ち上げすみません。。
スレが流れるの速いですね^^;

softyaさん、Justyさんご回答ありがとうございます!

>DXライブラリの GPUを使わないモードで出来るだけ同等に近い条件で動かしてみて速度

やってみました。
グラフィックライブラリimgctlの回転関数も同時に試してみました。
転送速度: DXライブラリ > imgctl ≒ PlgBlt
って感じでした。
(DXライブラリが同じ条件まで持って行けたかどうかが微妙ですが・・・)
ただ、どれも自分の満足できる速さではなかったですorz
これならいっそ、もう仕様にしてしまおうかって思います。。

>自前でPlgBlt同等なものをアセンブラで組んでSIMD系の命令を駆使

確かにその通りだと思います。。
MMXを用いたブレンドにしたって、結構なスピード
がでましたからね・・・。
ただ、アンチエイリアシング・色の平均値による縮尺等の実装・・・
自分にはちょっと敷居が高そうな気がしましたorz

元サイズが大きいと、PlgBltは動作が厳しいんですね。
キャラチップ(32×32)を拡大回転する分なら全然行けるんですけどね。。
これじゃ使い物にならないw

っというわけで、そろそろこの自作DXライブラリもどきはお蔵入りさせます。
記念に管理人さんの作成された
「リンゴ落ちゲーミク」
をそのまま移植してみました。

http://kissho.xii.jp/1/src/1jyou96588.zip.html
DLキー kazuoni

まぁ、音声ファイルは潜在的なバグのおかげで、
今回はならないようにしていますが^^;
DXライブラリをまねしただけなので、
移植はすぐ出来てしまうんですが。。

今回は、管理人さんの用意された素材を使用させていただきました。
この場をお借りして御礼申し上げます。

時間があったら、またアセンブリでPlgBltを実装してみたいと思います。
(おそらくないとは思いますけど・・・w)
一度、ここで解決とさせていただきます。

次回もよろしくお願いします。

ペータ

雑魚敵の出現エフェクト

#5

投稿記事 by ペータ » 15年前

画像のように敵が出現する時にエフェクトが入るようにしたいと思い、コードを作りましたが
思うように表示されませんでした…。
敵の行動パターンはhttp://dixq.net/rp/12.htmlのパターン9で
画面にいきなりでてくるのをエクセルで指定しました。
敵は表示されるのですが、エフェクトが表示されないのです…。
エフェクトは0から4の5枚で
16カウントの間に
カウントの値 3,6,9,12,15 でエフェクトが順番に表示されるようにしています。
これはenemy.flagが1になったら、i番目のエフェクトのフラグも1にして、i番目のカウントの値が
16以上になったら、i番目のエフェクトのフラグをオフにするという方法です。
app.sizeについてですが、最初はi番目のsizeに3.2と大きめに値を代入し、徐々に
0.2ずつ、縮小しています。
struct.h-------------
struct apper_t{
	int size,flag,cnt;
};
GV.h-------------
GLOBAL apper_t app[ENEMY_MAX];
void graph_appeff(){
	int i;
	for(i=0;i<ENEMY_MAX;i++){
		if(enemy.flag==1){
			app.flag=1;
			SetDrawBlendMode( DX_BLENDMODE_ADD, 225) ;
			DrawRotaGraphF(enemy.x+FX+dn.x,enemy.y+FY+dn.y,app.size,0.0f,img_app_effect[0][app.cnt],TRUE);
			SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0) ;
			if(app.cnt<16){
				if(app.cnt==0)
					app[i].size=3.2;
				if(app[i].cnt%3==0){
					app[i].cnt++;
					app[i].size-=0.2;
				}
				if(app[i].cnt>=16){
					app[i].flag=0;
				}
			}
		}
	}
}

どなたか、お力をお貸し頂けないでしょうか…?

チルチル

Re:雑魚敵の出現エフェクト

#6

投稿記事 by チルチル » 15年前

とりあえず敵出現時に

DrawRotaGraphF(enemy.x+FX+dn.x,enemy.y+FY+dn.y,app.size,0.0f,img_app_effect[0][app.cnt],TRUE);

を通っているのでしょうか?

閉鎖

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