9

I work on a 2D shooter game with lots of moving objects on the screen (bullets etc).

I use BitmapData.copyPixels(...) to render entire screen to a buffer:BitmapData. Then I "copyPixels" from "buffer" to screen:BitmapData. The framerate is 60.

private var bitmap:Bitmap = new Bitmap();
private var buffer:Bitmap = new Bitmap();

private function start():void {
    addChild(bitmap);
}

private function onEnterFrame():void {
    // render into "buffer"
    // copy "buffer" -> "bitmap"
}

The problem is that the sprites are tearing apart: some part of a sprite got shifted horizontally.

It looks like a PC game with VSYNC turned off.

Did anyone solve this problem?

UPDATE: the question is not about performance, but about getting rid of screen tearing.

[!] UPDATE: I've created another question and here you may try both implementations: using Flash way or BitmapData+copyPixels()

4

3 に答える 3

7

私は現在、自分のゲームを開発する塹壕にいるので、あなたの痛みを感じています. デフォルト設定では、生成するコードに関係なく、Flash レンダラーは恐ろしい画面のティアリングや v-sync の問題を引き起こします。

これが、コードのリファクタリングではない、最もシンプルでエレガントな答えを見つけたことを嬉しく思います (これは少しも役に立ちません。問題はコードではなく Flash プレーヤーです)。

パブリッシュ設定でハードウェア アクセラレーションを有効にするだけです。2 つの異なるオプションがあります。

レベル 1: 直接; およびレベル 2: GPU

詳細については、公式ドキュメントを参照してください: SWF ファイルのパブリッシュ設定を指定し、ゲームに最適なオプションを決定してください。

ターゲット市場はここで重要な要素になります。ゲーマーにとって深刻なゲームであれば、ほとんどのゲーマーが GPU を使用しているため、パフォーマンスの問題について心配する必要はありません。

この記事は具体的な解決策を提供してくれませんでしたが、正しい方向に導いてくれました。ただし、ゲームがブラウザー ウィンドウに表示される場合は、wmode を direct または gpu に設定する同じ手法を使用する必要がある場合があります。

于 2010-03-14T22:42:04.847 に答える
-4

First thing you might want to do is stop treating the Flash Player like it is DOS. The Flash Player is a highly optimized 2D game engine as it is and I don't really understand why you are trying to reinvent the wheel by copying lots of bitmap slices around. Of course you will have performance issues.

The Flash Player doesn't let you sync to any vertical or horizontal blank because the Flash Player simply doesn't have any concept of this.

I personally think that you should rethink you approach if you want 'smoother' animation. The Flash Player is certainly capable of this, you're just trying the wrong approach.

于 2009-06-12T23:21:03.627 に答える
-5

ものを BitmapData に保存しないでください。アプリが完全に殺されます。ビットマップ データはあまりパフォーマンスが高くありません。

すべてのゲーム要素をスプライト (または必要に応じてムービークリップ) として Flash で作成し、ベクター アニメーション プラットフォームとして、Flash の本来の動作を実現します。2D ビットマップ グラフィックス用に最適化されたことはありません。2D ベクター グラフィックスは適切に機能し、ビットマップをインポートした場合でも、より適切に動作し、BitmapData オブジェクトにレンダリングされます。

于 2009-06-12T23:25:19.450 に答える