
Phân tích hiệu năng bộ nhớ trong Unity
Trang web này đã được dịch bằng máy để thuận tiện cho bạn. Chúng tôi không thể đảm bảo tính chính xác hoặc độ tin cậy của nội dung được dịch. Nếu bạn có thắc mắc về tính chính xác của nội dung được dịch, vui lòng tham khảo phiên bản tiếng Anh chính thức của trang web.
Bằng cách phân tích và tinh chỉnh hiệu năng trò chơi của bạn cho nhiều nền tảng và thiết bị khác nhau, bạn có thể mở rộng lượng người chơi và tăng cơ hội thành công.
Trang này cung cấp thông tin về hai công cụ để phân tích mức sử dụng bộ nhớ trong ứng dụng của bạn trong Unity: mô-đun Memory Profiler tích hợp sẵn và gói Memory Profiler , một gói Unity mà bạn có thể thêm vào dự án của mình.
Thông tin ở đây được trích dẫn từ sách điện tử " Hướng dẫn tối ưu về phân tích hiệu năng trò chơi Unity" , có thể tải xuống miễn phí . Cuốn sách điện tử này được biên soạn bởi các chuyên gia Unity cả bên ngoài và nội bộ, chuyên về phát triển game, phân tích hiệu năng và tối ưu hóa.
Hãy đọc tiếp để tìm hiểu về phân tích hiệu năng bộ nhớ trong Unity.
Phân tích bộ nhớ
Phân tích hiệu năng bộ nhớ rất hữu ích để kiểm tra khả năng tương thích với các giới hạn bộ nhớ của nền tảng phần cứng, giảm thời gian tải và lỗi, đồng thời giúp dự án của bạn tương thích với các thiết bị cũ hơn. Điều này cũng có thể hữu ích nếu bạn muốn cải thiện hiệu năng CPU/GPU bằng cách thực hiện các thay đổi làm tăng mức sử dụng bộ nhớ. Điều này hầu như không liên quan đến hiệu năng khi chạy chương trình.
Có hai cách để phân tích mức sử dụng bộ nhớ trong ứng dụng của bạn trong Unity.
Mô-đun Memory Profiler : Đây là một mô-đun phân tích hiệu năng tích hợp sẵn, cung cấp cho bạn thông tin cơ bản về việc ứng dụng của bạn sử dụng bộ nhớ ở đâu.
Gói Memory Profiler : Đây là một gói Unity mà bạn có thể thêm vào dự án của mình. Nó bổ sung thêm một cửa sổ Memory Profiler vào Unity Editor, cho phép bạn phân tích mức sử dụng bộ nhớ trong ứng dụng của mình chi tiết hơn nữa. Bạn có thể lưu trữ và so sánh các ảnh chụp nhanh để tìm ra các lỗi rò rỉ bộ nhớ, hoặc xem bố cục bộ nhớ để tìm ra các vấn đề phân mảnh bộ nhớ.
Với các công cụ tích hợp sẵn này, bạn có thể theo dõi mức sử dụng bộ nhớ, xác định các khu vực trong ứng dụng có mức sử dụng bộ nhớ cao hơn dự kiến, cũng như tìm và cải thiện tình trạng phân mảnh bộ nhớ.

MỤC TÀI NGUYÊN PHẦN CỨNG HIỂN THỊ DUNG LƯỢNG RAM VÀ VRAM CỦA THIẾT BỊ MÀ ẢNH CHỤP ĐƯỢC THỰC HIỆN.
Hiểu và xác định ngân sách bộ nhớ
Việc hiểu rõ và lập ngân sách cho những hạn chế về bộ nhớ của các thiết bị mục tiêu là rất quan trọng đối với việc phát triển đa nền tảng. Khi thiết kế các cảnh và màn chơi, hãy tuân thủ giới hạn bộ nhớ được thiết lập cho từng thiết bị mục tiêu. Bằng cách thiết lập các giới hạn và hướng dẫn, bạn có thể đảm bảo rằng ứng dụng của mình hoạt động tốt trong phạm vi thông số kỹ thuật phần cứng của từng nền tảng.
Bạn có thể tìm thấy thông số kỹ thuật bộ nhớ thiết bị trong tài liệu dành cho nhà phát triển. Ví dụ, theo tài liệu, máy chơi game Xbox One chỉ có tối đa 5 GB bộ nhớ khả dụng cho các trò chơi chạy ở chế độ nền trước.
Việc thiết lập ngân sách nội dung dựa trên độ phức tạp của lưới và shader, cũng như nén texture, cũng rất hữu ích. Tất cả những yếu tố này đều ảnh hưởng đến dung lượng bộ nhớ được phân bổ. Các số liệu ngân sách này có thể được tham khảo trong suốt chu kỳ phát triển dự án.
Xác định giới hạn RAM vật lý
Mỗi nền tảng mục tiêu đều có giới hạn bộ nhớ, và khi biết được giới hạn đó, bạn có thể thiết lập ngân sách bộ nhớ cho ứng dụng của mình. Sử dụng Memory Profiler để xem ảnh chụp nhanh. Mục Tài nguyên phần cứng (xem hình trên) hiển thị dung lượng Bộ nhớ truy cập ngẫu nhiên vật lý (RAM) và Bộ nhớ truy cập ngẫu nhiên video (VRAM). Con số này không tính đến thực tế là không phải toàn bộ không gian đó đều có thể sử dụng được. Tuy nhiên, nó cung cấp một con số ước lượng hữu ích để bắt đầu làm việc.
Nên đối chiếu thông số kỹ thuật phần cứng của các nền tảng mục tiêu, vì các số liệu hiển thị ở đây có thể không phản ánh đầy đủ thực tế. Bộ công cụ phát triển phần cứng đôi khi có nhiều bộ nhớ hơn, hoặc bạn có thể đang làm việc với phần cứng có kiến trúc bộ nhớ thống nhất.
Xác định thông số kỹ thuật RAM tối thiểu.
Hãy xác định cấu hình phần cứng có thông số RAM thấp nhất cho mỗi nền tảng mà bạn hỗ trợ, và sử dụng thông tin này để định hướng quyết định ngân sách bộ nhớ của bạn. Hãy nhớ rằng không phải tất cả bộ nhớ vật lý đó đều có thể sử dụng được. Ví dụ, một máy chơi game có thể có một trình ảo hóa đang chạy để hỗ trợ các trò chơi cũ hơn, những trò chơi này có thể sử dụng một phần tổng dung lượng bộ nhớ. Hãy nghĩ đến một tỷ lệ phần trăm (ví dụ: 80% tổng số) để sử dụng. Đối với nền tảng di động, bạn cũng có thể cân nhắc chia thành nhiều cấp độ thông số kỹ thuật khác nhau để hỗ trợ chất lượng và tính năng tốt hơn cho những người sử dụng thiết bị cao cấp.
Hãy cân nhắc lập ngân sách riêng cho từng đội đối với các đội lớn hơn.
Sau khi đã xác định được ngân sách bộ nhớ tổng thể, hãy cân nhắc thiết lập ngân sách bộ nhớ cho từng nhóm. Ví dụ, các nghệ sĩ thiết kế môi trường sẽ được cấp một lượng bộ nhớ nhất định cho mỗi cấp độ hoặc cảnh được tải, nhóm âm thanh sẽ được phân bổ bộ nhớ cho nhạc và hiệu ứng âm thanh, v.v.
Điều quan trọng là phải linh hoạt với ngân sách khi dự án tiến triển. Nếu một nhóm hoàn thành dự án với chi phí thấp hơn nhiều so với ngân sách, hãy phân bổ phần tiền dư cho nhóm khác nếu nhóm đó có thể cải thiện được những khía cạnh của trò chơi mà họ đang phát triển.
Sau khi đã quyết định và thiết lập ngân sách bộ nhớ cho các nền tảng mục tiêu, bước tiếp theo là sử dụng các công cụ phân tích hiệu năng để giúp bạn theo dõi và giám sát mức sử dụng bộ nhớ trong trò chơi của mình.

SỬ DỤNG MÔ-ĐUN PHÂN TÍCH BỘ NHỚ ĐỂ NHANH CHÓNG THU THẬP THÔNG TIN LIÊN QUAN ĐẾN VIỆC PHÂN BỔ BỘ NHỚ CỦA TÀI SẢN VÀ ĐỐI TƯỢNG CẢNH.
Hai chế độ xem với mô-đun Memory Profiler
Mô-đun Memory Profiler cung cấp hai chế độ xem: Đơn giản và chi tiết. Sử dụng chế độ xem đơn giản để có cái nhìn tổng quan về mức sử dụng bộ nhớ của ứng dụng. Khi cần thiết, hãy chuyển sang chế độ xem Chi tiết để xem thông tin chi tiết hơn.
Đơn giản
Con số "Tổng bộ nhớ dự trữ" là "Tổng số bộ nhớ được Unity theo dõi". Nó bao gồm cả bộ nhớ mà Unity đã dành riêng nhưng hiện không sử dụng (con số đó là Tổng bộ nhớ đã sử dụng).
Con số "Bộ nhớ hệ thống đã sử dụng" thể hiện dung lượng bộ nhớ mà OS cho là đang được ứng dụng của bạn sử dụng. Nếu chỉ số này hiển thị 0, hãy lưu ý rằng điều này cho thấy bộ đếm Profiler không được triển khai trên nền tảng mà bạn đang phân tích hiệu năng. Trong trường hợp này, chỉ số tốt nhất để dựa vào là Tổng dung lượng bộ nhớ dự trữ. Trong những trường hợp này, bạn cũng nên chuyển sang sử dụng công cụ phân tích hiệu năng nền tảng gốc để có thông tin chi tiết về bộ nhớ.

SỬ DỤNG MẪU ĐÃ THU THẬP ĐỂ KIỂM TRA THÔNG TIN CHI TIẾT NHƯ MỨC SỬ DỤNG BỘ NHỚ CỦA TỆP THỰC THI VÀ DLL.
Xem chi tiết trong Memory Profiler
Để tìm hiểu xem tệp thực thi, các DLL và Máy ảo Mono sử dụng bao nhiêu bộ nhớ, việc chỉ xem số liệu bộ nhớ từng khung hình sẽ không đủ. Hãy sử dụng chức năng chụp ảnh chi tiết để tìm hiểu sâu hơn về sự cố bộ nhớ này.
Ghi chú : Cây tham chiếu trong chế độ xem Chi tiết của mô-đun Memory Profiler chỉ hiển thị các tham chiếu Native. Các tham chiếu từ các đối tượng thuộc các kiểu kế thừa từ UnityEngine.Object có thể hiển thị với tên của các lớp vỏ được quản lý của chúng. Tuy nhiên, chúng có thể chỉ xuất hiện vì chúng có các Đối tượng Gốc (Native Objects) nằm bên dưới. Bạn không nhất thiết phải thấy bất kỳ kiểu dữ liệu được quản lý nào. Ví dụ, hãy xem xét một đối tượng có thuộc tính Texture2Din trong một trong các trường của nó làm tham chiếu. Với cách hiển thị này, bạn cũng sẽ không thấy trường nào chứa tham chiếu đó. Để có được thông tin chi tiết như vậy, hãy sử dụng gói Memory Profiler .
Để xác định một cách tổng quát thời điểm mức sử dụng bộ nhớ bắt đầu gần đạt đến giới hạn ngân sách của nền tảng, hãy sử dụng phép tính sơ bộ sau:
Bộ nhớ hệ thống đã sử dụng (hoặc Tổng bộ nhớ dự trữ nếu Bộ nhớ hệ thống đã sử dụng hiển thị 0) + bộ đệm ước tính của bộ nhớ chưa được theo dõi / Tổng bộ nhớ nền tảng
Khi con số này bắt đầu tiến gần đến 100% dung lượng bộ nhớ của nền tảng, hãy sử dụng gói Memory Profiler để tìm hiểu nguyên nhân.
Nhiều tính năng của mô-đun Memory Profiler đã được thay thế bằng gói Memory Profiler , nhưng bạn vẫn có thể sử dụng mô-đun này để hỗ trợ các nỗ lực phân tích bộ nhớ của mình.
Ví dụ:
- Để xác định vị trí phân bổ GC : Mặc dù những thông tin này xuất hiện trong mô-đun, nhưng việc tìm ra chúng sẽ dễ dàng hơn nếu sử dụng Project Auditor hoặc Deep Profiling.
- Để nhanh chóng xem kích thước đã sử dụng/đã dành riêng của vùng nhớ heap, hãy xem thông tin này.
- Phân tích bộ nhớ Shader
Hãy nhớ lập hồ sơ hiệu năng trên thiết bị có cấu hình thấp nhất trong nền tảng mục tiêu tổng thể của bạn khi thiết lập ngân sách bộ nhớ. Theo dõi sát sao mức sử dụng bộ nhớ, luôn ghi nhớ các giới hạn mục tiêu đã đặt ra.
Thông thường, bạn sẽ muốn sử dụng một hệ thống phát triển mạnh mẽ với nhiều bộ nhớ (không gian để lưu trữ các ảnh chụp nhanh bộ nhớ lớn hoặc tải và lưu các ảnh chụp nhanh đó một cách nhanh chóng là rất quan trọng).
Phân tích hiệu năng bộ nhớ khác hẳn so với phân tích hiệu năng CPU và GPU ở chỗ nó có thể tự phát sinh thêm chi phí bộ nhớ. Bạn có thể cần lập hồ sơ bộ nhớ trên các thiết bị cao cấp hơn (có nhiều bộ nhớ hơn), nhưng đặc biệt lưu ý đến giới hạn ngân sách bộ nhớ cho cấu hình mục tiêu cấp thấp hơn.
Những điểm cần xem xét khi phân tích hiệu năng sử dụng bộ nhớ:
- Các thiết lập như mức chất lượng, cấp độ đồ họa và các biến thể AssetBundle có thể có mức sử dụng bộ nhớ khác nhau trên các thiết bị mạnh hơn. Ví dụ:
- Mức chất lượng và cài đặt đồ họa có thể ảnh hưởng đến kích thước của RenderTextures được sử dụng cho bản đồ đổ bóng.
- Việc điều chỉnh độ phân giải có thể ảnh hưởng đến kích thước của bộ đệm màn hình, RenderTextures và các hiệu ứng xử lý hậu kỳ.
- Cài đặt chất lượng kết cấu có thể ảnh hưởng đến kích thước của tất cả các kết cấu.
- Mức LOD tối đa có thể ảnh hưởng đến Mô hình và nhiều thứ khác.
- Nếu bạn có các biến thể AssetBundle như phiên bản HD (Độ phân giải cao) và SD (Độ phân giải tiêu chuẩn) và chọn phiên bản nào để sử dụng dựa trên thông số kỹ thuật của thiết bị, bạn cũng có thể nhận được kích thước tài nguyên khác nhau tùy thuộc vào thiết bị bạn đang sử dụng để lập hồ sơ.
- Độ phân giải màn hình của thiết bị mục tiêu sẽ ảnh hưởng đến kích thước của RenderTextures được sử dụng cho các hiệu ứng xử lý hậu kỳ.
- API đồ họa được hỗ trợ của thiết bị có thể ảnh hưởng đến kích thước của các shader tùy thuộc vào việc API đó có hỗ trợ hay không các biến thể shader đó.
- Việc sử dụng hệ thống phân cấp với các thiết lập chất lượng khác nhau, thiết lập cấp độ đồ họa và các biến thể gói tài sản là một cách tuyệt vời để nhắm đến nhiều thiết bị hơn, ví dụ: bằng cách tải phiên bản độ phân giải cao của một gói tài sản trên thiết bị di động 4 GB và phiên bản độ phân giải tiêu chuẩn trên thiết bị 2 GB. Tuy nhiên, hãy lưu ý đến sự khác biệt về mức sử dụng bộ nhớ nêu trên và đảm bảo kiểm tra cả hai loại thiết bị, cũng như các thiết bị có độ phân giải màn hình khác nhau hoặc API đồ họa được hỗ trợ khác nhau.
Ghi chú : Trình chỉnh sửa Unity thường luôn tiêu tốn nhiều bộ nhớ hơn do có thêm các đối tượng được tải từ Trình chỉnh sửa và Trình phân tích hiệu năng. Nó thậm chí có thể hiển thị Bộ nhớ Tài sản mà sẽ không được tải vào bộ nhớ trong quá trình xây dựng, chẳng hạn như từ các Gói Tài sản (tùy thuộc vào chế độ mô phỏng Addressables ) hoặc Sprite và Atlas, hoặc đối với các Tài sản được hiển thị trong Trình kiểm tra. Một số chuỗi tham chiếu cũng có thể gây nhầm lẫn hơn trong Trình soạn thảo.

CỬA SỔ CHÍNH CỦA TRÌNH HIỂN THỊ HỒ
Gói Memory Profiler
Công cụ Memory Profiler hiện đang trong giai đoạn xem trước dành cho Unity 2019 LTS trở lên, nhưng dự kiến sẽ được xác nhận trong Unity 2022 LTS.
Một lợi ích tuyệt vời của gói Memory Profiler là, ngoài việc thu thập các đối tượng gốc (giống như mô-đun Memory Profiler ), nó còn cho phép bạn xem Bộ nhớ được quản lý , lưu và so sánh các ảnh chụp nhanh, và khám phá nội dung bộ nhớ chi tiết hơn nữa, với các phân tích trực quan về mức sử dụng bộ nhớ của bạn.
Ảnh chụp nhanh hiển thị sự phân bổ bộ nhớ trong công cụ, cho phép bạn nhanh chóng xác định nguyên nhân gây ra việc sử dụng bộ nhớ quá mức hoặc không cần thiết, theo dõi rò rỉ bộ nhớ hoặc xem sự phân mảnh vùng nhớ heap.
Sau khi cài đặt gói Memory Profiler , hãy mở nó bằng cách nhấp vào Window > Analysis > Memory Profiler .
Thanh menu trên cùng của Memory Profiler cho phép bạn thay đổi mục tiêu chọn trình phát và chụp hoặc nhập ảnh chụp nhanh.
Ghi chú : Phân tích hiệu năng bộ nhớ trên phần cứng mục tiêu bằng cách kết nối Memory Profiler với thiết bị từ xa thông qua menu thả xuống chọn Thiết bị mục tiêu. Việc lập hồ sơ hiệu năng trong Unity Editor sẽ cho ra các số liệu không chính xác do các chi phí phát sinh từ Editor và các công cụ khác.

BẢNG ĐIỀU KHIỂN WORKBENCH ĐƯỢC SỬ DỤNG ĐỂ QUẢN LÝ CÁC ẢNH CHỤP NHANH BỘ NHỚ.
Chế độ xem ảnh chụp đơn và so sánh
Phía bên trái cửa sổ Memory Profiler là khu vực Workbencharea. Sử dụng chức năng này để quản lý, mở hoặc đóng các ảnh chụp bộ nhớ đã lưu. Bạn cũng có thể sử dụng khu vực này để chuyển đổi giữa chế độ xem Ảnh chụp đơn và So sánh.
Tương tự như Profile Analyzer, Memory Profiler cho phép bạn tải hai tập dữ liệu (ảnh chụp nhanh bộ nhớ) để so sánh chúng. Điều này đặc biệt hữu ích khi xem xét mức sử dụng bộ nhớ tăng lên như thế nào theo thời gian hoặc giữa các cảnh và khi tìm kiếm các lỗi rò rỉ bộ nhớ.
Memory Profiler có một số tab trong cửa sổ chính cho phép bạn xem chi tiết các ảnh chụp nhanh bộ nhớ, bao gồm Tóm tắt, Đối tượng và Phân bổ, và Phân mảnh. Chúng ta hãy cùng xem xét chi tiết từng lựa chọn này.

CHẾ ĐỘ XEM TÓM TẮT HIỂN THỊ TỔNG QUAN VỀ BỘ NHỚ TẠI THỜI ĐIỂM ẢNH CHỤP ĐƯỢC.
Chế độ xem Tóm tắt
Chọn chế độ xem này khi bạn muốn có cái nhìn tổng quan nhanh chóng về mức sử dụng bộ nhớ của dự án. Nó cũng chứa các số liệu hữu ích và quan trọng liên quan đến bộ nhớ của ảnh chụp bộ nhớ được đề cập. Nó rất phù hợp để nhanh chóng xem lại những gì đang diễn ra tại thời điểm chụp ảnh.

CHẾ ĐỘ XEM TÓM TẮT CŨNG HIỂN THỊ SƠ ĐỒ CÂY VỀ MỨC SỬ DỤNG BỘ NHỚ TẠI THỜI ĐIỂM CHỤP ẢNH.
Sơ đồ cây đồ họa
Chế độ xem Tree Map hiển thị sự phân bổ bộ nhớ được sử dụng bởi các Đối tượng dưới dạng bản đồ cây đồ họa , cho phép bạn xem chi tiết để tìm ra loại Đối tượng tiêu tốn nhiều bộ nhớ nhất.

Sơ đồ cây: Bảng đã lọc
Bên dưới chế độ xem Bản đồ cây là một bảng được lọc, tự động cập nhật để hiển thị danh sách các đối tượng trong các ô lưới đã chọn.
Sơ đồ cây (Tree Map) hiển thị bộ nhớ được phân bổ cho các đối tượng, bao gồm cả đối tượng gốc (Native) và đối tượng được quản lý (Managed). Bộ nhớ của các đối tượng được quản lý thường nhỏ hơn nhiều so với bộ nhớ của các đối tượng gốc, khiến việc nhận diện chúng trên bản đồ trở nên khó khăn hơn. Bạn có thể phóng to sơ đồ cây để xem chi tiết hơn, nhưng để kiểm tra các đối tượng nhỏ hơn, bảng thường cung cấp cái nhìn tổng quan tốt hơn. Nhấp chuột vào các ô trong sơ đồ cây sẽ bộ lọc bảng bên dưới theo loại phần và/hoặc chọn đối tượng cụ thể cần quan tâm trong bảng.
Bạn có thể tìm ra những mục nào tham chiếu đến các đối tượng trong danh sách này và có thể cả các trường lớp được quản lý mà các tham chiếu đó nằm trong bằng cách chọn hàng trong bảng hoặc ô lưới Tree Map đại diện cho nó, sau đó kiểm tra mục Tham chiếu trong bảng Chi tiết ở bên cạnh. Nếu cửa sổ phụ bị ẩn, bạn có thể hiển thị nó thông qua nút chuyển đổi ở góc trên bên phải thanh công cụ của cửa sổ.
Ghi chú : Sơ đồ cây chỉ hiển thị các đối tượng trong bộ nhớ. Đây không phải là sự thể hiện đầy đủ về bộ nhớ được theo dõi. Điều này rất quan trọng cần hiểu nếu bạn nhận thấy rằng các con số trong Tổng quan về sử dụng bộ nhớ không trùng khớp với tổng bộ nhớ được theo dõi.
Điều này là do không phải tất cả bộ nhớ gốc đều được liên kết với các Đối tượng. Nó cũng có thể bao gồm các phân bổ bộ nhớ gốc không liên kết với đối tượng, chẳng hạn như các tệp thực thi và DLL, NativeArray, v.v. Ngay cả những khái niệm trừu tượng hơn như "Không gian bộ nhớ được dành riêng nhưng chưa được sử dụng" cũng có thể ảnh hưởng đến tổng số Phân bổ bộ nhớ gốc.

BẢNG ĐỐI TƯỢNG VÀ PHÂN BỔ CÓ THỂ ĐƯỢC LỌC Ở NHIỀU CẤP ĐỘ, CHO PHÉP BẠN XEM CHI TIẾT MỨC ĐỘ SỬ DỤNG BỘ NHỚ TRONG ẢNH CHỤP NHANH ĐÃ ĐƯỢC GHI LẠI.
Đối tượng và phân bổ
Chế độ xem Đối tượng và Phân bổ hiển thị một bảng có thể được chuyển đổi để bộ lọc dựa trên các lựa chọn có sẵn, chẳng hạn như Tất cả Đối tượng, Tất cả Đối tượng gốc, Tất cả Đối tượng được quản lý, Tất cả Phân bổ gốc, v.v.
Bạn có thể chuyển đổi bảng phía dưới để hiển thị các Đối tượng, Phân bổ hoặc Vùng nhớ trong phạm vi đã chọn. Như đã lưu ý đối với chế độ xem Bản đồ cây, không phải tất cả bộ nhớ đều được liên kết với các Đối tượng, vì vậy các trang Tất cả vùng bộ nhớ và Tất cả phân bổ gốc có thể cung cấp một bức tranh đầy đủ hơn về việc sử dụng bộ nhớ của bạn, trong đó Vùng bộ nhớ cũng bao gồm cả bộ nhớ được dành riêng nhưng hiện không được sử dụng.
Hãy tận dụng điều này khi tối ưu hóa việc sử dụng bộ nhớ và hướng đến việc đóng gói bộ nhớ hiệu quả hơn cho các nền tảng phần cứng có ngân sách bộ nhớ hạn chế.
Các kỹ thuật và quy trình phân tích bộ nhớ
Tải ảnh chụp nhanh Memory Profiler và xem qua chế độ xem Tree Map để kiểm tra các danh mục, được sắp xếp từ lớn nhất đến nhỏ nhất theo kích thước dung lượng bộ nhớ sử dụng.
Các tài nguyên dự án thường là những thành phần tiêu tốn nhiều bộ nhớ nhất. Sử dụng chế độ xem Bảng, hãy định vị các đối tượng Texture, Meshes, AudioClips, RenderTextures, Shaders và các bộ đệm được cấp phát trước. Đây đều là những ứng cử viên sáng giá cho việc tối ưu hóa bộ nhớ.
Xác định vị trí rò rỉ bộ nhớ
Lỗi rò rỉ bộ nhớ thường xảy ra khi:
- Một đối tượng không được giải phóng thủ công khỏi bộ nhớ thông qua mã lệnh.
- Một đối tượng vẫn còn trong bộ nhớ do một tham chiếu không chủ ý.
Chế độ So sánh của Trình Memory Profiler có thể giúp tìm ra các lỗi rò rỉ bộ nhớ bằng cách so sánh hai ảnh chụp nhanh trong một khoảng thời gian cụ thể.
Một lỗi rò rỉ bộ nhớ thường gặp trong các trò chơi Unity có thể xảy ra sau khi giải phóng một cảnh.
Gói phần mềm Memory Profiler có quy trình làm việc hướng dẫn bạn phát hiện các loại rò rỉ bộ nhớ này bằng chế độ So sánh.
Xác định vị trí các vùng nhớ được cấp phát lặp lại trong suốt vòng đời ứng dụng.
Thông qua việc so sánh khác biệt giữa nhiều ảnh chụp bộ nhớ , bạn có thể xác định nguồn gốc của việc cấp phát bộ nhớ liên tục trong suốt vòng đời của ứng dụng.
Các phần sau đây liệt kê một số mẹo giúp xác định các vùng nhớ heap được quản lý trong dự án của bạn.

BẤT KỲ SỰ TĂNG ĐỘT BIẾN NÀO ĐƯỢC QUAN SÁT THẤY ĐỐI VỚI GC ĐƯỢC PHÂN BỔ TRONG KHUNG ĐỀU CUNG CẤP CHO BẠN MANH MỐI ĐỂ ĐIỀU TRA VỀ VIỆC PHÂN BỔ ĐƯỢC QUẢN LÝ.
Xác định vị trí cấp phát bộ nhớ
Mô-đun Memory Profiler trong Unity Profiler hiển thị các phân bổ bộ nhớ được quản lý trên mỗi khung hình bằng một đường màu đỏ. Giá trị này thường bằng 0, vì vậy bất kỳ sự tăng đột biến nào trên đường biểu diễn giá trị này đều cho thấy bạn nên kiểm tra các khung hình liên quan đến việc phân bổ bộ nhớ được quản lý.

CÁC KHOẢN PHÂN BỔ ĐƯỢC QUẢN LÝ SẼ HIỂN THỊ DƯỚI DẠNG CÁC DẤU MÀU HỒNG TRONG CHẾ ĐỘ XEM DÒNG THỜI GIAN.
Chế độ xem Timeline trong mô-đun Hồ sơ sử dụng CPU
Chế độ xem Timeline trong mô-đun Hồ sơ sử dụng CPU hiển thị các phân bổ, bao gồm cả các phân bổ được quản lý, bằng màu hồng, giúp dễ dàng quan sát và tập trung vào chúng.

VIỆC KÍCH HOẠT NGĂN XẾP CUỘC GỌI PHÂN BỔ TRONG TRÌNH PHÂN TÍCH HIỆU NĂNG SẼ CHO PHÉP BẠN THEO DÕI NGĂN XẾP CUỘC GỌI TRỞ LẠI NGUỒN GỐC ĐỐI VỚI CÁC PHÂN BỔ ĐƯỢC QUẢN LÝ.
Ngăn xếp cuộc gọi phân bổ
Ngăn xếp lệnh gọi cấp phát cung cấp một cách nhanh chóng để phát hiện các cấp phát bộ nhớ được quản lý trong mã của bạn. Những công cụ này sẽ cung cấp thông tin chi tiết về ngăn xếp cuộc gọi mà bạn cần với mức tiêu hao tài nguyên thấp hơn so với việc phân tích chuyên sâu thông thường, và chúng có thể được kích hoạt nhanh chóng bằng Profiler tiêu chuẩn.
Theo mặc định, ngăn xếp lệnh gọi phân bổ bị vô hiệu hóa trong Profiler. Để kích hoạt chúng, hãy nhấp vào nút Call Stacks trên thanh công cụ chính của cửa sổ Profiler. Thay đổi chế độ xem Chi tiết thành Dữ liệu liên quan.
Ghi chú : Nếu bạn đang sử dụng phiên bản Unity cũ hơn (trước khi có hỗ trợ ngăn xếp cuộc gọi Allocation), thì việc phân tích chi tiết (deep profiling ) là một cách tốt để có được toàn bộ ngăn xếp cuộc gọi, giúp tìm ra các cấp phát bộ nhớ được quản lý.
Các mẫu GC.Alloc được chọn trong Hierarchy hoặc Raw Hierarchy giờ đây sẽ chứa ngăn xếp lệnh gọi của chúng. Bạn cũng có thể xem ngăn xếp cuộc gọi của các mẫu GC trong chú thích lựa chọn trong Timeline.

VIỆC SỬ DỤNG CHẾ ĐỘ XEM PHÂN CẤP TRONG MÔ-ĐUN PHÂN TÍCH MỨC SỬ DỤNG CPU LÀ MỘT CÁCH TUYỆT VỜI ĐỂ LỌC VÀ TẬP TRUNG VÀO CÁC PHÂN BỔ ĐƯỢC QUẢN LÝ.
Chế độ xem Phân cấp trong Trình phân tích mức sử dụng CPU
Chế độ xem Phân cấp trong Trình phân tích mức sử dụng CPU cho phép bạn nhấp vào tiêu đề cột để sử dụng chúng làm tiêu chí sắp xếp. Sắp xếp theo GC Alloc là một cách tuyệt vời để tập trung vào những mục đó.
Project Auditor
Project Auditor là một công cụ phân tích tĩnh thử nghiệm. Nó thực hiện rất nhiều việc hữu ích, một số việc nằm ngoài phạm vi hướng dẫn này, nhưng nó có thể tạo ra một danh sách mọi dòng mã trong một dự án gây ra việc cấp phát bộ nhớ được quản lý, mà không cần phải chạy dự án. Đây là một cách rất hiệu quả để tìm kiếm và điều tra những vấn đề kiểu này.
Tối ưu hóa bộ nhớ và GC
Unity sử dụng bộ thu gom rác Boehm-Demers-Weiser , bộ thu gom này sẽ dừng việc thực thi mã chương trình của bạn và chỉ tiếp tục thực thi bình thường sau khi hoàn thành công việc của nó.
Hãy lưu ý đến việc cấp phát bộ nhớ heap không cần thiết vì nó có thể gây ra hiện tượng tăng đột biến trong quá trình thu GC) .
- Chuỗi ký tự: Trong C#, chuỗi là kiểu tham chiếu, không phải kiểu giá trị. Điều này có nghĩa là mọi chuỗi ký tự mới sẽ được cấp phát trên vùng nhớ heap được quản lý, ngay cả khi nó chỉ được sử dụng tạm thời. Giảm thiểu việc tạo hoặc thao tác chuỗi không cần thiết. Tránh phân tích cú pháp các tệp dữ liệu dựa trên chuỗi như JSON và XML, thay vào đó hãy lưu trữ dữ liệu trong ScriptableObjects hoặc các định dạng như MessagePack hoặc Protobuf. Hãy sử dụng lớp StringBuilder nếu bạn cần tạo chuỗi trong quá trình thực thi chương trình.
- Các lệnh gọi hàm Unity : Một số hàm API Unity tạo các vùng nhớ heap, đặc biệt là những hàm trả về một mảng các đối tượng được quản lý. Lưu trữ các tham chiếu đến mảng thay vì cấp phát chúng ở giữa vòng lặp. Ngoài ra, hãy tận dụng một số chức năng giúp tránh tạo ra rác thải. Ví dụ, hãy sử dụng GameObject.CompareTag thay vì so sánh thủ công một chuỗi với GameObject.tag (vì việc trả về một chuỗi mới sẽ tạo ra rác).
- Boxing: Tránh truyền biến kiểu giá trị thay cho biến kiểu tham chiếu. Thao tác này tạo ra một đối tượng tạm thời, và rác tiềm ẩn đi kèm với nó sẽ tự động chuyển đổi kiểu giá trị thành kiểu đối tượng (ví dụ: int i = 123; object o = i ). Thay vào đó, hãy cố gắng cung cấp các phương thức ghi đè cụ thể với kiểu giá trị mà bạn muốn truyền vào. Các kiểu dữ liệu chung (Generics) cũng có thể được sử dụng cho các phương thức ghi đè này.
- Coroutines: Mặc dù phương thức `yield` không tạo ra rác, nhưng việc tạo một đối tượng `WaitForSeconds` mới thì có. Hãy lưu trữ và sử dụng lại đối tượng WaitForSeconds thay vì tạo nó trong dòng yield hoặc sử dụng yield return null.
- LINQ và Biểu thức chính quy: Cả hai đều tạo ra rác thải từ những hoạt động ngầm trong giới quyền anh. Nên tránh sử dụng LINQ và Biểu thức chính quy nếu hiệu năng là vấn đề cần quan tâm. Hãy viết vòng lặp for và sử dụng danh sách thay vì tạo mảng mới.
- Collections chung và các loại được quản lý khác: Không nên khai báo và điền dữ liệu vào một List hoặc collection trong mỗi khung hình trong hàm Update (ví dụ: danh sách kẻ thù trong một bán kính nhất định xung quanh người chơi). Thay vào đó, hãy biến List thành một thành viên của MonoBehaviour và khởi chạy nó trong phương thức Start. Chỉ cần xóa toàn bộ bộ sưu tập bằng cách sử dụng chức năng "Xóa mọi khung hình" trước khi sử dụng.
Lên lịch thu gom rác bất cứ khi nào có thể.
Nếu bạn chắc chắn rằng việc tạm dừng thu gom rác sẽ không ảnh hưởng đến một thời điểm cụ thể nào trong trò chơi của mình, bạn có thể kích hoạt quá trình thu gom rác bằng GC .
Xem phần "Hiểu về Quản lý Bộ nhớ Tự động" để biết các ví dụ về cách sử dụng tính năng này một cách hiệu quả.
Sử dụng Trình thu gom rác tăng dần để chia nhỏ khối lượng công việc GC.
Thay vì tạo ra một sự gián đoạn dài duy nhất trong quá trình thực thi chương trình, cơ chế thu gom rác tăng dần sử dụng nhiều sự gián đoạn ngắn hơn để phân bổ khối lượng công việc trên nhiều khung hình. Nếu quá trình thu gom rác gây ra hiện tượng tốc độ khung hình không ổn định, hãy thử tùy chọn này để xem liệu nó có thể giảm thiểu vấn đề tăng đột biến tốc độ GC do quá trình thu gom rác gây ra hay không. Hãy sử dụng Công Profile Analyzer để xác minh lợi ích của nó đối với ứng dụng của bạn.
Lưu ý rằng việc sử dụng GC ở chế độ Tăng dần sẽ thêm các rào cản đọc-ghi vào một số lệnh gọi C#, điều này dẫn đến một số chi phí phát sinh có thể lên tới khoảng ~1 ms mỗi khung hình của lệnh gọi kịch bản. Để đạt hiệu suất tối ưu, lý tưởng nhất là không nên có các lệnh GC Alloc trong các vòng lặp chính của trò chơi để không cần đến Incremental GC nhằm duy trì tốc độ khung hình mượt mà và có thể ẩn lệnh GC.Collect ở những nơi người dùng không nhận thấy, ví dụ như khi mở menu hoặc tải cấp độ mới.
Để tìm hiểu thêm về Memory Profiler, hãy tham khảo các nguồn tài liệu sau:
Bạn muốn tìm hiểu thêm?
Tải xuống sách điện tử " Hướng dẫn tối ưu về phân tích hiệu năng game Unity" miễn phí để nhận được tất cả các mẹo và phương pháp hay nhất.
