2011-01-28 21 views
5

WebGlを使用してJavaScriptで簡単なゲームエンジンを作成しようとしていますが、一般的にはJavaScriptで望ましくない問題が発生しています。 JavaScriptのパフォーマンスが全体的に不足するだけでなく、WebGlでレンダリングするといくつかの奇妙な一時停止が発生します。これは定期的に、1秒に1回程度発生します。私はこれがJavaScriptのGCで起こらなければならないと仮定します。これらの「吃音」を最小限にするためにとにかくありますか?ガベージコレクションの少なくとも一部を強制的に制御する方法が、私が知るべき共通の慣行が、私が制御できる時に起こるか?Javascriptのガベージコレクションの一時停止

これらは簡単な質問ですが、私はJavaScriptにはかなり新しいので、インターネットで検索しても役立つ情報は得られませんでした。

+2

もちろんGCかもしれませんが、私の経験では、いつも何かのためにGCを非難したとき、私たちはコードのどこかで普通の間違いがあったことが判明しました。 – Boldewyn

+0

ブラウザのプロファイリングツールを使用してください。 @Boldewynが示唆しているように、問題は実際にはGCではないかもしれません。早期に最適化すると、複雑なコードが必要になることがありますが、プロファイリングメトリックを使用しないで最適化すると、実際にはパフォーマンスが向上しない場合もあります。 – namuol

答えて

2

できるだけ頻繁にオブジェクトを再利用してください。レンダリングされたフレームごとに数十のオブジェクト(ベクトルや行列など)を作成する場合は、間違いなくGC関連の吃音を受け取ります。 シーン・グラフ・ベースのアプローチを使用してゲームをレンダリングする場合、シーン・グラフ・ノードなどにオブジェクトをキャッシュすることができます。またはObject Pool Patternを使用することもできます。 Javaのような他の言語では、オブジェクトの作成とGCが非常に高速であり、オブジェクトプールがこれ以上役に立たないため、このテクニックは推奨されていません。しかし、JavaScriptではまだ役立つかもしれません。

私は昨年書きましたJavaScriptのゲームでGC-stutter-problemsを持っていました.2Dベクトルエンジンを書き直して解決しましたので、フレームレンダリング中に新しいオブジェクトが全く作成されません。オブジェクトは、シーンが構築されたとき、または新しいシーンノードが追加されたときに初めて作成されます。しかし、シーンを表示してアニメートすると、新しいオブジェクトは全く作成されません。

あなたは私の2Dエンジンで見てみたいことがあります。

http://www.ailis.de/~k/hg/javascript/twodee/file/tip/src/main/javascript/twodee

あなたは、私が静的フィールドに一時的に必要なベクトルや行列をキャッシュしていることに気づくでしょう

私の代わりに可変ベクトルや行列クラスを使用していること不変の既存のベクトル/行列は、新しい結果ベクトル/行列を作成する代わりに修正されます。

関連する問題