2016-04-05 24 views
0

Birkaç yıldan beri XNA'da (vb.net) bir oyun projesi üzerinde çalışıyorum, ancak resmi bir eğitimim yok. Denerken öğreniyorum. Bu, kodun verimsiz veya basitçe yanlış yazabileceği anlamına gelir (göz önünde bulundurulması iyi). Sorunum:Trouble oyunumun başındaki hata ayıklama XNA (vb.net)

Bugün, ilk kez, hata ayıklamasını başlattığımda ilk karenin çekilmesinden önce bir hata alıyorum (beyaz bir pencere belirir). game.Run() benim System.OutOfMemoryException hata ile vurgulamaktadır. Bunun panoya kopyalarken şöyle der: basitçe abit fazla içerik eklemek için

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:  

o gün kodunda herhangi bir değişiklik yapmadan geri çağırmak, ancak olamaz. Bunun belirsiz olduğunu biliyorum, ama düşünebildiğim tek şey bu. Orada her forumda kazdım ama boşuna. Sorunu anlamanıza yardımcı olabilecek herhangi bir bilgi var mı? Yardımlarınız için minnettarım! /Christian

EDIT: Kodu optimize etmeyi denedim (ve biraz da olsa), bu yüzden bir kez daha düzgün çalışmalıdır. Örneğin, şimdi eskisinden çok daha az aşırı döngü kullanıyorum. Sorun, çalışırken çalışırken görünmüyor, ancak yalnızca başladığında. Şimdi debug'a bastığım yaklaşık 1/5 kez başlayayım.

+0

muhtemelen kaynak kodu revizyon kontrolünü kullanıyorsunuz? hangi değişikliklerin yapıldığını kontrol edin ..... –

+0

Bunu şimdi bile googling önce ne olduğunu bilmiyordum. Yani hayır, kullanmıyorum. Eğer otomatikse, bunun farkında değilim. Yine de, proje hakkında değiştirdiğim tek şey, bazı yeni görüntüler eklemek ve bunları birleştirmek oldu (her gün aynı standart prodecure) –

+0

Kullanın. Kod yazmadan geliştirin. (örn. Kullan Git. –

cevap

0

Yığın izi, sizi Çizim yöntemine işaret ediyor gibi görünüyor. Her kareyi (çekilişte veya güncellemede) gereksiz yere yeniden oluşturmadığınızdan emin olun, çünkü bu saniyede 60 kez olur (60 fps varsayılarak).

Sadece birkaç kez gerçekleştiğini ve diğer zamanlarda olmadığını söylediğinizden, başlangıçta yaratılmakta olanı azaltabileceğinizi de görün. İhtiyacınız olduğunda sadece ihtiyacınız olanı yarattığınızdan emin olun.

Yığın izi doğruysa ve Çizim yönteminizdeki sorun YALDIR ise, her karede dokuları gereksiz yere yeniden oluşturmadığınızdan emin olun ve işiniz bittiğinde buna sahip olduğunuz herhangi bir nesneyi arayın. Bununla.

+0

Cevabınız için teşekkür ederiz. Çekimde hiçbir şey yaratmıyorum, ancak bazılarını sildiğimde daha iyi bir değişiklik yaşadım. Başlangıçta content.load'daki textureloads.Yaklaşık 1000 dokumanı yüklemeden önce, şimdi 950 civarındayım ve hataların yaklaşık% 50'sini başlatabilirim. Sorun buysa, dokuları nasıl yükleyebileceğimi biliyor musunuz? daha sonra açılışta yerine? –

+0

Bu kadar çok dokuyu neden yüklediğinize bağlı. Seviye tabanlı bir oyunsa, sadece bu seviyenin gerektirdiği dokuları seviye başlangıcında yükleyin. Animasyon yapıyorsanız, görüntü başına bir doku kullanmayın, bunun yerine belirli bir karaktere ait animasyonlar koleksiyonu olan Spriteto'ları kullanın (bilmiyor olmanız durumunda). Seviye yoksa ve RPG stili bir oyunsa, dünyanızı "fayans" a ayırın ve müzikçalar belirli bir döşemenin belirli bir aralığında olduğunda yükleyin ve boşaltın. Ayrıca, dokularınızı olabildiğince küçük hale getirin 2. – Slubberdegullion

+0

Evet, bir RPG roguelike, ama openworld değil, bu yüzden oyuncular için "dünyalar" arasında birkaç saniye beklemek için büyük bir anlaşma olmayacaktır. Sadece nasıl yapacağımı bilmiyorum. Yine de ona bakacağım, ama nasıl yapılacağını (vb.net) biliyorsanız ve paylaşabiliyor olsaydı memnun olurum! Spritetoitler hakkında veya doku başına birden fazla resme sahip olduğumu biliyorum. Her zaman bu şekilde optimize etmeye çalıştım. 2 gücünde küçük dokular yaparak ne demek istiyorsun? Bu kadar çok dokuyu neden yüklediğime gelince, sadece çok fazla içerik olduğu için ve bunu farklı zamanlarda nasıl yükleyeceğimi bilmiyorum. –