スプライトの表示について

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

スプライトの表示について

#1

投稿記事 by 七篠 » 15年前

環境  
OS : Windows7 home
コンパイラ名 : VC++ 2008EE, Microsoft DirectX SDK (November 2008)

大きく分けて2点わからないので教えていただければ幸いです。
DirectX9ベースで個人勉強中です。

スプライト機能を使って複数枚のテクスチャ(それぞれ大きさが違う)をなるべくメモリ使用を押さえて一度で表示させたいと思っています。
一枚表示は成功しているのですが複数枚にしようとしたとき、メモリ領域のどこをテクスチャ枚数分確保したらいいのかわからない状態です。(どこをいじったらいいのかわからないです)


描写なのですが、g_pD3DDev->BeginScene()と g_pD3DDev->Release();は1フレーム中に何度も呼び出してよいものでしょうか。
単純に読み出し回数が多くなるとそれだけ遅くなるというだけなのでしょうか?
同フレーム中に呼び出したら前に描写したものは消えてしまうとかならないでしょうか?

添付が現在いじっているファイルになります。

シエル

Re:スプライトの表示について

#2

投稿記事 by シエル » 15年前

私も2週間ほど前から、DirectXを個人勉強中で、スプライトの描画を勉強中です。
もう拡大、回転、アルファブレンド等は出来るようになりました。

私の描画方法としては、LPDIRECT3DTEXTURE9型の変数を画像枚数分用意しておいて、
D3DXCreateTextureFromFileExで画像を枚数分読み込み表示しています。
PNG形式等でも読み込めるので、そんなにメモリは消費しないので、
一度読み込んだらゲームを終了するときまで、私はメモリから解放してません。

私の描画方法としては、
ゲーム起動時にIDirect3D9のインスタンスとIDirect3DDevice9のデバイスとD3DXCreateSpriteでスプライト作成

g_pD3DDev->Clear()とg_pD3DDev->BeginScene()とg_lpD3DXSprite->Begin()呼び出し

g_lpD3DXSprite->Drawでバックバッファに描画したいだけ描画

g_lpD3DXSprite->End()とg_pD3DDev->EndScene()呼び出し

g_pD3DDev->Present呼び出して、実際の画面に反映

ゲーム終了時に各スプライトと、デバイス、インスタンスをReleaseで解放。

というような、流れをループさせて処理させています。

BeginとかEndとか呼び出しすぎると、処理がかなり遅くなったので、
呼び出すのはループの最初と最後だけでいいと思います。
デバイスを解放もゲームの終了時だけで良いと思います。
テクスチャの読み込みとか、描画とかは毎回コードを書くのは面倒なので、
関数化したほうが効率良いです。

また、私はDirectXを勉強するにあたって、下記のサイト様を参考にさせていただきました。
http://toruweb.web.fc2.com/
http://sky.geocities.jp/kmaedam/directx9/directx9.htm

初心者でまとまりのない文章ですが、参考になれば幸いです。
画像

ideyan

Re:スプライトの表示について

#3

投稿記事 by ideyan » 15年前

こんばんは。
私もDirectX9ベースで色々勉強中の人です^^

1ですが、私は
ループの開始でBeginScene()、ループの最後でEndScene()とPresent()を呼んでます。
スプライトのBegin(),End()は描画用の関数の中で毎回呼んでました^^;
複数枚用意したい場合は、シエルさんの方法で大丈夫だと思います。

2の方ですが、g_pD3DDev->Release();は
呼んだ時点でデバイスを解放してしまうので2回以上呼ぶと困ったことになります。
g_pD3DDev->BeginScene(),g_pD3DDev->EndScene()は、
計測したことないのでちゃんとしたことは言えませんが、
遅くなるような気がするので毎ループ1回ずつ呼ぶのがいいと思います。
複数回呼んでも、バックバッファをクリアしない限りは
前に描写したものが消えると言う事は無いと思います。


後、気になったことを一つ。
前の回答で、シエルさんが
>PNG形式等でも読み込めるので、そんなにメモリは消費しないので、
と仰っていますが、
これが、例えば「BMPに比べてPNGはサイズが小さいので、ロードしてもメモリ消費は小さい」、
といった趣旨の発言でしたら間違っているような気がします。
PNGであろうとBMPであろうと D3DXCreateTextureFromFileEx で画像を読み込むときに
D3DFMT_A8R8G8B8のフォーマットを指定したとすれば、
4バイト(ARGBそれぞれ1バイト)×縦のピクセル数×横のピクセル数 だけのメモリを消費します。
(ミップマップ等の設定もあるので、厳密にはもっと消費しますが、そこは割愛)
私の勘違いでしたら、ごめんなさい。

七篠

Re:スプライトの表示について

#4

投稿記事 by 七篠 » 15年前

シエルさんideyanさんありがとうございました。不恰好ですが、複数表示のめどが立ちました。

具体的にわからなかったのはどの型を複数枚分持つかでしたが、シエルさんのおかげで検討がつきました。
IDirect3DTexture9 *pTex[枚数分]; で何とかなりそうです。



しかし不勉強でLPDIRECT3DTEXTURE9とIDirect3DTexture9の違いがいまいちわかっていないのでもっと文献よんで煮詰めていこうと思います。

画像データのメモリ上に上げたメモリ使用量はほかのゲーム作成ツールでも同じような事を言っていたのでideyanさんのほうがあっている気がします。ハードディスク上の容量ということなら確かにPNGは少ないですし半透明情報も持ってくれるので扱いやすいですね。

皆様も勉強がんばってください。重ねてありがとうございます。

シエル

Re:スプライトの表示について

#5

投稿記事 by シエル » 15年前

>>しかし不勉強でLPDIRECT3DTEXTURE9とIDirect3DTexture9の違いがいまいちわかっていないのでもっと文献よん>>で煮詰めていこうと思います。

IDirect3DTexture9のポインタ型がLPDIRECT3DTEXTURE9です。
別にIDirect3DTexture9 *pTex[枚数分]のようにIDirect3DTexture9へのポインタ変数を枚数分作って使用しても
問題なかったと思います。

メモリの件は私の知識不足です。。。もっと勉強します。。。

閉鎖

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