2013-07-05 37 views
11

Unity3D Profiler mang lại cho tôi những đột biến chủ yếu là về thu gom rác thải. Trong ảnh chụp màn hình dưới đây, ba gai đỏ đại diện cho ba quầy hàng mà tôi có trong trò chơi của mình. Mỗi gian hàng trong số này là 100 + ms và phần lớn thời gian được sử dụng trên TrackDependencies.Unity3D: tối ưu hóa bộ sưu tập rác

Theo Unity instruction, tôi đã cố gắng này thêm vào mã của tôi:

if (Time.frameCount % 30 == 0) 
{ 
    System.GC.Collect(); 
} 

này đã không giúp đỡ. Tôi vẫn có gai và họ vẫn mất 100 + ms. Chính xác những gì đang diễn ra và tôi có thể làm gì để tối ưu hóa trò chơi của mình?

PS:

Tôi đang tự động tạo ra và phá hủy rất nhiều GameObject s trong trò chơi của tôi. Có thể đó là một vấn đề?

Tôi không có chuỗi nối trong một vòng lặp hoặc mảng dưới dạng giá trị trả về như được báo trước trong the post.

profiler

+0

bạn có đang hủy các đối tượng ở đâu đó trong mã của mình không? – Heisenbug

+0

Nếu có thể, việc gộp các vật thể của bạn để tránh phá hủy quá mức có thể là một giải pháp tốt. – SlxS

+0

@Heisenbug Có Tôi đang tự động tạo và phá hủy rất nhiều đối tượng trong trò chơi của mình. Trong hàm hủy đối tượng của tôi, tôi cũng được gọi là 'Resources.UnloadUnusedAssets();' – CherryQu

Trả lời

12

này đã không giúp đỡ. Tôi vẫn có gai và họ vẫn mất 100 + ms. Chính xác những gì đang diễn ra và tôi có thể làm gì để tối ưu hóa trò chơi của mình?

Với System.GC.Collect bạn chỉ đơn giản là bắt buộc thu gom rác. Nếu bạn đã phân bổ rất nhiều bộ nhớ để được deallocated từ thu thập cuối cùng, hơn bạn không thể tránh gai. Điều này chỉ hữu ích để cố gắng phân phối bộ sưu tập rác theo thời gian tránh một sự thỏa thuận lớn.

Tôi đang tạo và hủy rất nhiều GameObject trong trò chơi của mình. Có thể đó là một vấn đề?

Có lẽ đây có thể là vấn đề.

Một số gợi ý:

  • Cố gắng phân bổ (LoadResourceInstantiate) càng nhiều càng tốt các nguồn lực của bạn tại bắt đầu của bạn ứng dụng. Nếu bộ nhớ được yêu cầu không quá nhiều, bạn có thể đơn giản hóa tất cả các tài nguyên bạn cần và vô hiệu hóa/kích hoạt chúng theo yêu cầu. Nếu yêu cầu bộ nhớ tài nguyên là rất lớn, điều này là không thể đạt được.
  • Tránh gọi điện thoại đến InstantiateDestroy. Tạo một nhóm đối tượng nơi một tập hợp các tài nguyên được khởi tạo khi ứng dụng bắt đầu. Bật tài nguyên bạn cần và tắt tất cả các tài nguyên còn lại. Thay vì phá hủy một đối tượng phát hành nó vào hồ bơi, để nó có thể bị vô hiệu hóa và thu hồi theo yêu cầu.
  • Tránh gọi điện thoại đến Resources.UnloadUnusedAssets. Điều này chỉ có thể tăng thời gian cần thiết để khởi tạo một tài nguyên mới nếu trước đó bạn đã phát hành nó. Nó rất hữu ích để opitmize sử dụng bộ nhớ, nhưng gọi nó ở khoảng thời gian chi phí hoặc mỗi khi bạn phá hủy một đối tượng không có ý nghĩa.