• ベストアンサー

Delphiでキューを作りたい

mikiki_7の回答

  • ベストアンサー
  • mikiki_7
  • ベストアンサー率100% (2/2)
回答No.3

補足です。 上記ではちょっと説明が足りないようなのでかってに補足させてもらいます 実際のバッファリング処理では 演算の結果 ↓ 描画(描画用のスレッドにてバッファに書き込み) 更新タイミング *作成者指定 ↓ 転送(描画部分のスレッドと同期してる状態が前提) 画面更新 以上のプロセスを経て表示が行なわれます。 これが基本的なバッファリング描画です トリプルバッファリングはこの描画用のバッファが2つになり交互に描画を行なうわけです。 ただ、交互に行なうのでは意味が無いので一部特殊な処理がありますが :-) 前提 演算の結果を描画する場合に転送待ち、描画中のバッファで利用できるバッファが無い時はその回の描画処理をキャンセルする。 演算の結果 ↓ 描画(描画用のスレッドにてバッファに書き込み) 更新タイミング ※画面のリフレッシュレートに併せたかたち ↓ 転送(描画部分のスレッドと同期 ※描画が完了してなければ行なわない。 ↓    この時点で後からの描画処理が完了してるようであればそちらを表示する ↓    後からの描画処理が完了した時点で前のバッファの内容を破棄し描画処理を行なえるように処理) 画面更新 ↓ 描画、転送用のバッファを切り替え 大体こんな感じです ダブルバッファリングですと描画転送が完了してからでないと描画処理が新たに行なえないので物によっては大幅に描画速度が低下します。(フレーム落ちが出ます) トリプルバッファリングですと、描画中に再度描画処理が行なえますのでマシンのパフォーマンスを最大限に発揮できますが、マシンスペックが極端に低いと速度低下が激しくなります。

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を用意するだけで配布可能) うえに、プログラミング入門には分かりやすいと思ったからです。