[過去ログ] Delphiゲームプログラミング相談室 (976レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
546: 544 [sage] 04/06/21 17:49 ID:hUNg5P7j(2/2) AAS
追伸、Idleで動作させても50FPS程度です。
547
(1): 名前は開発中のものです。 [sage] 04/06/21 20:26 ID:C5bKRRLU(1) AAS
>>544
544(3): 名前は開発中のものです。 [sage] 04/06/21 16:57 ID:hUNg5P7j(1/2) AAS
JEDIのDX9ヘッダを使用しているのですが、困っています。
以下のコードでActiveはプロジェクトファイルの中でフォーム作成直後に呼ばれる関数で、Timer_RenderはTTimerコンポーネントでIntervalは1で動かしています。また、フォームのクライアントサイズは640*480です。
var
D3D9:IDirect3D9;
Dev:IDirect3DDevice9;
procedure TMainWindow.Active;
var
d3dpp:D3DPresent_Parameters;
begin
D3D9:=Direct3DCreate9(D3D_SDK_VERSION);
ZeroMemory(@d3dpp,SizeOf(d3dpp));
d3dpp.Windowed:=true;
d3dpp.SwapEffect:=D3DSWAPEFFECT_DISCARD;
D3D9.CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,Handle,D3DCREATE_HARDWARE_VERTEXPROCESSING,@d3dpp,Dev);
Timer_Render.Enabled:=true;
end;
procedure TMainWindow.Timer_RenderTimer(Sender: TObject);
begin
Dev.Clear(0,nil,D3DCLEAR_TARGET,$000000FF,1.0,0);
Dev.BeginScene;
Dev.EndScene;
Dev.Present(nil,nil,0,nil);
end;

このプログラムは最低限のデバイス作成と画面の初期化だけを実行するものです。
フレームレートが33FPS前後しか出ず、困っております。
ご助言よろしくお願いします。

私の環境は、WindowsXP+Delphi7ProでPentium4の3.4GHz、GeForceFX5950Ultraで測定しました。
d3dpp.PresentationInterval:= D3DPRESENT_INTERVAL_IMMEDIATE;
は?
548
(1): 544 [sage] 04/06/22 09:38 ID:yy2X6pb6(1) AAS
>>547
ありがとうございます。無事60FPS以上出ました。
ヘルプにフルスクリーンでしか意味ないようなこと書いていたので試してませんでした(^^;
549: 名前は開発中のものです。 [] 04/06/23 11:37 ID:175oP9wI(1) AAS
>>548
60FPS以上いくと不安定になるVGAもあるみたいだから
注意してちょんまげ
550
(1): 名前は開発中のものです。 [sage] 04/06/24 12:26 ID:WbJlnPwQ(1) AAS
フルスクリーンとウィンドウの切り替えは、
D3DPresentParametersのWindowedを変更してデバイスをResetするだけでは駄目なんでしょうか。
上記の方法でやろうとすると、フルスクリーンからウィンドウになったときにタイトルバーが消えてしまいます。
FormのBorderStyleをbsNoneにしたような感じですが、この状態でBorderStyleを変更しても変化がありません。
正しく切り替えるにはどのようにしたらいいでしょうか。
551
(4): 名前は開発中のものです。 [sage] 04/07/24 05:11 ID:xpKa1okG(1) AAS
QD3を使ってのゲーム作成を始めました。
fpsなどの情報をTextOut()や、それに近いもので表示させようと思っています。
現行の処理(OnIdleにて):

D3DDevice.BeginScene();
  PushSprite(); // BitMapを多数配置
  Sxw := TSXTextWriter.Create();
  Text[n] := Sxw.CreateStringTexture();
  PushSprite(); // 上で作成した文字列のテクスチャをいくつか
D3DDevice.EndScene();
D3DDevice.Present();
  Text[n].Free// 上で作成した文字列のテクスチャの解放
  Sxw.Free;

のようにして、TSXTextWriterを使用していますが、
テキストのテクスチャ数が増えるに連れて、大変重たくなってしまいます。
きっともっと良い描画方法があると思うのですが、
メモリデバイスコンテキスト等も上手くいかず、苦戦しております。
何かヒントをいただけないでしょうか?
552
(2): 名前は開発中のものです。 [sage] 04/07/24 20:45 ID:PnrKgcAc(1) AAS
>551
シーン描画毎にテクスチャとTSXTextWriterをクリエイトする意味あんの?

文字列に変化ある時に書き換えるだけじゃだめなんか。
553: 551 [sage] 04/07/25 03:26 ID:TtxXwPsH(1/3) AAS
>>552
ゲームのスコアを表示させているため、
かなりの頻度で文字列が変化してしまうもので…。
ですが、ご指摘の通り、TSXTextWriterは毎回生成・破棄する
必要がないため、FormCreate/Destroyに移動させました。

もしかしてTBitmap.Canvasとか使った方がいいんでしょうかね?
引き続き色々試してみようと思います。
554
(2): 名前は開発中のものです。 [sage] 04/07/25 14:02 ID:y86X+J8o(1/3) AAS
テクスチャの描画毎の生成破棄も相当コスト高いとおもうけど。

ふつうにあらかじめ確保したテクスチャにWriteすべきでね?
555
(1): 551 [sage] 04/07/25 14:40 ID:TtxXwPsH(2/3) AAS
>>554
やっぱりそうですよね…。
でもそうやってみると、どうしてもリークしてしまうんです。
やり方がおかしいのかな_| ̄|○

・MainFormのprivateでText1: TDGTexture;を宣言。
・FormDestroyでText1.Free;

procedure OnIdle();
begin
  :
Text1 := Sxw.CreateStringTexture();
PushSprite(Text1);
D3DDevice.Present();
// この辺りで何らかの解放処理が必要なのでしょうか。
  :
end;

(今は、SXLibを見ながらTBitmapを使おうと模索中です。)
556
(1): 名前は開発中のものです。 [sage] 04/07/25 15:18 ID:y86X+J8o(2/3) AAS
>>555
ん?それだと
>Text1 := Sxw.CreateStringTexture();
の部分で毎回テクスチャがクリエイトされちゃうじゃん。そりゃリークしまくるでしょ。

Writeすればっつーのは
FormCreateでText1をクリエイトして
>Sxw.Write(0,0,'Score',Text1);
とでもすればっていうこと。
557
(1): 名前は開発中のものです。 [sage] 04/07/25 15:35 ID:y86X+J8o(3/3) AAS
あ、言い忘れた。
当たり前だけど毎描画Writeするのも重いはず。
別に文字列持っておいて変化したらWriteするようにするのが普通だと思う。
558: 551 [sage] 04/07/25 16:26 ID:TtxXwPsH(3/3) AAS
>>556-557
おあーぁぁー、Writeってそういうことだったんですね…。
メソッド名そのままの効果…何故気付かないのか私は_| ̄|○
これなら期待通りの動作をしてくれます!
> 別に文字列持っておいて変化したらWriteするようにする
CPU使用率が(一部)断然下がりました。
おかげさまで、描画系の作成に苦労しなくて済みそうです。

>>552,554(=556,557?)さんをはじめ、スレ住人皆さん、
ご教授いただき有難うございました<(_ _)>

QDmanual/ML/sampleの山|λ......
559
(1): 名前は開発中のものです。 [sage] 04/08/04 16:08 ID:ZmvuRdM9(1) AAS
初心者丸出しの質問ですいませんが
ゲームのハイスコア(1位から10位ほど)を保存したいんですけど 何を使えばいいんでしょうか
560: 名前は開発中のものです。 [sage] 04/08/04 17:22 ID:WqrQethy(1) AAS
tstringlist
561
(1): 名前は開発中のものです。 [sage] 04/08/04 23:29 ID:5TXw5Lpo(1) AAS
Quadruple Dを使ってゲーム作っているのですが、
画像の一部だけを描画するにはこの方法でいいのでしょうか?

Scene.PushSprite(
Vector2D(0,0),
[
 SXVertexSP(50,50, $FFFFFFFF, 0.0,0.0),
 SXVertexSP(100,50, $FFFFFFFF, 50/Texture.Width, 0.0),
 SXVertexSP(50,100, $FFFFFFFF, 0.0, 50/Texture.Height),
 SXVertexSP(100,100, $FFFFFFFF, 50/Texture.Width, 50/Texture.Height)
],
 Texture,
 sxbAlpha,
 False
);

もっとスマートな方法ってありますか?
562
(1): 名前は開発中のものです。 [sage] 04/08/12 22:35 ID:lCkZPmie(1) AAS
>>561
それでよし
>>559
漏れもTStringListに一票
桁揃えておけばソートできるしな
暇ならハイスコアコンポーネントでも作って公開してくれ
>>550
変える順番が大事
変える個所は合ってる
>>543
543(1): 名前は開発中のものです。 [sage] 04/06/17 22:57 ID:PyX6xxqm(1) AAS
そもそも内部でRestore用に保持するぐらいなら鼻から
MANAGED使った方がいい気がするんだが。
ほかの個所は使ってる
>>536
536(1): 名前は開発中のものです。 [sage] 04/06/09 07:09 ID:GrePfY40(1) AAS
TDDIDFFXについての質問です
カーソルキーを押しっぱなしにするとTDDIDFFX.Stick.X(又はY)は常に1(又は-1)を返します
カーソルキーを連打しないと動作しないようにするにはどのようにすればできるでしょうか?
前回のキー入力を保存
状態遷移でググると基本的な考え方がわかる
やね本2の解説がわかりやすい
>>528
528(1): 名前は開発中のものです。 [sage] 04/06/05 21:21 ID:XAY0KQdg(1) AAS
QDとEasy3Dどっちがいいかな?
QDの良い所はVCL連携と3Dオブジェクト(しかもモーション付き)の扱いが楽
563: 名前は開発中のものです。 [sage] 04/08/12 23:43 ID:Ev6Dy7m9(1) AAS
>>562
レスありがとうございます。
でもこれだと解像度の違いのせいか、描画したい元画像の範囲選択が上手くいかないんです。

解像度を800×600にして、元の画像の大きさが50×100だとすると、下のソースでは
画像の Rect(0, 20, 50, 50) の部分が描画されると思うのですが、ずれてしまいます。

Scene.PushSprite(
Vector2D(0,0),
[
 SXVertexSP(0, 0, $FFFFFFFF, 0.0, 0.2),
 SXVertexSP(0, 50, $FFFFFFFF, 1.0, 0.2),
 SXVertexSP(30, 0, $FFFFFFFF, 0.0, 0.5),
 SXVertexSP(50, 30, $FFFFFFFF, 1.0, 0.5)
],
 Texture,
 sxbAlpha,
 False
);

ゲームでたくさんの画像を使うときには皆さんどうしているのですか?
一つ一つテクスチャを作るか、それとも一つのファイルに画像を収めて
一部だけを描画するようにしているのでしょうか。
564: 名前は開発中のものです。 [sage] 04/08/13 01:22 ID:y25szJtr(1) AAS
そりゃずれると思われ
565
(2): 名前は開発中のものです。 [sage] 04/08/14 10:53 ID:ennbBjlN(1) AAS
微妙に間違えてますた。
でも、これでもずれますが、どのようにパラメータを指定すればいいんでしょう。

Scene.PushSprite(
Vector2D(0,0),
[
 SXVertexSP(0, 0, $FFFFFFFF, 0.0, 0.2),
 SXVertexSP(50, 0, $FFFFFFFF, 1.0, 0.2),
 SXVertexSP(0, 30, $FFFFFFFF, 0.0, 0.5),
 SXVertexSP(50, 30, $FFFFFFFF, 1.0, 0.5)
],
 Texture,
 sxbAlpha,
 False
);
566: 名前は開発中のものです。 [] 04/08/15 02:11 ID:PuiE5qNp(1/4) AAS
>>565
画像のサイズが2のn乗じゃないから。

テクスチャのサイズは読み込んだ画像と同じとは限りません。
TDGTextureのプロパティTotalWidthなどで確認できます。
Widthとの値の差を見比べるとよいでしょう。

読み込んだ画像が2のn乗に満たない場合は自動的にテクスチャのサイズが拡張されます。
そのサイズは読み込んだ画像以上でなおかつ最小の2のn乗になります。
50x100の場合は64x128になります。

たとえば50x100の画像を読み込んで作ったテクスチャの左上から32x32を表示したい場合は
テクスチャが64x128に拡張されているので以下のようにしてUVを求められます。
U=1/64*32
V=1/128*32

ここからは余談ですがグラフィックボードによってはテクスチャに色々な制限があります。
・256x256以下のサイズしか扱えない
・正方形でないとならない
・2のn乗サイズでないといけない
・32bit色が使えない

記憶を頼りに書いてるので間違ってたらツッコミおながいします。
ちなみにVoodooシリーズがこれらの制限に全てひっかかるカードです。
567
(1): 名前は開発中のものです。 [sage] 04/08/15 04:22 ID:PuiE5qNp(2/4) AAS
>>565
とりあえずサンプル
外部リンク[lzh]:gamdev.org
568
(1): 名前は開発中のものです。 [sage] 04/08/15 09:35 ID:moZoUrx5(1/2) AAS
丁寧な解説ありがd

>>567
起動してくれません。デバッグログには、
「Direct3DDeviceオブジェクトの生成に失敗しました(Error Code D3DERR_OUTOFVIDEOMEMORY)」
とあります。
569
(1): 名前は開発中のものです。 [sage] 04/08/15 13:01 ID:PuiE5qNp(3/4) AAS
>>568
たぶんビデオカードのメモリが不足してるだけだからテクスチャのサイズが小さくなれば解決すると思う
サンプルでは512キロバイト使ってるからグラフィックボードを買い足していない環境じゃつらいかも

思いついた対策を書いておきます
これでもダメならグラフィックチップの種類やVRAM容量、エラーログの全文がわかればもう少し詳しく調べられるかも

・画像編集ソフト(ペイントなど)で画像のサイズ(今は288x256)をもっと小さくする(試しに32x32ぐらいに)
・画像編集ソフト(ペイントなど)で画像の色数を減らす(16ビット色に)
・TDGCarad(女の子のアイコンのコンポーネント)のプロパティUseSoftwareVertexProcessingをTrueにする
570
(1): 名前は開発中のものです。 [sage] 04/08/15 18:34 ID:moZoUrx5(2/2) AAS
>>569
全部試してみたけどダメでした。ファイルサイズは630バイトくらい。

ビデオRAM : 4MB
グラフィックアクセラレータ : ATI社製RAGE(TM) Mobility-CL(AGP)
ノートパソコンなので画像系には弱いのですかね? Lavie Lシリーズです。

前略(特に問題ナシ)
#00013 | ■■■画面モードを初期化します■■■
#00014 | Driver : ati2drab.dll
#00015 | Description : ATI RAGE MOBILITY AGP
#00016 | VendorID : 00001002, DeviceID : 00004C4D, SubSysID : 81581033, Revision : 00000064
#00017 | ウィンドウモード 640x473で初期化します
#00018 | ハードウェアアクセラレーションを利用します
#00019 | 希望のデプスステンシルサーフェスのフォーマットが見つかりませんでした
#00020 | デプスステンシルサーフェスのフォーマット...UNKNOWN
#00021 | ソフトウェアT&Lを利用します
#00022 | Direct3DDeviceオブジェクトの生成を行います
#00023 | Direct3DDeviceオブジェクトの生成に失敗しました(Error Code = D3DERR_OUTOFVIDEOMEMORY)
#00024 |
#00025 | ■■■お別れの時がやってまいりました■■■
以下略(特に問題ナシ)
1-
あと 406 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.027s