🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: japan.comp.lang.delphi
Article #12

Re: 画面モード切替後のグラフィックパフォーマンスの低下

#12
From: HIRAO
Date: Wed, 29 Dec 1999 00:00
94 lines
5833 bytes
林 知紀 wrote in message <8451vt$ojp$1@nw042.infoweb.ne.jp>...
>
>HIRAO <hirao@dog.net0726.or.jp> wrote in message
>news:842u63$fpk@www.net0726.or.jp...

>> (ソースが付いていましたらデバッガーで追いかけてみると良いかも、
>> せっかくパスカルのソース読めるのですからもったいないですよ(^^;;)
>
>すいません。ほぼ初心者なのでHIRAOさんが何を言わんとしてるのか
>よく分からないのですが、もしかしてCPUデバッガのことなんでしょうか?
>だとしたら今の僕には手におえない・・・

 Professional版以降でしたらVCLのソースが付いていると思いますので、
それをデバッガーで追ってみるとVCLが何をしているかわかると思います。
 おいらの場合はC++を使っているものですから、VCLのソースがパスカル
と言うことでパスカルユーザーがうらやましいと思ったりしています(^^;;
トレースするときは感で読んでいたりします(今度は立場がが逆(^^ )

>> それでもだめでしたら、TImage自体を動的生成するようにしてみるとか…
>
>最初はその方法を考えたのですが、
>メモリから開放するのは簡単に出来たんですけど
>動的生成がうまいこと出来なくて
>とりあえず別の方法を試してみたら
>TForm.Canvasでうまくいったので
>そちらのほうは追求してません。
>だれか動的生成の詳しい方法を教えてくれたら
>その先を実験してここにレポートします。

 TImageの中のPictureを解放するだけで良かったのではないかな…?
あとはTImageに書き込みをすれば、自動的にそのときの画面モードと大きさ
で作られると思います。これ以上はパスカルはわからないので方法が…
 あと、TImageのCanvasに描くべきなのか、TImageのPictureのCanvasか
その辺はよく覚えていません。

>>  バッファリングをしないあるいは自分でするのでしたら、
>> TPaintBoxが使えるかも…
>
>今のところTForm.Canvasだと少し馬鹿っぽいので
>TPaintBoxを使っています。
>ただTForm.CanvasとTPainBox.Canvasに共通する欠点として
>フォームが他のアプリケーションのウインドウに隠されたときなどの
>フォームの自動描画が行われないことがあります。
>仕方がないのでOnPaintイベントに以下のコードを書き込んでいるのですが
>これだと画面に表示するのは常に同じ画像変数でなければならないという
>不便が生じます。

 バッファを作って、そこの物をOnPaintで書き出すようにすればよいのでは…
アクションゲームなどでも、画面を書き換えている時にちらつかないように、
バッファを使って、完成した物を一瞬で書き出します。
 絵の変化が早いときは、OnPaintが動かないようにして、
その一連の絵の最後の物をバッファに入れてOnPaintが動くようにする…
 でもやっぱり、シューティングゲームなどでも、バッファに描いて
それを書き出すというのが普通でしょうから、OnPaintが起きたときは
バッファのビットマップを書き出すようにしておけば問題ないと思います。

>当初APIを直接呼んだときに早くなったように感じたのは
>どうも気のせいだったような気がしてきました。
>ただ
>TImage.Canvas.Draw(0,0,Bitmap);と
>TPaintBox.Canvas.Draw(0,0,Bitmap);には
>速度の差が生じているように感じます。
>(TImageのほうが遅い)

 最初に書いたようにVCLのソースを追えば、APIだけの物に比べて
余分なこともいろいろやっていることがわかりますので、時間がかかると
いうのは間違いないです。描画する物のサイズが大きい場合は無視できる
時間と言うだけで…(シューティングゲームとかのスプライトみたいな処
理をするのでしたらAPIを使った物の方がよいでしょう。たくさんの小
さな部品を扱う場合は差が出ますので…)
 TImageの場合も、他の方がかかれているように、無効化のメッセージが
飛ばないとTImageの中のバッファ用ビットマップが描画されませんので…
逆に言うとそのメッセージが飛ばないようにプログラムをして、その間に
(プロパティーやメソッドやプロシージャーを抜けるなどをしなければ…)
TImageを書き換えると、画面がちらつかないで書き換えができます。

>一応、今回の問題点はTImageを使わないという形で
>(多分)うまいこといくのではないかと思います。
>C++に乗り換えようかと思ったのですが、
>皆さんの話を聞くとどうもDelphiのほうが断然使いやすいようなので
>当分Delphiを使いつづけます。
>そのうちにPascal用のヘッダーとかが簡単に入手できる
>世の中になるのではないかと期待しています。

 DirectXのVB用ヘッダーを出すとか言う話は聞いたことありますけど、
どうなんでしょうね…
 もし本当にそう言うのが面倒でしたら、C++な物に乗り換えるのがよいかもしれ
ませんね…
 それから、パスカル勢のコミュニティーを探せばそう言った物を作っている
人とかいないかな…? いろんな人と手分けすれば手間が少なくてすむでしょうし…


平生 ゆう
hirao@dog.net0726.or.jp
Technical Details
Message-ID: <84atrv$csu@www.net0726.or.jp>
Path: arc1-ca.pugleaf.net!unknown!not-for-mail
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>

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: "HIRAO" <hirao@dog.net0726.or.jp>
Subject: Re: 画面モード切替後のグラフィックパフォーマンスの低下
Date: 1999/12/29
Message-ID: <84atrv$csu@www.net0726.or.jp>
X-Deja-AN: 565729332
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>
Content-Type: text/plain; charset="iso-2022-jp"
X-MimeOLE: Produced By Microsoft MimeOLE V4.72.3155.0
Organization: NET0726
Mime-Version: 1.0
Newsgroups: japan.comp.lang.delphi,fj.comp.lang.pascal,fj.os.ms-windows.programming