2016-04-05 12 views
0

私は数年前からXNA(vb.net)のゲームプロジェクトに取り組んできましたが、正式な教育を受けていないので試しながら勉強しています。これは、私が非効率的にコードを書いているかもしれないということを意味しています。私の問題:XNA(vb.net)で私のゲームのデバッグを開始する

今日、初めてデバッグを開始すると、最初のフレームが描画される前にエラーが表示されます(白いウィンドウが表示されます)。それは私のgame.Run()をエラーSystem.OutOfMemoryExceptionで強調表示しています。私はそれをクリップボードにコピーすると言う:

System.OutOfMemoryException was unhandled 
HResult=-2147024882 
Message=Exception of type 'System.OutOfMemoryException' was thrown. 
Source=WindowsGame2 
StackTrace: 
    at WindowsGame2.Game1.Draw(GameTime gameTime) 
    at Microsoft.Xna.Framework.Game.DrawFrame() 
    at Microsoft.Xna.Framework.Game.Tick() 
    at Microsoft.Xna.Framework.Game.HostIdle(Object sender, EventArgs e) 
    at Microsoft.Xna.Framework.GameHost.OnIdle() 
    at Microsoft.Xna.Framework.WindowsGameHost.RunOneFrame() 
    at Microsoft.Xna.Framework.WindowsGameHost.ApplicationIdle(Object sender, EventArgs e) 
    at System.Windows.Forms.Application.ThreadContext.System.Windows.Forms.UnsafeNat iveMethods.IMsoComponent.FDoIdle(Int32 grfidlef) 
    at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.Unsafe NativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) 
    at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
    at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 
    at System.Windows.Forms.Application.Run(Form mainForm) 
    at Microsoft.Xna.Framework.WindowsGameHost.Run() 
    at Microsoft.Xna.Framework.Game.RunGame(Boolean useBlockingRun) 
    at Microsoft.Xna.Framework.Game.Run() 
    at WindowsGame2.Program.Main(String[] args) in C:\Projects \WindowsGame2\WindowsGame2\WindowsGame2\Program.vb:line 9 
InnerException:  

私はその日のコードに特定の変更を加える思い出すことはできませんが、単にabitは、より多くのコンテンツを追加します。私はこれがあいまいだと知っていますが、それは私が考えることができるすべてです。私はそこにあるすべてのフォーラムを掘り下げてきましたが、無駄です。 問題を理解するのに役立つ情報がありますか? 私はどんな助けにも感謝しています! /クリスチャン

EDIT: コードを最適化しようとしましたが、コードがかなりスムーズに実行されるはずです。たとえば、以前よりもはるかに少ないループを使用しています。 問題は実行中のようではなく、開始時にのみ問題になります。今私は約1/5回私はデバッグを押し始めるようになる。

+0

ソースコードリビジョン管理を使用していると思われますか?どのような変更が行われたかを確認してください..... –

+0

私はそれが今ではグーグルグーグルになる前に何があったのか分かりませんでした。そうではない、私はそれを使用していない。それが自動化されているのであれば、私は気づいていません。もう一度、私がプロジェクトについて変更したのは、いくつかの新しいイメージを追加し、それらを組み込むことでした(標準的なプロデュキュア、毎日同じ) –

+0

それを使用してください。コードなしでコードを開発しないでください。 (例えば、Gitを使用してください。 –

答えて

0

StackトレースがDrawメソッドを指しているようです。 1秒間に60回(60fpsと仮定して)発生するので、フレーム(描画または更新のいずれか)ごとにオブジェクトを不必要に再作成しないようにしてください。

起動時に何が作成されているかを減らすことができるかどうかは、何度か起きるだけで、起きない場合もあります。必要なときだけ必要なものを作成するようにしてください。

スタックトレースが正しく、問題がDrawメソッドで特に発生している場合は、フレームごとに不必要にテクスチャを再作成していないことを確認し、終了時にオブジェクトに.Dispose()を呼び出すようにしますそれと。

+0

あなたの答えをありがとうございます。私はdrawfunctionで何も再作成しません。最初にcontent.loadのテクスチャロード。1000テクスチャを読み込む前に、今度は約950で、デバッグを約50%試してみることができます。問題がある場合は、どのようにテクスチャをロードできますか?後でスタートアップ時の代わりに? –

+0

多くのテクスチャをロードする理由に依存します。レベルベースのゲームの場合は、そのレベルで必要なテクスチャだけをレベル開始でロードします。 アニメーションを行う場合は、画像ごとに1つのテクスチャを使用せず、代わりに特定の文字のアニメーションの集まりであるSpritesheetsを使用してください。 レベルがなく、RPGスタイルのゲームではなく、あなたの世界を「タイル」に分割して見て、プレーヤーが特定のタイルの特定の範囲にあるときに読み込みと読み込みを解除します。 また、テクスチャは2の累乗でできるだけ小さくしてください。 – Slubberdegullion

+0

ええ、それはRPGではありませんが、オープンワールドではないので、プレイヤーが「世界」の間に数秒待つことは大したことではありません。私はちょうどそれを行う方法を知らない。私はそれを見ていきますが、あなたがそれを(vb.netで)行う方法を知っていれば分かり、共有することができます!私はスプライトシートについて知っているか、単にテクスチャごとに複数の画像を持っています。私はいつもそのように最適化しようとしました。テクスチャを2の累乗で小さくすることは、どういう意味ですか?私がなぜ多くのテクスチャを読み込むのかは、それが非常に多くのコンテンツであることだけであり、別の時に読み込む方法がわかりません。 –

関連する問題