• ベストアンサー

windowsのAPIプログラミングでの差分描画?

windows98でAPIでwindow内に持続的に描画(60回/秒とかで)しているのですが、毎回そんな描画する内容が変わらないので違う部分だけを書けば高速化出来るのではと思っています。よい方法はないでしょうか?? 具体的には折れ線グラフを連続的に表示するプログラムです。一回メモりDCに書いてからbitbltしてます。このbitbltでメモリdcの全部を転送しているので遅いと思うのですが、更新部分だけをどうにか(リュージョンとかを使って?)うまくできないかと思っています。お願いします。

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

  • ベストアンサー
  • nim05
  • ベストアンサー率61% (111/181)
回答No.1

自分で更新領域を計算し、描画時に更新領域だけをbltする、ということを地道にやるしかないですね。 すでに、ダブルバッファリングをされているようですので、あとはいかに最適な更新領域を計算するかになると思います。 この更新領域の求め方は、個別のアプリごとに違います。 たとえば、厳密にリージョンを使って、再描画領域を最少にするのが早いのかというと、逆にリージョンの計算が重くて遅くなることもあります。 更新領域の計算のオーバヘッドと、再描画の面積のオーバヘッドのトレードオフが大事です。 また、遅い原因は実は他の所にあったりするかもしれません。 当然bitbltよりもStretchBlの方が遅いですし、何回も同じ場所を描画していないか(ダブルバッファを使っていると、ちらつかないので気がつかなかったりする)など、デバッガを使ってじっくり追って見るのも必要です。

ylovedayo
質問者

お礼

やっぱりそういう方法しかないですか。。 怠けてはだめですねぇ ありがとうございましたm(__)m

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

関連するQ&A

  • BitBltの代替

    Pictureボックスを使用してグラフ表示をしようとしており、BitBltを使用して1秒毎にスクロールをさせながらの表示がやっと出来ました。 ここで今度は ScaleMode=Twipにして描画したいと考えているのですが、BitBltはピクセルしか対応していないようで出来ません。他のAPIまたは方法をご存知の方教えてください。

  • Excelグラフ描画に関連する質問

    1年間の月別(X軸)売上げ高(Y軸)を折れ線グラフで描画しました。このグラフで、6月以降の部分の線を太くする事は可能でしょうか?

  • Google Chart APIでランキング表示

    Google Chart APIのLineChart(折れ線グラフ)を使い、ページの閲覧数の5位までをランキングの推移を折れ線グラフにして表示したいと思っています。 5位までの記事の順位の変動の推移をグラフにするまではできたのですが、 Y軸の上が1位に、下が5位にと本来のグラフの描画とは反転させて表示させることができません。 どなたが、Y軸を反転させて数値が小さいものほど上に、大きいものは下に表示させる方法はご存知ではないでしょうか? よろしくお願いいたします。 https://developers.google.com/chart/interactive/docs/gallery/linechart?hl=ja

  •  BitBltでの表示での問題です。

    WindowsAPIでの描画系の質問です。 WindowsAPIで、bitmapファイルを描画するAPI、BitBltがあるのですが、 画像を読み込み、これを表示させると透過処理がないことがわかります。 そこでBitBltで、マスク処理した画像を用意し、表示させることで表示させたくない部分を 透明にさせることができるみたいですが、どうしてそういったことが可能なのでしょうか? bitmapファイルの黒い部分と別のbitmapファイルの白い部分を重ねることでできるのですが なぜ白と黒とで透明になるのか分かりません。 どうしてでしょうか? 以上です。 よろしくお願いします。

  • Excel2007のグラフで空白セル部分の描画をしない方法

    いつもお世話になっております。 現在、Excel2007にて売上推移の折れ線グラフを作成しております。 今年度分を作成しているのですが、今年度はまだ9月分までのデータしか なく、10月以降の売上を入力するセルは空白のままです。 この状態で4月から来年3月までのグラフを作成すると、10月-3月の部分は 折れ線が0の線に重なってしまいます。 これを解消したいため、空白のセルに該当する部分をグラフに描画させなくする方法を探しています。それとも、このようなことは不可能なのでしょうか。もし方法がありましたら恐れ入りますがご教授ください。 どうぞよろしくお願いいたします。

  • Bitmapを重ね合わせる方法

    最近プログラミングを始めた初心者です。 環境はXP SP2 及びVC++6.0 です。 Win32APIのみを用いてプログラミングしております(MFCは使えません)。 宜しくお願い致します。 やりたいことは、あるビットマップを背景にして(bmpback.bmp)、その上に、bmpback.bmpよりサイズが小さいbmp1.bmpとbmp2.bmpを、WM_TIMERを使って交互に表示させる、です。 その際、WM_TIMER内でbmpback.bmpとbmp1.bmp(又はbmp2.bmp)を重ね合わせたbitmapを作成し、そのbitmapをWM_PAINT内でBitBltなどを用いてメモリDCからクライアント領域用のDCに転送して、ディスプレイに表示させたいと考えています。 検索したところ、以下のリンクに正に同じ質問があったのですが、難しくて理解出来ませんでした。 http://oshiete1.goo.ne.jp/qa1474735.html 回答者様が、良回答20ptで書かれている内容の、 >最終的に表示したい大きさのビットマップをメモリDCに割り当てて、 >そのメモリDCに対して10回のBitBltを行います。 の部分です。 最終的に表示したい大きさのビットマップ、というのが私の場合bmpback.bmpになると思いますが、例えばbmpback.bmpがSelectObject()でメモリDCに関連付けされているとして、そのメモリDCにbmp1.bmpをBitBltで転送する場合、bmp1.bmpに関連付けられるべきDC(デバイスコンテキスト)は何になるのでしょうか? (メモリDC→メモリDCかなあとも思ったのですが、それだとbmp1.bmpを紐付けした時点でbmpback.bmpが消えてしまうような気がして、ちょっと違うかなあと) 分かり辛い説明で申し訳ありませんが、知りたいことは、あるBitmapに別のBitmapをBitBltで転送して重ね合わせたい場合、コピー元のビットマップに関連付けるDCは何にすべきか、ということです。 本当は透過処理もしたいところですが、それは後で調べることにしてまずはBitBltで動作を見たいと思っています。 宜しくお願い致します。

  • Win32APIにて、アイコンの情報を取得する方法を教えてください。

    いつもお世話になっております。 只今、小生WindowsXPSP3上で、C言語とWin32APIを使い、BCC5.5.1でコンパイルし、Windowsプログラミングを勉強しています。 今回質問させて頂きたいのは、 「ウィンドウにアイコンを描画する際、  BitBlt関数の第4・5引数に指定する転送元画像の幅と高さを取得する  際にはどうすればいいか」 です。 例えば、ビットマップ画像の幅、高さを取得する際は、 GetObject(hBitmap, (int)sizeof(BITMAP), &bmp_info); をして、 w = bmp_info.bmWidth; h = bmp_info.bmHeight; とし、x, yをBitBlt関数の第4・5引数に指定する方法というのは知っているのですが、アイコンの場合はどのようにして、幅、高さを求められるのでしょうか?? 先輩方、ご教授宜しくお願い致します。

  • クライアント領域のコントロールが描画されない

    WindowsXP / VC2005 / VC++ MFCにてダイヤログベースの画像ビューワの作成を行っています。 機能としては、独自形式のバイナリファイルをダイヤログへドラッグ&ドロップすることにより、 メモリに描画した画像をクライアント領域へ転送して表示します。 こちらが疑問点となるところなのですが、その際にもともと配置していた エディットボックスやスピンボタンなどのコントロールが消えてしまいます。 (見えなくてもボタンを押すことはできるので描画の問題と思われます) 1.なぜこのようなことが起こるのでしょうか? 2・また、コントロールを消さないためにはどうすればよいのでしょうか? 上記に関してご回答いただけると幸いです。 個人的な考えとしては、  1.クライアント領域を描画する際にコントロールを消してしまっている  2.再描画することによりコントロールは表示される(但し問題点としてクライアント領域を書き換える際にちらつく) です。 以下該当関数です //------------------------------------------------------------------------------ void CTestBitBltDlg::OnDropFiles(HDROP hDropInfo) { char acFileName[256]; SHORT sRet; memset(acFileName, 0, sizeof(acFileName)); DragQueryFile(hDropInfo, 0, acFileName, sizeof(acFileName)); memcpy( g_acSpriteFileName, acFileName, 256 - 1 ); CRect rc; GetClientRect(&rc); CClientDC dc(this); CDC dcMem; dcMem.CreateCompatibleDC(&dc); CBitmap bmp; bmp.CreateCompatibleBitmap(&dc, rc.Width(), rc.Height()); CBitmap* pOldBmp = dcMem.SelectObject(&bmp); dcMem.FillSolidRect(&rc, RGB(0xC0, 0xC0, 0xC0)); // 本関数にてメインとなるメモリDCへの描画をおこなってます sRet = GetMemoryImage(g_acSpriteFileName, 0, &dcMem); if( sRet == FALSE ){ GetDefaultImage(&dcMem); } dc.BitBlt(0, 0, rc.Width(), rc.Height(), &dcMem, 0, 0, SRCCOPY); dcMem.SelectObject(pOldBmp); //InvalidateRect(FALSE); CDialog::OnDropFiles(hDropInfo); } //------------------------------------------------------------------------------ なお、OnEraseBkgnd関数においてはTRUEのみを返すようにしてます。

  • 保存した100枚のビットマップ画像を連続表示

    お世話になります。 昔かじったvisualC++.net2003で、連続撮影保存した100枚ぐらいのbmp画像を高速に連続表示して動画表示するようなアプリケーションを作ってみたいと思います。少し調べて見ると、bmp画像を高速にディスプレイに表示するには、Win32APIのBitblt関数を使ったり、DirectXや OpenGLといったインターフェースが必要になりそうなのですが、どれが一番高速なのでしょうか。皆様の意見をお待ちしています。OSはXP(32bit)です。

  • 子画面を自動で閉じた後、親画面を再描画するJavaScriptが・・・・

    IEだと動くんですけど、Netscapeだと動かないんです。なんかsecurityErrorが出まして・・・。子画面を閉じるまでは動いてるんですが、親の再描画の部分でエラーが出てるようです。どこが原因かお分かりになる方いらっしゃいますか?よろしくお願いします。 <%//処理を何秒後に行うか 時間をset%> function setTimer(){ timer1=setTimeout("clo()",3000); timer2=setTimeout("location()",3000); } <%//windowをclose%> function clo(){ window.close(); } <%//親画面を再描画する%> function location(){ var url='<html:rewrite page="/hogehoge/hoge.do" />'; window.opener.location.href = url+'?member_id='+変数; }