Article View: japan.comp.lang.delphi
Article #13Re: 画面モード切替後のグラフィックパフォーマンスの低下
From: 林 知紀
Date: Wed, 29 Dec 1999 00:00
Date: Wed, 29 Dec 1999 00:00
121 lines
5370 bytes
5370 bytes
K.Takaoka <saepro@din.or.jp> wrote in message
news:3866712B.F98B267D@din.or.jp...
> える@海豚ぞな
>
> > ただ、LineToで直接PaintBox1.Canvasに書き込んだり
>
> といった、書きこんだ情報を、すべて OnPaint で再描画しないと、
>
> > フォームが動くなどOnPaintイベントが発生するたびに
> > 画面がBitmapの内容に戻ってしまう
>
> という状態になります。
> これは Windows の描画アルゴリズムが、こうなっているための仕様です。
>
> TImage や TWinControl.DoubleBuffered はこれらを Delphi/VCL が自動化
> してくれています。
多分この自動でやってくれるあたりに
TImageの描画がTPaintBoxより遅かったり
この投稿の大元となった現象が潜んでいるのでしょうね。
でも僕のDelphi4はStandardなのでVCLのデバッガがないので
詳しいことは調べることが出来ません。
>
> > ので
> > Bitmap.Assign(Bitmap2);
> > PaintBox1.Canvas.Draw(0,0,Bitmap);
> > と若干冗長なコードが必要なのが面倒くさいところです。
>
> これはちょっと意味がわからないです. 何をしたいのでしょうか ?
> 具体的に、どういうコードでは、どうダメだから、上記のように書くと
> どう良くなるのかを書いていただけると、意味が取りやすいです (^^;
今まで場合によって
Image1.Canvas.Draw(0,0,Bitmap);や
Image1.Canvas.Draw(0,0,Bitmap2);
と使い分けていたのですが
TPaintBoxは自動更新してくれないので
PaintBox1.OnPaintイベントに
PaintBox1.Canvas.Draw(0,0,Bitmap);
としなければならなくなりました。
ということで今まで書いたソースの中から
Bitmap2を駆逐していかなければならない状況です。
まあ、このあたりは僕自身で何がどうなっているのか
分かっているので面倒くさい以外の問題はありません。
> のような感じになります。
>
> オフスクリーンとして TBitmap を利用しているならば、Button1Click
> などでは TBitmap.Canvas に変更を行って、PaintBox1 を Invalidate
> するという手順にし、PaintBox1 では最新の情報を保持している TBitmap
> を draw するだけということになります。
>
> # そして、それを自動でやっているのが TImage です (^^;
ちょっと話がずれるのですが、
というより実験報告のようなものですが
今、画面転換に下記のようなコードを使っています。
var
Bmp1,Bmp2:TBitmap;//転換前と転換後の画像
Screen :TBitmap;//画面表示用の画像
VRect :TRect;
i,j,k :integer;
procedure TForm1.GraphicChange();//画面転換用のルーチン(上からパラパラと変化
する)
begin
Screen.Assign(Bmp1);
Screen.Canvas.CopyMode := cmSrcCopy;
for i := 0 to 34 do
begin
for j := 0 to 8 do
begin
k := i*18 + j*16 - 130;
if (k > 1) AND (k < 481) then
begin
VRect := rect(0,k-2,640,k);
Screen.Canvas.CopyRect(VRect,Bmp2.Canvas,VRect);
end;
end;
PaintBox1.Invalidate;
sleep(120);
end;
end:
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
Paintbox1.Canvas.Draw(0,0,Screen);
end;
とすると途中経過なしにいきなりBmp2の画像を表示しました。
どうもPaintBox1.Invalidateで再び有効になるのは
プロシージャを抜け出してウインドウズに制御が戻ってからのようです。
ということで解決策として
PaintBox1.Invalidate;の代わりに
PaintBox1.OnPaint(PaintBox1);と書くと
きれいな動作になりました。
# (Sender: TObject)の呪文を覚えたおかげです。
ということで一応標題の問題点は
曲りなりにですが解決しました。
どうもありがとうございました。
いろいろと標題以外のことでも勉強になりました。
また何かと知恵を貸していただくことがあるかもしれませんが
よろしくお願いします。
それでは皆様良いお年を。
くるくるくるくるくるくるくるくるくるくるくるくる
林 知紀
fwhx4467@mb.infoweb.ne.jp
くるくるくるくるくるくるくるくるくるくるくるくる
Technical Details
Message-ID:
<84ci6p$57i$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> <8451vt$ojp$1@nw042.infoweb.ne.jp> <38661455.CECA03D4@din.or.jp> <845ji4$1l$1@nw042.infoweb.ne.jp> <3866712B.F98B267D@din.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: feb2e,f2bd283c630b1b34 X-Google-Attributes: gidfeb2e,public X-Google-Thread: fecfa,f2bd283c630b1b34 X-Google-Attributes: gidfecfa,public From: 林 知紀 <fwhx4467@mb.infoweb.ne.jp> Subject: Re: 画面モード切替後のグラフィックパフォーマンスの低下 Date: 1999/12/29 Message-ID: <84ci6p$57i$1@nw042.infoweb.ne.jp> X-Deja-AN: 565975426 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> <8451vt$ojp$1@nw042.infoweb.ne.jp> <38661455.CECA03D4@din.or.jp> <845ji4$1l$1@nw042.infoweb.ne.jp> <3866712B.F98B267D@din.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 946457625 5362 202.219.29.31 (29 Dec 1999 08:53:45 GMT) Organization: Nifty News Service X-MSMail-Priority: Normal Mime-Version: 1.0 NNTP-Posting-Date: 29 Dec 1999 08:53:45 GMT Newsgroups: japan.comp.lang.delphi,fj.comp.lang.pascal,fj.os.ms-windows.programming