• ベストアンサー

Delphiでキューを作りたい

MarrowGの回答

  • MarrowG
  • ベストアンサー率53% (41/76)
回答No.1

動きの激しいゲームをコンポーネントだけで作るのはちょっと厳しいかと思いますが…。(^^; 動きの激しいゲームでは以下のようにしているのが普通です。 画面描画用のワークメモリに描画する。 ワークメモリの内容をBITMAPとして画面に一括転送。(WindowsAPIで言えばBitBlt) いわゆるダブルバッファという方法ですが、これだと画面のちらつきが抑えられます。 また画面描画メモリを2つ使用するトリプルバッファという方法もあります。 これは、 1.画面描画用のワークメモリAに描画する。 2.ワークメモリAの内容をBITMAPとして画面に一括転送。 3.画面描画用のワークメモリBに描画する。 4.ワークメモリBの内容をBITMAPとして画面に一括転送。 の繰り返しです。(実際には2と4は1、3終了後に非同期で行うのが普通) これですと、1が間に合わなければ、次に描画するタイミングでは3を行うので、ワークメモリAやBの処理量は半分で済むことになります。 描画コンポーネントで実現するのであれば、ワーク用に2つ、実際の表示用に1つ作成して、上記のようなトリプルバッファ方式を使えば少しはマシになるかと思います。 でも、出来るかどうかわかりませんが…。(汗

pythian
質問者

お礼

単純な描画でそんなに動きは激しくないので、コンポーネントでやっています。自分でバッファリングするほど技量もないもので・・・。(^^; 描画メモリを確保して転送しながらというのは、いつかやってみたいです。もし参考になるページや書籍等ありましたら、教えていただければ幸いです。 もう少し頑張ってみます。ありがとうございました。

関連するQ&A

  • DelphiからHDDを直接読みたいのですが・・

    最終的には数テラの容量があるハードディスクドライブを,Delphi6からWin32APIのSetFilePointerで位置付けて,ReadFileでセクタを直接読み取りたいと思っていますが,現在,125GB辺りでエラーが発生し,以降がのセクタが読めません。(DelphiXEでも同じエラーとなります)  参考にできる日本語のサンプルも乏しく困り果てています。  どなたか,お教えください。  m(_ _)m  よろしくお願いいたします。 【動作環境】 OS:Windows7 (32) professional 言語: Delphi6(personal) 及びDelphi XE メモリ:2GB 対象ドライブ:USB外付けHDD 250GB(1論理ドライブWindows7でフォーマット) 名称:\\.\PHYSICALDRIVE1 CylindersLo : 30401 CylindersHi : 0 TracksPerCylinder : 255 SectorsPerTrack : 63 BytesPerSector: 512 【問題点】 セクタ0からセクタ245127535までは読める様なのですが,1セクタ進めて245127536セクタを読み込もうとすると,SetFilePointerはエラーなしで通過するも,ReadFileでエラーとなってしまいます。 エラーが起きた時のSetFilePointerとReadFileに与えたパラメータは次の通りです。 Stsector : 245,127,536 real ofset: 125,505,298,432 p_hi: 58 p_lo: 951,246,848 p_hiの戻り値: 58 【プログラムのソース】 var DHandle : Thandle; // ハンドル drv_cnt : integer; // 接続ドライブ数 drvname : String; // 扱おうとするドライブの名称 sectorSize: integer; // セクタのサイズ SectorNum : word; // セクタ番号 Max_num : word; // 読み込もうとするバイト数 buf : array[0..4095*2] of byte; // 読み取りデータの格納域 STsector : int64; // 読み込み開始のセクタ番号 //----------------------------------------------------------- function getSector:boolean; // ダイレクト読み取り var dwRet : integer; // Seekのリターンコード dwSize : DWORD; // 読み取ったバイト数 iRet : Boolean; // Readのリターンコード real_ofs : int64; // 読み込もうとする位置(先頭からのバイト数) p_lo : integer; // SetFilePointerで使用するseek相対位置の下位32bit p_hi : integer; // 上位32bit begin result := false; SectorNum := 1; //一度に読むセクタ数 Max_num := SectorNum * SECTORSIZE; // 一度に読むバイト数 // ハンドルの取得 DHandle:=CreateFile(PChar(drvname),GENERIC_READ or GENERIC_WRITE, 0,nil,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0 ); if DHandle = INVALID_HANDLE_VALUE then begin // Openエラー処理 showmessage('open device エラー'); exit; end else begin // real_ofs := STsector * SECTORSIZE; // seek位置をバイト単位で取得 p_hi := real_ofs div 2147483648; // 上位32bitを計算 p_lo := real_ofs mod 2147483648; // 下位32bitを計算 dwRet:= SetFilePointer(DHandle, p_lo, @p_hi, FILE_BEGIN ); // seek if dwRet <> -1 then begin // 1セクタ分をbuf[]へ読み込み iRet := ReadFile(DHandle,buf,Max_num,dwSize,nil); if iRet = False then begin // Readエラー処理 showmessage('Read device エラー'); CloseHandle(DHandle); exit; end // dump_Buf; 読み取ったバッファの16進ダンプルーチン呼び出し end else begin // seekエラー処理 showmessage('Seek エラー'); CloseHandle(DHandle); exit; end; end; CloseHandle(DHandle); result := true; end; ※申し訳ありません,先頭の空白がGooによって自動的に削除されてしまうようです。

  • 自作アプリでアクセス違反が発生して困っています

    プログラムをDelphiで作成しているのですが、実行中に「致命的なエラー」で終了することが多くなりました。 そこで、エラーログを開いてみると、 アプリケーション例外が発生しました: 例外番号: c0000005 (アクセス違反) と言われています。思い当たる節は、単に存在しないアドレスにアクセスをしたとかそういうレベルだとは思うのですが、どうしても場所が特定できません。 (デバッガを積んでいない他人の環境でだけ発生するのです) スタックバックトレースを参照すると、以下のようなものがありました。 ntdll!ZwYieldExecution kernel32!ProcessIdToSessionId ntdll!NtWaitForMultipleObjects kernel32!WaitForMultipleObjects kernel32!lstrcmpiW ntdll!NtReplyWaitReceivePortEx rpcrt4!NdrConformantArrayMemorySize winmm!DriverCallback winmm!waveOutSetVolume ちなみに、MMTimerを使い数値を演算して、ApplicationIdleを見つけて描画を行っている普通の(?)シミュレーションプログラムです。(サウンドとシリアルからの入力も使っています) 詳しくはないのですが、この近辺でコケているということなのでしょうか・・・。

  • Delphi

    Delphi delphi初心者です。 ボタンを押すたびに、(0からはじめて)1ずつ足して、その値が空白(Edit1.Text)に 表示をしていくいくプログラムを作りたいのですが どうすればいいのでしょうか。 初期値の設定から、できるだけ簡単なコードを使って教えていただきたいです。 よろしくお願いします。

  • delphi

    delphi  delphiでDirectxを使ったゲームを作ろうと思いQuadrupledというコンポネートをインストールしようとしましたが、マニュアルの通りやってもできませんでした。delphiのバージョンが古いからでしょうか。  (delphi3を使っています。)

  • delphiで

     delphiでXのY乗といった数値計算をさせたいのですが、演算子を見つけることができません。どなたか教えていただけないでしょうか。また、演算子がないのであれば簡単なロジックを教えてください。

  • Delphi5について

    Delphi5でのコンソールアプリケーションの作り方が分かりません。ヘルプを見ると『新規作成を選択しダイアログボックスのコンソールアプリケーションを選択する』とありますが、ダイアログボックス内にはコンソールアプリケーションの項目はありませんでした。 何か設定を変える必要があるのでしょうか。

  • Delphiについて

    Delphiを使い始めてちょっとの初心者ですが、 Imageコンポーネントなのですが、 プロパティのPictureを変えれば画像を表示できるのですが、 ソース中に書き込んで変える方法はないのでしょうか? Image1.Pricture := .... とこんな感じで変えられないでしょうか? その画像の拡張子は「.bmp」です。

  • Delphi

    Delphi 2010についてお問い合わせ致します。 VB 2008用のSDKがあります。 販売元に問い合わせしたところ Delphiに対応するかわからないという回答でした。 試してみたいのですが、SDKをインストールしたことがなく、 インストール方法がわかりません。 どのたか、おわかりのかたいらっしゃいましたら、 ご教授お願いいたします。

  • Delphi

    Delphiの初心者です。他の方が作成したプログラムを修正することになったのですが、ソースを開くとTcommXがないと メッセージが出ます。 TcommXはフリーのコンポーネントのようなんですが、どこで入手可能なんでしょうか? 動作環境はDelphi6/WindowsXpです。 よろしくお願いします。

  • Delphi 6 について

    現在、Delphi 6 を使ってプログラミングの 勉強をしているものです。 いろいろなサイトを回ってみたんですが、どうにも 分からないので質問をしました。 Delphiでフォーム上にボタンとかオプションボタンなどを 配置して作っていますが、そのデザイン?が Win98風の灰色のペタンコボタンなので、 WinXP風の綺麗なボタン(触れたら光る奴)の デザインに変えたいんですが、可能でしょうか? もしできるとしたら、どのようにすればいいのでしょうか? また、別の開発環境で出来る、という場合はその環境を 教えていただきたいです。 Delphiにした理由は、無料で使えて、かつランタイムがいらない (exe単体、または複数のDLLを用意するだけで配布可能) うえに、プログラミング入門には分かりやすいと思ったからです。