2015-05-19 19 views
10

Đề cập đến this Unity documentation và đi đến phầnTại sao mẹo quản lý bộ nhớ này hoạt động?

đống lớn với chậm nhưng không thường xuyên thu gom rác thải

var tmp = new System.Object[1024]; 

    // make allocations in smaller blocks to avoid them to be treated in a special way, which is designed for large blocks 
    for (int i = 0; i < 1024; i++) 
     tmp[i] = new byte[1024]; 

    // release reference 
    tmp = null; 

Bí quyết là tiền phân bổ một số khối bộ nhớ khi bắt đầu chương trình.

Tại sao mẹo này hoạt động?

Các đoạn có phải là một phần của "đã đăng ký" (hoặc "bị ràng buộc") đối với ứng dụng khi chúng được phân bổ trước hay không, để mặc dù tmp đang được giải phóng khi Start() kết thúc, HĐH vẫn xử lý các khối này là "đã đăng ký" cho ứng dụng? Vì các khối được "đăng ký" với ứng dụng, do đó kích thước của ứng dụng được mở rộng đến kích thước nhất định và lần sau nó thu thập bộ nhớ, hệ điều hành sẽ chọn nó từ đống ứng dụng này.

Giải thích của tôi có đúng không? Không có vấn đề Có hoặc Không ai đó có thể vui lòng giải thích chi tiết hơn, cảm ơn.

Trả lời

5

Nó không thực sự là một thủ thuật. Đó là cách mà các bộ phận của Unity3D xử lý bộ nhớ.

Trong Unity3D bạn có các đối tượng được xử lý bởi Mono và sẽ được thu thập rác và các đối tượng được Unity xử lý, sẽ không bị thu gom rác. Chuỗi, ints vv được làm sạch bởi Mono tự động và chúng tôi không phải lo lắng về điều này. Texture (2D) s vv không, và chúng ta phải xử lý các đối tượng này một cách thủ công.

Khi yêu cầu bộ nhớ được thực hiện, điều đầu tiên xảy ra là trình quản lý bộ nhớ quét bộ nhớ hiện đang được cấp của ứng dụng từ hệ điều hành cho một đoạn đủ lớn để lưu trữ dữ liệu bạn đang yêu cầu. Nếu tìm thấy một kết quả phù hợp, bộ nhớ đó sẽ được sử dụng. Nếu không tìm thấy kết quả phù hợp, ứng dụng sẽ yêu cầu thêm bộ nhớ từ hệ điều hành để lưu trữ dữ liệu của bạn. Khi dữ liệu này không còn được sử dụng nữa, nó sẽ được thu thập rác, nhưng ứng dụng vẫn giữ lại bộ nhớ đó. Về bản chất, nó đặt một lá cờ trên bộ nhớ để nói rằng nó có thể sử dụng được hoặc có thể phân bổ lại. Điều này làm giảm các yêu cầu cho bộ nhớ được thực hiện cho hệ điều hành bằng cách không bao giờ trả lại nó.

Điều này có nghĩa là hai điều;

1) Bộ nhớ của ứng dụng của bạn sẽ chỉ tiếp tục phát triển và sẽ không trả lại bộ nhớ cho hệ điều hành. Trên thiết bị di động, điều này rất nguy hiểm, như thể bạn sử dụng quá nhiều bộ nhớ, ứng dụng của bạn sẽ bị chấm dứt.

2) Ứng dụng của bạn thực sự có thể được phân bổ nhiều bộ nhớ hơn mức thực tế cần. Điều này là do bộ nhớ bị phân mảnh. Bạn có thể có 10MB bộ nhớ khả dụng trong bộ nhớ của ứng dụng, nhưng không phải khối lượng đó đủ lớn để chứa dữ liệu bạn cần lưu trữ.Do đó, có thể ứng dụng sẽ yêu cầu nhiều bộ nhớ hơn từ hệ điều hành vì không có một bộ nhớ tiếp giáp có sẵn có thể được sử dụng.

Vì bạn đang tạo một đối tượng lớn, do đó yêu cầu bộ nhớ, khi bạn đặt đối tượng đó thành rỗng và báo hiệu cho bộ thu gom rác mà bộ nhớ không còn cần thiết cho ứng dụng, sẽ nhanh hơn để phân bổ lại bộ nhớ các đối tượng khác thay vì yêu cầu thêm bộ nhớ từ hệ điều hành. Đó là lý do tại sao trong lý thuyết phương pháp đặc biệt này là nhanh chóng và sẽ dẫn đến gai ít hiệu suất như thu gom rác được gọi ít thường xuyên hơn. Đặc biệt vì đây là một phân bổ bộ nhớ lớn, liền kề.

4

Tại sao mẹo này hoạt động?

Thủ thuật này hoạt động vì ứng dụng sẽ không trả lại bộ nhớ cho hệ điều hành, trừ khi trình quản lý bộ nhớ OS thấp và yêu cầu họ làm như vậy, trong đó họ sẽ giải phóng càng nhiều càng tốt. Có một giả định rằng một khi bộ nhớ được cấp phát, nó sẽ cần thiết một lần nữa. Nếu nó đã được phân bổ, không có lý do để trả lại cho hệ điều hành, trừ khi nó thực sự cần phải sử dụng nó.

+0

@downvoter - Hãy cẩn thận để làm sáng tỏ những gì bạn thấy sai? –