[過去ログ] Delphiゲームプログラミング相談室 (976レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
533: 名前は開発中のものです。 [sage] 04/06/08 19:38 ID:v9GfdNbX(1) AAS
DGは明示的にFreeしなくてもフォームが勝手に捨ててくれるんじゃねえの?
534: 530 [sage] 04/06/08 21:39 ID:+uDFzKA1(1) AAS
>>532今までOnDestroyで解放していました。(これはエラーがでます。)
OnCloseで解放するとうまくいきました。
ありがとうございました。
535: 名前は開発中のものです。 [sage] 04/06/08 22:04 ID:Y4UTvjR4(1) AAS
何か間違ってる
536(1): 名前は開発中のものです。 [sage] 04/06/09 07:09 ID:GrePfY40(1) AAS
TDDIDFFXについての質問です
カーソルキーを押しっぱなしにするとTDDIDFFX.Stick.X(又はY)は常に1(又は-1)を返します
カーソルキーを連打しないと動作しないようにするにはどのようにすればできるでしょうか?
537(1): 名前は開発中のものです。 [sage] 04/06/09 23:16 ID:CYWVb9fr(1) AAS
>>530530(4): 名前は開発中のものです。 [] 04/06/07 19:54 ID:74upfBbg(1) AAS
QDのメッシュとsxなどの外部ファイルを使わないポリゴンを同時に表示したくて
DirectXSDKのサンプルとQDのサンプルを参考にしてプログラムを組んでみました。
なんとか表示はできたものの、ウィンドウのリサイズや終了時にアプリケーションエラーがでてしまいます。
QDのログをみるとこのようなエラーが記録されていました。
>Direct3DDeviceオブジェクトの解放に失敗しました(Error Code = UNKNOWN ERROR ... $00000001)
メッシュのロードをしなければ終了時にアプリケーションエラーはでなくなりましたがログのエラーは消えていません。
リサイズ時には終了してしまいます。
このエラーを出ないようにするにはどうすればよいでしょうか?
外部リンク[zip]:gamdev.org
せっかくあるんだからTDGVertexBuffer使いなよ
538(1): 530 [sage] 04/06/09 23:57 ID:dS+m1a5k(1) AAS
>>537
使おうとしたけどサッパリ使い方がわからず諦めた
539(1): 名前は開発中のものです。 [sage] 04/06/11 00:13 ID:dhcI2Ruo(1) AAS
>>538
そんな難しいか?
TForm1に
vb: TDGVertexBuffer;
を追加。
FormCreateのVB作成部分を
vb:= TDGVertexBuffer.Create(DG, 3, SizeOf(TCustomVertex), 0,
D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT);
pVertices:= vb.Lock(0, 3, 0);
try
CopyMemory(pVertices, @vertices, SizeOf(vertices));
finally
vb.Unlock;
end;
に。
ApplicationEvents1IdleのVB表示準備部分を
DG.D3DDevice.SetStreamSource(0, vb.VertexBuffer, 0, SizeOf(TCustomVertex));
に。以上。
540(1): 名前は開発中のものです。 [sage] 04/06/17 15:57 ID:zIL55T19(1) AAS
>>539
ありがとー
エラーもでないし上手くいきました
リサイズすると消えてしまいますがもうちょっとがんばってみます
541: 名前は開発中のものです。 [] 04/06/17 16:52 ID:UbgtGyWv(1) AAS
>>540
Create時の指定が D3DPOOL_MANAGED なら消えないみたいですね。
というわけでDGCarad9.pasの
2682
2701行は
D3DPOOL_MANAGEDの間違いだと思うのですが・・・・・
さらに、
2711
2718行は
if FPool <> D3DPOOL_MANAGED then
の方がいい気が・・・・
教えてエロイ人。
542: 名前は開発中のものです。 [sage] 04/06/17 18:04 ID:wOwJ2Vyc(1) AAS
教えない
543(1): 名前は開発中のものです。 [sage] 04/06/17 22:57 ID:PyX6xxqm(1) AAS
そもそも内部でRestore用に保持するぐらいなら鼻から
MANAGED使った方がいい気がするんだが。
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で測定しました。
545: 名前は開発中のものです。 [sage] 04/06/21 17:33 ID:dfz266Vj(1) AAS
> Timer_RenderはTTimerコンポーネントでIntervalは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
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するようにするのが普通だと思う。
上下前次1-新書関写板覧索設栞歴
あと 419 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.032s