5

私は、RoyTanckのCumulusTagCloudビューアであるWordPressFlashプラグインをエミュレートするネイティブDelphiTFrameを持っています。そのプラグインが行うことは、「仮想」球の表面上で回転する単語の3D球を作成することです。ここで実際の動作を確認できます。

http://www.roytanck.com/2008/03/06/wordpress-plugin-wp-cumulus-flash-based-tag-cloud/

私のアプリケーション構造では、各単語に独自のTBitmapがあり、球をレンダリングするために、すべての単語のビットマップを一時的なTBitmapに出力し、次にその一時的なTBitmapを表示されているTPaintBoxのキャンバスにBitBlt()します。レンダリング操作は、50ミリ秒ごとに発生するTTimerタイマーイベントで発生します。

しかし、どんなに一生懸命頑張っても、特にFlashプレーヤーの滑らかで滑らかな動きと比較すると、単語の動きには目立った「ジッター」があります。フレームレートを上げると役立つかもしれないと思い、MMタイマーのマルチスレッドの性質により、すべてのキャンバスを適切にロックおよびロック解除して10ミリ秒ごとに更新されるマルチメディアタイマーを使用してみました。まだぎくしゃくしている。私が理解できる唯一のことは、私が行う計算では、レンダリングする単語ごとに個別のピクセル位置が得られ、それがジッターを引き起こすということです。対照的に、これは想定ですが、おそらくFlashは「ピクセル間」レンダリングを容易にするためにディザリングを行う可能性があります。または、リアルタイムでアンチエイリアシングを行う可能性があります。そのため、ジッターは発生しません。

いずれにせよ、ネイティブのDelphiコードを使用して、私が探している絹のような滑らかな動きを得ることができますか?それとも、Direct3DやOpenGLソリューションのようなものに完全に移行することが唯一の方法ですか?それが敗戦であるならば、私はこれを死ぬまで微調整する時間を無駄にしたくありません。一方で、何かアドバイスがあれば聞いてみたいです。私の推測では、Direct3D / OpenGLルートを使用する必要がある場合、それは大きな仕事であり、学習曲線であるため、ネイティブのDelphiコードでこれを実行する方法を見つけることができればそれが大好きです。

フォローアップ編集:はるかに大きな「仮想」ビットマップに印刷してから、ここに示すようなリサンプリング方法を使用すると、実際に表示されるキャンバスに「下」に印刷するのに役立ちますか?:

Delphiで画像を適切に拡大縮小しますか?

4

2 に答える 2

2

私はDelphiで多くのゲームを書いてきました。それは確かに実行可能です。注意すべきことがたくさんあります。

イベントを定期的にトリガーするだけでなく、予想される待機時間に基づいて時間を想定するのではなく、ポーリングされた時間に基づいてイベントが到着して移動する時間を確認する必要があります。

GPUに依存しないサブピクセルの精度が必要な場合は、Antigrain Geometryまたは、Delphi用のPascalのいとこAGGPASをお勧めします。

フォントのアニメーション化には、フォントレンダリングに、ピクセル境界に細いストロークが表示されるようにするロジックが含まれていることが多いという追加の問題が発生する可能性があります。この方法でレンダリングされたテキストを移動すると、さまざまなストロークが1つのピクセルの位置合わせから次のピクセルにジャンプする可能性があるため、外観が変わる可能性があります。

フォントがピクセルに揃えられるようにレンダリングされる場合は、レンダリングを整数に量子化した方がうまくいく可能性があります。それでもピクセルに整列しますが、一度にピクセルを移動することにより、毎回一貫して整列するはずです。

于 2012-01-30T00:46:39.123 に答える
1

私見の正しい道はDirect3Dです(またはOpenGLですが、DelphiがWindowsであるとすれば、Direct3Dの方が良いかもしれません)。GDIがそのようなタスクに長けていないという理由だけで導入されました。Flashは、ベクターグラフィックとラスターグラフィックの両方をサポートしているため、このような種類のアプリケーションを古いプレーンGDIよりも適切に処理できます。

于 2010-10-10T13:05:40.150 に答える