2013-07-07 36 views
6

Tôi có một ứng dụng C# bao gồm một Pivot với nhiều Pivotitems. Pivotitems bình thường dỡ bỏ đúng cách và không làm rò rỉ bộ nhớ. Mặc dù vậy, trên hai mặt hàng, tôi có Drawingsurfaces mà tôi sử dụng Monogame để tạo ra các mô hình 3D. Khi dỡ và tải các chốt của chúng, tôi đang cố gắng phá hủy hoàn toàn và sau đó tái tạo hoàn toàn các game "Game" (chủ yếu là vì Monogame không cho phép bạn vẽ hai bề mặt vào lúc này và vì chúng sử dụng nhiều bộ nhớ và có không đủ cho cả hai).C# Làm thế nào để loại bỏ hoàn toàn đối tượng khỏi bộ nhớ

Vấn đề của tôi xuất hiện khi tôi vứt bỏ Xamlgame được tạo khi tải nó không giải phóng tất cả bộ nhớ mà nó đã sử dụng. Điều này có nghĩa là mỗi khi tôi tạo lại Xamlgame, nó chỉ bắt đầu sử dụng nhiều bộ nhớ hơn cho đến khi không còn gì nữa. Vì vậy, tôi muốn biết nếu có bất kỳ cách nào C# để xử lý hoàn toàn tất cả bộ nhớ đã được đưa vào sử dụng khi tải một đối tượng.

Bất kỳ cách cụ thể nào của Monogame cũng sẽ được đánh giá cao. Tại thời điểm đầu tiên tôi xử lý vertex và index buffer, sau đó tôi xóa các đỉnh và danh sách chỉ mục, sau đó xử lý Basiceffect và Graphicsdevicemanager của mình, sau đó tôi gọi nó là "game" và cuối cùng tôi tạo biến chứa "trò chơi" bằng null.

PS. Nếu bạn đã từng làm điều này trong XNA thì bạn cũng có thể giúp tôi vì cú pháp về cơ bản giống nhau.

EDIT (Có thể MonoGame bug):

bây giờ tôi đã được quản lý để làm sạch tất cả các bộ đệm, vv lên đúng cách. Vẫn còn một rò rỉ bộ nhớ trên BasicEffect của tôi mặc dù. Tôi đã thử xử lý nó và làm cho nó null nhưng không có vấn đề gì nó chỉ giữ sử dụng nhiều hơn và nhiều hơn nữa bộ nhớ mỗi khi tôi tải lại trục của tôi.

+0

Nếu bạn đang xử lý tất cả các tài nguyên 'IDisposable' thì thực hiện [' GC.Collect'] (http://msdn.microsoft.com/en-us/library/System.GC.Collect.aspx) không công việc? – Romoku

+0

Tôi đang gọi nó nhưng nó dường như không có hiệu lực – Gerharddc

+0

bạn có chắc chắn rằng bạn đang xử lý tất cả các kết nối và các mục? bạn có thể chia sẻ mã của bạn không? –

Trả lời

-2

Rõ ràng MonoGame chỉ đơn giản là không hỗ trợ được tạo nhiều hơn một lần trong một trò chơi và sẽ rò rỉ bộ nhớ nếu thao tác này được thực hiện. Hơi phức tạp hơn là chỉ sử dụng một cá thể trò chơi và thay đổi bảng điều khiển mà nó đang vẽ.

6

sử dụng bộ thu gom rác và đợi để hoàn tất.

  GC.Collect(); 
      GC.WaitForPendingFinalizers(); 
4

Trước tiên, bạn sẽ cần phải thiết lập giá trị null để nó không còn được sử dụng:

XamlGame = null 

Sau đó, bạn có thể kích hoạt các bộ thu rác:

GC.Collect(); 
GC.WaitForPendingFinalizers(); 

Nếu nó không xử lý hơn đối tượng XamlGame không phải là null hoặc tham chiếu đến nó vẫn đang được giữ bởi một đối tượng khác.

Hãy nhớ rằng nếu XamlGame được kế thừa từ lớp Trò chơi bạn sẽ không thể vứt bỏ nó vì nó chứa vòng lặp thực thi đang chạy giữ toàn bộ ứng dụng trò chơi còn sống. Nếu bạn vứt bỏ nó, ứng dụng sẽ sụp đổ và chấm dứt.

Các vấn đề liên quan