Có sai không khi tạo đối tượng mới trong Update ()?


8

Tôi đang sử dụng Unity và đôi khi tôi đang sử dụng newtừ khóa thứ Update, như new Vector3()...

Tôi tự hỏi là điều này gây ra rò rỉ bộ nhớ? Ý tôi là trong mỗi khung hình, một Vector3 mới được tạo ra. Nếu đây là cách làm việc có nghĩa là có hàng ngàn vectơ được tạo trong bộ nhớ. Là sự thật hay tôi nghĩ sai?


2
Điều này nghe có vẻ như là một câu hỏi từ một người dùng C ++ điển hình, những người không quen thuộc với C #, đó có phải là một giả định đầy đủ không?
Pharap

Tôi đã trả lời một câu hỏi tương tự ở đây . Nó tốt để làm new Vector3bởi vì Vector3là một struct. Nếu đó là một lớp thì đó là một vấn đề. Đọc toàn bộ bài viết về việc sử dụng Object pooling.
Lập trình viên

Câu trả lời:


15

Trong C # có hai loại, đại khái là: loại giá trị và loại tham chiếu .

Bạn sử dụng newkhi bạn tạo cả hai, nhưng các loại giá trị được tạo trên ngăn xếp (hầu hết thời gian) và chỉ các loại tham chiếu được tạo trên heap. Sau khi được tạo, các loại tham chiếu dính xung quanh cho đến khi bộ thu gom rác xuất hiện, xác định chúng không còn cần thiết và thu thập chúng. Các thực thể trên ngăn xếp bị phá hủy hiệu quả khi khung ngăn xếp biến mất (khi chức năng chúng được tạo ở cuối).

Vector3là một loại giá trị trong Unity, vì vậy hầu như tất cả các phiên bản bạn từng tạo sẽ được lưu trữ trên ngăn xếp và do đó rẻ cho cả việc tạo và hủy. Vì vậy, bạn không có khả năng làm bất cứ điều gì sai ở đây. Nó chắc chắn không tạo ra rò rỉ bộ nhớ và gần như chắc chắn sẽ không phải là vấn đề về hiệu năng (dù sao bạn cũng muốn cấu hình để chắc chắn).

Việc tạo ra nhiều kiểu tham chiếu mới, mọi khung hình đều có thể gặp vấn đề vì điều đó có thể khiến trình thu gom rác chạy thường xuyên hơn, gây ra các vướng mắc khi nó tạm dừng tất cả các luồng của bạn để thực hiện công việc của nó. Nhưng các loại giá trị như Vector3là một đặt cược khá an toàn.


1
Tôi nghĩ bạn nên nhấn mạnh rằng "các loại giá trị được tạo trên ngăn xếp (hầu hết thời gian)" chỉ đúng với các biến cục bộ . Tôi biết đó là một chút mô phạm nhưng cách mà nó hiện tại có thể đánh lừa người mới bắt đầu. Một inttrường trong một kiểu tham chiếu kết thúc trên heap vì các kiểu tham chiếu được lưu trữ trên heap. Bỏ qua chuyện đó, +1
Doval

1
@Doval một tuyên bố chính xác hơn nhiều sẽ là "các loại giá trị được đặt trong không gian được phân bổ trước đó như trên ngăn xếp hoặc bên trong không gian được phân bổ của loại tham chiếu".
ratchet freak
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.