質問

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

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

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

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

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

また、Pixel Benderはどういうわけか助けることができるはずですが、経験はほとんどありませんでした。

どんな助けにも乾杯。ジョナサン

役に立ちましたか?

解決

エンティティがエンティティを引き付けるため、エンティティが「アトラクタ」に向かっているピクセルを呼び出してみましょう。

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

不変の画像がある場合、あなたができる最も重要な最適化は、1回だけ画像をスキャンし、アトラクタの場所の概要(または「メモ」)を保存することです。各レンダリングフレームで、画像全体をスキャンするのではなく、既知のアトラクタのリストまたは配列を検索できます。ユーザーが画像を変更した場合、ゼロから再計算するか、計算を段階的に更新することができます - 適切に見えるように。

ActionScript3でリアルタイムのコンピュータービジョンを実行しようとしている場合は、新しいものを見ることをお勧めします vector フラッシュ10.1の種類と、どちらかを使用することを検討する ABCSX ABCアセンブリコードを作成するか、使用します アドビの錬金術 Cをフラッシュランタイムにコンパイルします。 ABCはフラッシュのバイトコードです。言い換えれば、リアルタイムコンピュータービジョンに対するAS3の使用を再考します。

他のヒント

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

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

Heath HunnicuttのAnwserは良い人だと思います。画像が変更されない場合、すべての色の値をベクトルに保存するだけです。または、何でもbytearrayしてルックアップテーブルとして使用するため、すべてのフレームをgetpixel()を呼び出す必要はありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top