0

私はゲームをしています。

このゲームでは、エンティティが画像を分析し、特定のプロパティ(高赤チャンネルなど)を持つピクセルに向かう必要があります。

Pixel Benderを調べましたが、これは画像に新しい色を書き込む場合にのみ役立つようです。現時点では、低解像度(200x200)でも、画像をスキャンする1つのエンティティだけが1〜2フレーム/秒に遅くなります。

画像を埋め込み、ステージの子としてビットマップとしてインスタンス化します。1-2 FPSの状況では、事前に距離を計算してBitmapData.getPixel()(各ピクセルで)を使用しています。

これをより効率的に行う方法があるかどうか疑問に思っています...私の最初の考えは、画像を多くの小さな部分に分割することと組み合わせた、ある種の空間分割でした。

また、Pixel Benderはどういうわけか役立つはずだと思いますが、私はそれについてほとんど経験がありません。

助けてくれてありがとう。ジョナサン

4

3 に答える 3

2

エンティティが向かうピクセルを「アトラクタ」と呼びましょう。これは、エンティティを引き付けるためです。

アトラクタのスキャンによるフレームレートの低下について説明しています。これは、フレームごとに画像をスキャンしている可能性があることを示しています。スキャンされた画像が静的であるか、ビデオ入力などのように頻繁に変化するかを指定しません。画像がフレームごとに変化するため、何らかの方法でアトラクタを再計算する必要がある場合、試みているのは ABC 仮想マシンを使用したリアルタイム コンピュータ ビジョンです。以下を参照してください。

変更されていない画像がある場合、最も重要な最適化は、画像を 1 回だけスキャンして、アトラクタの位置の要約 (または「メモ化」) を保存することです。各レンダリング フレームで、イメージ全体をスキャンするのではなく、既知のアトラクタのリストまたは配列を検索できます。ユーザーが画像を変更した場合は、最初から再計算するか、計算を段階的に更新することができます (必要に応じて)。

ActionScript 3 でリアルタイムのコンピューター ビジョンを実行しようとしている場合は、新しいvectorタイプの Flash 10.1 を検討し、abcsxを使用して ABC アセンブリ コードを記述するか、 Adobe の Alchemyを使用して C をコンパイルし、フラッシュランタイム。ABC は Flash のバイトコードです。つまり、リアルタイムのコンピューター ビジョンに AS3 を使用することを再考してください。

于 2010-06-03T03:05:16.700 に答える
0

BitmapData にはgetPixelsメソッドがあります (複数形であることに注意してください)。すべてのピクセルのバイト配列を返します。これは、別の for ループ内にネストされた内部で getPixel を呼び出す for ループよりもはるかに高速に反復できます。残念ながら、バイト配列は、その名前が示すように、1 次元のバイト配列であるため、各ピクセル (4 バイト) を反復するには、foreach ループではなく、for ループを使用する必要があります。デフォルトでは、各ピクセルのカラー チャネルに個別にアクセスできますが、これは目的のように思えます (「ハイ レッド チャネル」を持つピクセルを見つける) ため、特定のチャネルを分離するためにビットごとに各ピクセル値を指定する必要はありません。

getPixel が非常に遅いとどこかで読んだので、そこが最も節約できると思いました。私は間違っている可能性があるので、タイミングを計る価値があります。

于 2010-06-03T03:11:44.813 に答える
0

Heath Hunnicutt の anwser は良いものだと思います。画像が変わらない場合は、すべての色の値をベクトルに保存してください。または任意の byteArray をルックアップ テーブルとして使用するので、フレームごとに getPixel() を呼び出す必要はありません。

于 2010-07-15T02:04:23.170 に答える