Article View: japan.comp.lang.delphi
Article #8Re: 画面モード切替後のグラフィックパフォーマンスの低下
From: 林 知紀
Date: Sun, 26 Dec 1999 00:00
Date: Sun, 26 Dec 1999 00:00
114 lines
6062 bytes
6062 bytes
HIRAO <hirao@dog.net0726.or.jp> wrote in message
news:842u63$fpk@www.net0726.or.jp...
> 林 知紀 wrote in message <83u3iq$i92$1@nw041.infoweb.ne.jp>...
> >フォローありがとうございます。
> >
> >原因というか元凶が判明しました。
> >Image1.Refresh
> >のコードを実行するのに異常に時間がかかるようです。
> >結局 TForm.Canvas に直接描画する形をとり、
> >パフォーマンスの低下を防ぐことが出来ました。
>
> 僕はC++Builderのユーザですが途中からおじゃまさせていただきます。
> VCLは同じだと思いますので・・・
>
> そう言う方法で問題が発生しないと言うことは、TImageの中のバッファ
> 用のビットマップのデバイスコンテキストと画面のデバイスコンテキスト
> が合っていないから、変換に時間がかかっているのではないでしょうか?
> (ソースが付いていましたらデバッガーで追いかけてみると良いかも、
> せっかくパスカルのソース読めるのですからもったいないですよ(^^;;)
すいません。ほぼ初心者なのでHIRAOさんが何を言わんとしてるのか
よく分からないのですが、もしかしてCPUデバッガのことなんでしょうか?
だとしたら今の僕には手におえない・・・
> TImageの中にはバッファ用のビットマップが自動的に作られますので、
> それを画面モード切替後に消去して作り直せばいけるかもしれません。
>
> PictureプロパティーのTPictureオブジェクトを解放してみてはどうでしょうか
?
> それでもだめでしたら、TImage自体を動的生成するようにしてみるとか…
最初はその方法を考えたのですが、
メモリから開放するのは簡単に出来たんですけど
動的生成がうまいこと出来なくて
とりあえず別の方法を試してみたら
TForm.Canvasでうまくいったので
そちらのほうは追求してません。
だれか動的生成の詳しい方法を教えてくれたら
その先を実験してここにレポートします。
> >でも TImage を使うことをまるっきり諦めなければならないので
> >汎用性やプログラムの構築に関する生産性が悪くなりそうです。
> >まあどちらにせよほとんどTBitmapで表示するための画像を作成してるので
> >僕自身は大して困らなさそうです。
>
> バッファリングをしないあるいは自分でするのでしたら、
> TPaintBoxが使えるかも…
今のところTForm.Canvasだと少し馬鹿っぽいので
TPaintBoxを使っています。
ただTForm.CanvasとTPainBox.Canvasに共通する欠点として
フォームが他のアプリケーションのウインドウに隠されたときなどの
フォームの自動描画が行われないことがあります。
仕方がないのでOnPaintイベントに以下のコードを書き込んでいるのですが
これだと画面に表示するのは常に同じ画像変数でなければならないという
不便が生じます。
var
Bitmap:TBitmap
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
Paintbox1.Canvas.Draw(0,0,Bitmap);
end;
> >> Windowsの描画は、DC(デバイスコンテキスト)を使って
> >> 行われるのが普通です。
> >> Delphiからでも、DC関連のAPIは直接操作できますので
> >> Cを無理に使う必要はありません。
> >
> >APIを使うと2~3倍くらい早くなるような感じがしますが
> >目にもとまらぬ速さで結局ウェイトを入れるので意味なしでした。
> >APIを直接操作することになれていないので
> >Delphiのコードを使うことにします。
>
> そのVCLの自動化の部分がオーバーヘッドになりますから、
> 小さいビットマップをたくさん扱ったりとかの処理だと確かに差が
> 出ますね… でも大きいビットマップの場合はそれ自体のデーター
> 転送に時間がかかりますので差が全然出ませんでした。
> 場合によっては遅いかもしれませんが、いろいろ自動化されているのは
> 魅力的ですよね。MFC何かは素のAPIに近いみたいですから面倒くさそう
> ですよ…
> (将来はlunix版なんかも出るらしいですし… そうなればマイナーから
> 一気にグローバルですし(^^;;)
当初APIを直接呼んだときに早くなったように感じたのは
どうも気のせいだったような気がしてきました。
ただ
TImage.Canvas.Draw(0,0,Bitmap);と
TPaintBox.Canvas.Draw(0,0,Bitmap);には
速度の差が生じているように感じます。
(TImageのほうが遅い)
一応、今回の問題点はTImageを使わないという形で
(多分)うまいこといくのではないかと思います。
C++に乗り換えようかと思ったのですが、
皆さんの話を聞くとどうもDelphiのほうが断然使いやすいようなので
当分Delphiを使いつづけます。
そのうちにPascal用のヘッダーとかが簡単に入手できる
世の中になるのではないかと期待しています。
ご意見どうもありがとうございました。
この先もいろいろと実験してみて結果をリポートします。
--
くるくるくるくるくるくるくるくるくるくるくるくる
林 知紀
fwhx4467@mb.infoweb.ne.jp
くるくるくるくるくるくるくるくるくるくるくるくる
Technical Details
Message-ID:
<8451vt$ojp$1@nw042.infoweb.ne.jp>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailReferences:
<83ou3d$jvv$1@nw041.infoweb.ne.jp> <3860CAFB.E16988D7@po.teleway.ne.jp> <83u3iq$i92$1@nw041.infoweb.ne.jp> <842u63$fpk@www.net0726.or.jp>Show Full Headers
Complete Article Headers
X-Google-Language: Japanese,JIS X-Google-Thread: 110a07,f2bd283c630b1b34 X-Google-Attributes: gid110a07,public X-Google-Thread: fecfa,f2bd283c630b1b34 X-Google-Attributes: gidfecfa,public X-Google-Thread: feb2e,f2bd283c630b1b34 X-Google-Attributes: gidfeb2e,public From: 林 知紀 <fwhx4467@mb.infoweb.ne.jp> Subject: Re: 画面モード切替後のグラフィックパフォーマンスの低下 Date: 1999/12/26 Message-ID: <8451vt$ojp$1@nw042.infoweb.ne.jp> X-Deja-AN: 564994897 Content-Transfer-Encoding: 7bit References: <83ou3d$jvv$1@nw041.infoweb.ne.jp> <3860CAFB.E16988D7@po.teleway.ne.jp> <83u3iq$i92$1@nw041.infoweb.ne.jp> <842u63$fpk@www.net0726.or.jp> X-Priority: 3 Content-Type: text/plain; charset="iso-2022-jp" X-MimeOLE: Produced By Microsoft MimeOLE V5.00.2314.1300 X-Complaints-To: - X-Trace: nw042.infoweb.ne.jp 946211645 25209 202.219.29.26 (26 Dec 1999 12:34:05 GMT) Organization: Nifty News Service X-MSMail-Priority: Normal Mime-Version: 1.0 NNTP-Posting-Date: 26 Dec 1999 12:34:05 GMT Newsgroups: japan.comp.lang.delphi,fj.comp.lang.pascal,fj.os.ms-windows.programming