• ベストアンサー

描画とサウンドのタイミングがデタラメになります。

描画とサウンドのタイミングがデタラメになります。 60枚ほどのbitmapを切り替えながら(20コマ/秒程度)フォームに描画し、要所要所で playsound()で.wavの効果音を再生したいのですが、描画が遅れて効果音がめちゃくちゃ なタイミングで鳴ります(0.3秒程度のずれですが)。見ているともうどうしようもなく変 な感じ(6コマもずれてしまうため)ですが、DirectXを使用するとぴったり実行されるでしょうか?よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • unacyo
  • ベストアンサー率51% (35/68)
回答No.1

ウインドウ描画は重いのと、マウスや他の処理で描画処理が走るタイミングがずれて、遅れがちになります。 恐らく、表示するBITMAP番号の更新を、描画処理でやっていませんか? 表示するBITMAP番号は、タイマーを使って更新し、描画処理では描画処理が走ったタイミングの番号のBITMAPを描画してあげると、見た目は同期するかと思いますが、コマ落ちします。 DirectXを使うと、フルスクリーンモードならば、ディスプレイのリフレッシュサイクル分の表示が可能ですが、DirectXのバッファに一定時間内に描画内容を転送しておく必要があります。リフレッシュサイクルが60Hzならば、16.6ミリ秒に一回ですね。 BITMAPデータをファイルから毎回持ってくるとなると、BITMAPの大きさや他の処理のディスクアクセスによって転送が間に合わないかもしれませんね。 なん面分かのBITMAPバッファを確保しておいて、そこに先行して読み込む処理と、バッファにBITMAPデータが入っていたら、DirectXのバッファに転送する処理をそれぞれワーカースレッドにしておいて、ある程度読み込んだら、DirectXへの転送を開始して、予めwaveバッファに転送しておいた音を再生開始したら、動けるのではないでしょうか?

goropapa
質問者

お礼

ありがとうございます。DirectXを使うのはかなり敷居が高いような気がしていましたが、 価値がありそうだとわかりました。、、ご指摘の通りbitmap番号の更新をしていました。 未だにDOSの考え方ですので、ソース上先の描画より後のはずのサウンドが先に鳴ってしまうなど あり得ない!と憤慨してしまいます。bitmap は200*600 (バーグラフです)で、先にメモリー上 に60枚書き出してあります。上記のように、wavはファイルから読み込んでは鳴らすにもかかわらず なんと描画より「先に」鳴ってしまうのです。この位のことでもDirectX などを使わないと いけないほどwindowsは普段から忙しいと言うことが分かりました。音としてはbeep音で十分なの ですが、どうやらXPまであったbeep API がwindows7になって消えてしまったらしく以前の アプリの方法が使えなくなってしまいました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • OpenGLでの描画のタイミング

     OpenGLの使い方について疑問があったので質問しました.  OpenGLを用いて3Dのゲームを作っています.しかし, どうも処理が遅くカクカクした動きになってしまいます. 描画の量が多くなるにつれて遅くなっているので,原因は 描画の時に原因があるようです.ダブルバッファリング を用いて描画しているのですが,描画のときは… 1「描画関数の実行」(glVertex3f()などの実行) 2「裏に描画」(見えていないバッファに描画) 3「裏表入れ替え」(2つのバッファを交換) 0「一定時間待機して自分自身を呼び出す」            (60FPSなら1/60秒程度) を繰り返すものと考えています.  「1230」と繰り返せば通常通り動くのですが, 「1」に計算がかかりすぎると,「2」と「3」が遅れてしまい, カクカクしてしまうのだろうと考えました. (↑これがそもそも間違っていたらすいません><)  そこで,対策を2つ考えたのですが,これでいいでしょうか? それとも,もっと良い方法はないでしょうか?(「1」を 速くするしか方法はないでしょうか?) 【1】一定時間待機する秒数を可変的にする  現在のところ,「0」では,1/60秒待機させています.  しかし,1に1/30秒かかったとすると,「1230」を 1回繰り返すのに,3/60秒かかってしまうことになり, 結局FPSは20止まりです.  そこで,「123」でかかった時間を記録し,その秒数 を1/60から引いた分だけ「0」で待機すれば,1/60秒になる だろう,という方法です. 【2】描画のタイミングを変える  現在のところ,「1230」の順番で繰り返しています. しかし,これでは描画の関数を呼び出した時,「1」に 1/30秒かかったとすると,実際に表示できるのは1/30秒後 ということになります.よって,プログラムの始めに 「1232」を実行しておき,描画の関数の中身は 「3120」とする,という方法です. (そもそも,「2」と「3」のタイミングを   離せるのかどうかもよくわかりません><)  もちろん【1】と【2】の方法は併用もできると思っています. 「2」はOpenGLに入っているglFlush() 「3」はOpenGLに入っているglutSwapBuffers() 「0」はOpenGLに入っているglutTimerFunc() を用いています. 質問が長くなってしまいましたが,よろしくお願いします. 参考までに… 【OS】Mac OS10.7(Lion) 【開発環境】Xcode3 【言語】c++ 【プログラミング歴】6年(c++2年,OpenGL1年) 【CPU】2.66 GHz Intel Core 2 Duo 【メモリ】4 GB 1067 MHz DDR3

  • Flashでのサウンド処理について

    作業環境Flash 8 pro + win XP sp2です。 ある特定のサウンドファイルが音ズレしてしまいます。 8個くらいのWAVファイルを、別個のサウンドオブジェクトに attachsoundで割り当てて、それぞれの音量を0からスタートさせ、 全部の音量が100になると1つの曲に聞こえるということをしたいのですが、 ある特定のサウンドだけ、音がズレてしまいます。 Flash Player単体での再生だとズレませんが、 IEやOpera等のブラウザに読ませるとズレてしまいます。 firefoxやMac(確認環境中一番スペックが低い)のsafariだとズレませんでした。 operaはともかくIEで音がズレてしまうのはいただけないので、 なんとか対応したいと考えております。 例) "A"と"B"のサウンドオブジェクトに両方にB.wavという音を割り当てても音はズレないのですが・・・ "A"にA.wavを、"B"にB.wavを割り当てると"A"の音が遅れます。 "B"にA.wavを、"A"にB.wavを割り当てると"B"の音が遅れます。 違いはattachsoundにて指定する識別子を切り替えただけなのですが、A.wavを割り当てた方のサウンドは遅れてしまいます。 という感じです。 プロジェクトが重たく、おかしな事が起きているかとも思い、 最低限のムービークリップを残し、他を削除してみると、 "A"と"B"のサウンドオブジェクトに両方にB.wavを割り当てたときに "A"の音がずれてしまいました。もともとB.wavはずれなかったのに・・・ 意味がわからずお手上げ状態です。 アクションスクリプトの問題なのか、Flashの内部でのサウンドの処理に問題があるのか、ブラウザ固有の問題なのか、わからず困っています。 未熟なため、状況の説明が不足しているかもしれませんが、 対応方法もしくは原因などわかる方いらっしゃいましたら、ご教授ください。 よろしくお願いいたします。

  • VC++6.0で再生音量の調整

    現在、VC++6.0で音を出すプログラムを作ろうとしています。 playsoundを使って、wavファイルを再生することで音を出すことは出来ました。次に音量を自由にしたいですが、わかりません。最終的にはボリュームコントロールのように、スライダを使って音量を変更したいです。 できれば、DirectXを使いたくないです。ただ、他に方法がなければ、DirectXを使いたいと考えています。 ちょっとしたことでも教えて頂ければ嬉しいです。 よろしくお願いします。

  • サウンドとオーディオ デバイスのプロパティで

    コントロールパネルの 「サウンドとオーディオ デバイスのプロパティ」の 「サウンド」のタブで「プログラムの起動」にwavファイルを設定しました。 普通のプログラムを開くと「起動音」が正常に1回なるのですが、 インターネットエクスプローラーを開くと、 「起動音」「起動音」「終了音」が一気に再生されます。 効果音を色々変えて見ましたがどの場合にも起こります。 ただの効果音なら無視できるレベル(というより効果音を着けなければ良い)なのですが、 キャラクターの音声を使っているので無視できませんし、wavを外したくもありません。 そこで質問です。 インターネットエクスプローラーを起動した際に、 効果音を起動音1回のみで抑える方法は無いでしょうか? ご返答お待ちします><

  • VBでのwavファイルの再生について

    実は今VB6を使ってゲームを作ってます。 wavファイルを再生させて音を出してるですが、少し困ったことがあります。使ってる関数はwin32APIのPlaySoundを使ってます。 普通に音を再生する分には問題ないのですが、非常に短い間隔で再生を繰り返すと音が鳴らなくなります。 再生時間0.07秒のwavファイルを再生し終わる前に、もう一度そのファイルを再生すると音が鳴らない。 PlaySoundの他にも音を再生するAPI関数があるようですけど、使い方が良く分かりません。 どうすればいいでしょうか? VB6で、OSはwindowsXP使ってます。

  • FLASHにサウンドを取り込みたい

    flash cs5を使用していますが Actionscriptは2.0で作業をしています。 やりたいことは ライブラリにあるサウンドファイルにリンケージ設定をして 効果音を利用したいのですが 以下のスクリプトでうまく音が出ません。なぜなのでしょうか。 教えてください。 ※リンケージは bgm と設定。 ファイルの拡張子はmp3とかwavでやってみました。 (1)フレーム1に _root.s1_sound=new Sound(); _root.s1_sound.attachSound("bgm"); _root.s1_sound.stop(); (2)ステージのボタンに on(press){ _root.s1.sound.start(); } と記述して実行しても音が出ません。 どうしてなのかわかりません。 よろしくお願いいたします。

  • サウンドにエコーがかかってます

    先日、XPを上書きインストールしてからです。 背面のヘッドフォンジャックに繋いで音を聴いているのですが、WMPや他の再生ソフトでも何でも、警告音までも、全ての音にエコーがかかった状態になってしまいました。 そんなエフェクト機能がついているのでしょうか? それをオフるにはどうしたら良いでしょうか? それとも、何かサウンドデバイスドライバが競合してしまっていて、その2者のズレがエコー的な効果になっているのでしょうか? いずれにしても、直したいので、どうかアドバイスをいただけると助かります。

  • アドビ プレミア 映像と音がズレてしまいます・・・。助けてください・・。

     大変困っています。 結婚式のビデオをプレミアで編集していますが、 ppjの上では映像と音はバッチリのタイミングのはずなのに、 いざ出力してaviにすると最悪30秒程度のズレが生じてしまいます。 口の動きと、声がバラバラで見れた作品ではありません。 素人ながら友人に「いいもの作るから」と安請け合いしてしまった以上 早急に対応しなければなりません。何卒宜しくお願いします。 ちなみに、効果等を沢山使用(出力には通常より時間がかかります) しているのですが、そういったことも関係しているのでしょうか? あとプレミアの新バージョンは音源をwavでは無くmp3で直接使用できると 伺ったのですが、真意をご存知の方教えてください。

  • wave音源の再生

    現在Microsoft visual c++でプログラミングをしています。 wavファイルの再生をしたいのですが、 PlaySoundという関数を使って一応、再生はできたのですが この関数だと同時に1つの音しか出ない様なのです。 プログラム中で1曲BGMの様に常に流しておいて、その所々で効果音 が鳴る様にしたいのですが。。。 ご教授お願いします。

  • mpeg2やaviの音ズレ

    テレビキャプチャでmpeg2形式で録画した動画です。 そのままだと音ずれがないのですが、 virtualdubmodでaviに変換すると音ずれが発生します。 (virtualdubmodでプレビューで見ると何も変換する前からズレます。) 最初は合うのにだんだんズレるタイプです。 24分程度の動画で、最後が10秒以上ズレます。 映像と音を別々にaviとwavに出してみて、vido maidで調べると、 aviが29.97003fps、55294フレーム、30:44:97 wavが15fps、27674フレーム、30:44:93 でした。 aviとwavから再び動画を作ってみても音ずれします。 wavをwtctrl(wave time control)で、長さを変えてみると、 出だしと最後は合いますが、途中がズレてしまいました。 既出の質問をいろいろ見て上記のように自分でがんばってみたんですがわかりません。よろしくお願いします。