
Phân tích và đánh giá mức sử dụng bộ nhớ bằng các công cụ phân tích bộ nhớ của Unity.
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: Gói Memory Profiler và mô-đun Memory Profiler .
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à tối ưu hóa hiệu năng trò chơi trên 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.
-
Thông tin ở đây được trích dẫn từ... Hướng dẫn toàn diện về phân tích hiệu năng game Unity (phiên bản Unity 6), một cuốn sách điện tử được biên soạn bởi các chuyên gia Unity cả bên ngoài và nội bộ về phát triển game, phân tích hiệu năng và tối ưu hóa.
Phân tích hiệu năng bộ nhớ là gì?
Phân tích hiệu năng bộ nhớ phần lớn không liên quan đến hiệu năng khi chạy chương trình, nhưng rất hữu ích để kiểm tra các giới hạn bộ nhớ của nền tảng phần cứng hoặc khi trò chơi của bạn bị lỗi. Đ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ớ.
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 Profiler tích hợp sẵn, cung cấp cho bạn thông tin cơ bản về nơi ứng dụng của bạn sử dụng bộ nhớ trong trình phân tích hiệu năng thông thường.
- Memory Profiler : Đây là một công cụ chuyên dụng có sẵn dưới dạng 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ớ. Chúng ta sẽ đề cập chi tiết hơn về vấn đề này ở phần sau của hướng dẫn này, và ở đây chúng ta sẽ tập trung vào những điểm chung mà bạn cần lưu ý.
Cả hai công cụ này đều cho phép bạn 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ớ.

Gói Memory Profiler là một công cụ bạn có thể sử dụng để kiểm tra mức sử dụng bộ nhớ của ứng dụng Unity và Unity Editor.
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, bạn cần 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 .
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ý
Vì mỗi nền tảng đều có giới hạn bộ nhớ riêng, ứng dụng của bạn sẽ cần phân bổ bộ nhớ cho từng thiết bị mục tiêu. Sử dụng Memory Profiler để xem ảnh chụp nhanh về mức sử dụng bộ nhớ của bạn. Ảnh chụp nhanh Tài nguyên phần cứng (xem hình bên dưới) 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.

Ảnh chụp nhanh Tài nguyên phần cứng hiển thị các thông số RAM và VRAM của thiết bị tại thời điểm chụp ảnh.
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 cân nhắc một tỷ lệ phần trăm (ví dụ: 80% tổng số) để sử dụng cho toàn đội, tùy thuộc vào tình huống cụ thể của bạn. Đố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. Mặc dù điều này có vẻ cứng nhắc, hãy coi đó như những hướng dẫn để định hướng các quyết định sáng tạo so với chi phí nguồn lực.
Đ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 ngân sách thấp hơn dự kiến, 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, cho phép bạn đưa ra quyết định sáng suốt và thực hiện các hành động cần thiết.
Một vài mẹo để phân tích hiệu năng bộ nhớ.
Để xác định một cách tổng quát khi nào 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.
Trong Unity 6, 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
- Phân tích bộ nhớ Shader
- Sử dụng chế độ xem Chi tiết trong mô-đun Memory Profiler để xem chi tiết các nhánh bộ nhớ cao nhất nhằm tìm ra thành phần nào đang sử dụng nhiều bộ nhớ nhất.
Dưới đây là một số tài liệu tham khảo khác giúp bạn khám phá thêm các trường hợp sử dụng và tính năng của Unity Profiler:
- Tổng quan về Profiler trong tài liệu hướng dẫn Unity .
- Giới thiệu về việc lập hồ sơ hiệu năng trong Unity
- Cách lập hồ sơ và tối ưu hóa trò chơi
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ớ là một vấn đề khác so với phân tích hiệu năng CPU và GPU vì nó có thể 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.
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ì vậy, để tận dụng tối đa việc phân tích hiệu năng bộ nhớ, dưới đây là một số chi tiết cần lưu ý:
- Chất lượng và cài đặt đồ họa có thể ảnh hưởng đến kích thước của các họa tiết kết xuất đượ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 bộ đệm màn hình, kết cấu hiển thị và các hiệu ứng xử lý hậu kỳ.
- Các thiết lập về 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.
- Giới hạn LOD tối đa có thể ảnh hưởng đến mô hình và nhiều yếu tố 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à bạn 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ị mục tiêu, bạn 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 để phân tích hiệu năng.
- Độ 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 các họa tiết đượ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 shader tùy thuộc vào các biến thể shader mà thiết bị đó hỗ trợ (hoặc không hỗ trợ).
- Hệ thống phân cấp sử dụng các thiết lập chất lượng và đồ họa khác nhau, cũng như các biến thể AssetBundle, là một cách tuyệt vời để nhắm đến nhiều loại thiết bị hơn.
Ví dụ, bạn có thể tải phiên bản HD của AssetBundle lên thiết bị di động 4GB và phiên bản SD lên thiết bị 2GB. 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. Ngoài ra, dung lượng bộ nhớ dành cho texture cũng cao hơn vì tất cả chúng đều bắt buộc phải được bật chế độ đọc/ghi trong Editor.

Mô-đun Memory Profiler cho phép bạn dễ dàng xem lượng bộ nhớ đã được cấp phát cho hệ thống.
Gói Memory Profiler
Gói Memory Profiler có thể giúp bạn hiểu và tối ưu hóa việc sử dụng bộ nhớ của dự án. Nó cho phép bạn chụp "ảnh chụp nhanh" bộ nhớ của ứng dụng tại những thời điểm cụ thể, cả trong Unity Editor và khi chạy các bản dựng Player trên thiết bị mục tiêu của bạn.
Các ảnh chụp nhanh cung cấp phân tích toàn diện về cách bộ nhớ đang được sử dụng, hiển thị sự phân bổ bộ nhớ trong toàn bộ hệ thống. Điều này giúp bạn xác định các nguồ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 các lỗi rò rỉ bộ nhớ và kiểm tra các vấn đề như phân mảnh vùng nhớ heap.
Sau khi cài đặt gói Memory Profiler , hãy mở nó thông qua 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. Menu thả xuống Chọn mục tiêu ở góc trên bên trái cho phép bạn lập hồ sơ bộ nhớ trực tiếp 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. Lưu ý rằng 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.

Thay đổi lựa chọn người chơi và chụp hoặc nhập ảnh chụp nhanh bộ nhớ.
Thành phần ảnh chụp nhanh
Ở phía bên trái của cửa sổ Memory Profiler là thành phần Snapshots . 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. Thành phần Snapshot cung cấp hai chế độ xem: Ảnh chụp đơn lẻ và Ảnh chụp so sánh.
Tương tự như Profile Analyzer, Memory Profiler cho phép bạn tải và so sánh hai ảnh chụp nhanh bộ nhớ cạnh nhau. Sử dụng phép so sánh này để theo dõi sự tăng trưởng bộ nhớ theo thời gian, phân tích mức sử dụng giữa các cảnh hoặc xác định các khả năng 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ớ, các tab chính là Summary , Unity Objects và All of Memory . Chúng ta hãy cùng xem xét chi tiết từng lựa chọn này.

Bạn có thể quản lý nhiều ảnh chụp nhanh bộ nhớ.
Tab Tóm tắt
Tab Tóm tắt cung cấp cho bạn cái nhìn tổng quan về mức sử dụng bộ nhớ của dự án tại thời điểm thu thập dữ liệu bộ nhớ. Nó rất phù hợp khi bạn muốn có cái nhìn tổng quan nhanh chóng và đầy đủ thông tin mà không cần đi sâu vào phân tích chi tiết.
Chế độ xem này làm nổi bật các chỉ số quan trọng và có thể giúp bạn nhanh chóng phát hiện các sự cố về bộ nhớ hoặc các kiểu sử dụng bất thường. Nó đặc biệt hữu ích khi so sánh các ảnh chụp nhanh hoặc gỡ lỗi mức sử dụng bộ nhớ theo thời gian. Chúng ta hãy cùng xem xét một vài phần quan trọng của nó.
Mẹo: Ở khung bên phải (xem hình bên dưới), bạn sẽ tìm thấy thông tin ngữ cảnh hữu ích về ảnh chụp của mình. Những thông tin này có thể giúp bạn phát hiện các vấn đề tiềm ẩn hoặc hướng dẫn bạn trong việc giải thích kết quả.
Mức sử dụng bộ nhớ trên thiết bị: Điều này cho thấy dung lượng bộ nhớ vật lý mà ứng dụng chiếm dụng. Nó bao gồm tất cả các vùng nhớ được cấp phát, Unity và không phải của Unity, đang nằm trong bộ nhớ tại thời điểm chụp ảnh.
Phân bổ bộ nhớ: Hình ảnh này minh họa cách phân bổ bộ nhớ giữa các loại bộ nhớ khác nhau.
Lưu ý thanh bộ nhớ chưa được theo dõi* . Điều này tương ứng với bộ nhớ mà Unity không theo dõi thông qua hệ thống quản lý bộ nhớ của nó. Việc phân bổ này có thể đến từ các plugin và trình điều khiển gốc. Sử dụng công cụ phân tích hiệu năng dành riêng cho nền tảng để phân tích mức sử dụng bộ nhớ chưa được theo dõi của thiết bị mục tiêu.
Quản lý mức sử dụng bộ nhớ Heap: Trong chế độ xem này, bạn sẽ thấy chi tiết về bộ nhớ mà máy ảo kịch bản của Unity quản lý, bao gồm bộ nhớ heap được quản lý dùng cho các đối tượng được quản lý, không gian heap trống có thể đã được các đối tượng sử dụng trước đó hoặc được dành riêng trong lần mở rộng heap gần nhất, và bộ nhớ được sử dụng bởi chính máy ảo.
Các danh mục đối tượng Unity hàng đầu: Điều này hiển thị loại đối tượng Unity nào sử dụng nhiều bộ nhớ nhất trong ảnh chụp nhanh (ví dụ: Texture2D, mesh, GameObject).

Tab Tóm tắt hiển thị tổng quan về bộ nhớ tại thời điểm chụp ảnh nhanh.
Tab Đối tượng
Tab Đối tượng Unity hiển thị bất kỳ đối tượng Unity nào đã cấp phát bộ nhớ, lượng bộ nhớ gốc và bộ nhớ được quản lý mà đối tượng đó sử dụng, và tổng số bộ nhớ đã cấp phát. Hãy sử dụng thông tin này để xác định các khu vực bạn có thể loại bỏ các mục nhập bộ nhớ trùng lặp hoặc để tìm ra đối tượng nào sử dụng nhiều bộ nhớ nhất. Và thông qua thanh tìm kiếm, bạn có thể tìm thấy các mục trong bảng chứa văn bản bạn nhập.
Theo mặc định, bảng này liệt kê tất cả các đối tượng liên quan theo Kích thước được phân bổ theo thứ tự giảm dần. Bạn có thể nhấp vào tên tiêu đề cột để sắp xếp bảng theo cột đó hoặc để thay đổi thứ tự sắp xếp tăng dần hoặc giảm dần của cột.
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ế.

Tab Đối tượng Unity cho phép bạn xem chi tiết mức sử dụng bộ nhớ của ảnh chụp nhanh với độ chính xác cao.
Các kỹ thuật và quy trình phân tích bộ nhớ
Hãy bắt đầu bằng cách phân tích ảnh chụp nhanh Memory Profiler để xác định các khu vực sử dụng bộ nhớ cao. Sau khi chụp hoặc tải ảnh chụp nhanh Memory Profiler , hãy sử dụng tab Unity Objects để 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ế độ Bảng , bạn có thể định vị các họa tiết, lưới, đoạn âm thanh, họa tiết kết xuất, biến thể shader và bộ đệm được phân bổ trước. Đây thường là những ứng cử viên tốt để bắt đầu khi tối ưu hóa việc sử dụng bộ nhớ. Công Project Auditor là một công cụ bổ trợ tuyệt vời ở đây vì nó có thể đưa ra một số khuyến nghị về cách giảm mức sử dụng bộ nhớ cho các tài sản (đảm bảo tài nguyên được thiết lập đúng cách trong Trình kiểm tra Cài đặt Nhập khẩu là một điểm khởi đầu tốt).
Xác định vị trí rò rỉ bộ nhớ
Rò rỉ bộ nhớ là tình trạng các tài sản, đối tượng hoặc tài nguyên không được sử dụng không được giải phóng đúng cách khỏi bộ nhớ. Điều này có thể dẫn đến việc sử dụng bộ nhớ ngày càng tăng và gây ra các vấn đề về hiệu năng hoặc thậm chí là treo máy.
Lỗi rò rỉ bộ nhớ thường xảy ra khi:
- Đố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ô tình vẫn còn trong bộ nhớ vì một đối tượng khác vẫn đang giữ tham chiếu đến nó.
Công Memory Profiler có chế độ So sánh ảnh chụp nhanh , 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ể. Phép so sánh này có thể giúp phát hiện các đối tượng vẫn còn lưu giữ trong bộ nhớ trong khi đáng lẽ chúng phải được giải phóng.
Một tình huống thường gặp gây rò rỉ bộ nhớ trong các trò chơi Unity là sau khi giải phóng một cảnh (scene). Các đối tượng từ cảnh đã được gỡ bỏ có thể không được thu gom rác đúng cách nếu vẫn còn tham chiếu đến chúng.
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 cung cấp một số mẹo giúp bạn xác định các vùng nhớ heap được quản lý trong dự án của mình.

So sánh hai bức ảnh để thấy sự khác biệt.
Phân bổ bộ nhớ được quản lý như hiển thị trong mô-đun Memory Profiler .
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ý.

Bất kỳ sự tăng đột biến nào được quan sát thấy ở GC Allocated In Frame đều cung cấp cho bạn manh mối để điều tra về các phân bổ được quản lý.
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 tập trung vào chúng.

Các phân bổ được quản lý sẽ hiển thị dưới dạng các điểm đánh dấu màu hồng trong chế độ xem Timeline .
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 phân bổ), thì việc phân tích chi tiết 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 phân bổ đượ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 bật hiển thị ngăn xếp cuộc gọi phân bổ trong Profiler sẽ cho phép bạn theo dõi ngăn xếp cuộc gọi ngược về nguồn gốc đối với 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 đó.

Sử dụng chế độ xem Phân cấp trong mô-đun Hồ sơ sử dụng CPU là một cách tuyệt vời để bộ lọc và tập trung vào các phân bổ được quản lý.
Project Auditor
Công cụ Project Auditor , được giới thiệu như một gói trong Unity 6.1, là một công cụ phân tích mạnh mẽ dành cho các dự án Unity , được thiết kế để giúp các nhà phát triển tối ưu hóa hiệu suất, duy trì các thực tiễn tốt nhất và xác định các vấn đề tiềm ẩn cũng như các điểm nghẽn trong dự án của họ.
Project Auditor sẽ quét toàn bộ dự án của bạn và cung cấp các báo cáo chi tiết về những điểm không hiệu quả, chẳng hạn như các lệnh gọi tập lệnh quá nhiều, tài sản không được sử dụng, số lượng thực thể quá mức, v.v.
Project Auditor bao gồm nhiều lĩnh vực khác nhau:
Tối ưu hóa hiệu năng: Nó xác định các vấn đề có thể ảnh hưởng đến hiệu suất hoạt động của dự án, chẳng hạn như tạo ra quá nhiều bộ nhớ rác, phân bổ đối tượng không cần thiết hoặc các lệnh gọi hàm tốn kém.
Rà soát mã nguồn và tài nguyên : Nó giúp làm nổi bật các tài nguyên không được sử dụng, các mẫu mã lập trình kém hiệu quả hoặc các API lỗi thời có thể được tái cấu trúc. Điều này giúp giảm kích thước bản dựng, cải thiện khả năng bảo trì tổng thể của dự án và tối ưu hóa việc sử dụng bộ nhớ.
Chẩn đoán và các phương pháp tốt nhất : Nó đưa ra các đề xuất dựa trên các thực tiễn tốt nhất Unity và làm nổi bật các lỗi hoặc cảnh báo liên quan đến thiết lập dự án của bạn, chẳng hạn như thiếu tham chiếu hoặc cài đặt Trình phát hoặc Chất lượng không tối ưu.
Báo cáo có thể tùy chỉnh : Nó sắp xếp các kết quả thành các danh mục, giúp dễ dàng ưu tiên các hoạt động tối ưu hóa. Bạn cũng có thể tạo các quy tắc tùy chỉnh để điều chỉnh phân tích cho phù hợp với dự án hoặc nhu cầu cụ thể của mình.
💡Tips:
- Chạy công Project Auditor ở các giai đoạn phát triển quan trọng (ví dụ: trước khi đạt mốc quan trọng, phát hành bản beta, bản dựng cuối cùng). Việc kiểm tra định kỳ giúp phát hiện sớm các điểm nghẽn hiệu năng, tài nguyên không được sử dụng hoặc mã nguồn lỗi thời, ngăn ngừa các vấn đề trở nên nghiêm trọng hơn khi dự án mở rộng quy mô.
- Bạn có thể tự động chạy Project Auditor như một phần của thiết lập CI hoặc xây dựng (như được trình bày trong hướng dẫn này ) và sử dụng các báo cáo để đảm bảo không ai đưa vào bất kỳ tài sản hoặc mã nào gây ra lỗi mới (sử dụng API được mô tả chi tiết ở đây ).
- Bạn có thể thêm các quy tắc riêng nếu có những điều cụ thể bạn muốn đảm bảo trò chơi của mình bao quát được; ví dụ: cài đặt kết cấu, kích thước hoặc các quy tắc phức tạp hơn. Xem trang này trong sách hướng dẫn để biết thêm chi tiết về cách thực hiện việc này.
Các báo cáo do Project Auditor lập được phân loại theo mức độ nghiêm trọng (Nghiêm trọng, Trung bình và Thông tin). Hãy tập trung giải quyết các vấn đề nghiêm trọng nhất trước tiên, vì chúng thường làm nổi bật các vấn đề ảnh hưởng đến hiệu năng, chẳng hạn như phân bổ bộ nhớ quá mức hoặc thu gom rác quá nhiều. Chúng cũng thường nằm trong các đường dẫn mã được gọi thường xuyên hơn, chẳng hạn như hàm Update, nơi mà bất kỳ vấn đề hiệu năng nào chúng gây ra sẽ dễ nhận thấy hơn đối với người chơi.
Công Project Auditor cũng kiểm tra các thiết lập như thiết lập trình phát và thiết lập chất lượng , đồng thời đưa ra các khuyến nghị về những gì bạn có thể cần thay đổi. Sử dụng tùy chọn này để đảm bảo các mục tiêu biên dịch, độ phân giải, nén văn bản hoặc các cài đặt dự án khác được tối ưu hóa cho nền tảng bạn dự định sử dụng.
Tải lại tên miền
Trình chỉnh sửa Unity cho phép bạn cấu hình các thiết lập về việc vào chế độ Chơi; trang này có thêm thông tin chi tiết về điều đó, nhưng bạn thường có thể tăng tốc thời gian lặp lại trong Trình chỉnh sửa bằng cách tắt Tải lại Miền (Domain Reload). Tuy nhiên, thao tác này sẽ không còn thiết lập lại trạng thái kịch bản mỗi khi bạn vào chế độ Chơi nữa, vì vậy bạn phải thực hiện việc này thủ công trong mã của mình.
Khu vực Mã trong Project Auditor có thể phân tích các tập lệnh trong dự án của bạn để giúp bạn tìm ra bất kỳ vị trí nào cần đặt lại các biến tập lệnh. Cách tốt nhất là khắc phục tất cả các sự cố hiển thị trong cửa sổ Tải lại tên miền, sau đó tắt chức năng tải lại tên miền. Để hiển thị dữ liệu trong chế độ xem này, bạn phải bật tùy chọn "Sử dụng Roslyn Analyzers" trong cửa sổ Tùy chọn. Sau đó, bạn có thể xem qua danh sách các vấn đề, làm theo hướng dẫn trong sách hướng dẫn để khắc phục chúng. Sau khi khắc phục tất cả các sự cố, bạn có thể tắt tính năng Tải lại tên miền khi vào chế độ chơi.

Chế độ xem Tóm tắt Project Auditor án
Tối ưu hóa bộ nhớ và GC
Unity sử dụng bộ thu gom rác Boehm-Demers-Weiser để tự động dọn dẹp bộ nhớ khi ứng dụng của bạn không còn cần đến nó nữa. GC) sẽ ngừng chạy 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.
Mặc dù việc quản lý tự động rất tiện lợi, nhưng việc phân bổ bộ nhớ không cần thiết hoặc thường xuyên có thể dẫn đến hiện tượng giật lag hiệu năng vì trình thu gom rác phải tạm dừng trò chơi của bạn để dọn dẹp bộ nhớ không sử dụng (còn được gọi là hiện tượng tăng đột biến GC ). Dưới đây là một số lỗi thường gặp cần lưu ý:
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ý tạm thời. 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).
Bạn cũng có thể sử dụng Project Auditor để liệt kê các phương án thay thế này; điều này có thể giúp đảm bảo rằng bạn đang sử dụng các phiên bản không phân bổ tài nguyên bất cứ khi nào có thể.
Boxing: Việc đóng gói (boxing) xảy ra khi một kiểu giá trị (ví dụ: int, float, struct) được chuyển đổi thành một kiểu tham chiếu (ví dụ: object). 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.
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 . Một ví dụ điển hình là khi người dùng đang ở trong menu hoặc tạm dừng trò chơi, trong những trường hợp đó người dùng sẽ không nhận thấy sự thay đổi.
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ó làm giảm vấn đề về hiện tượng 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. Trong những trường hợp tối ưu hóa như vậy, bạn có thể thực hiện thu gom rác toàn bộ mà không tăng dần (sử dụng GC()).
Để tìm hiểu thêm về Memory Profiler, hãy tham khảo các nguồn tài liệu sau:
Hướng dẫn và bài giải chi tiết Memory Profiler
Tối ưu hóa việc sử dụng bộ nhớ với Memory Profiler trong Unity.
Memory Profiler: Công cụ khắc phục sự cố liên quan đến bộ nhớ
Thêm mẹo dành cho Unity 6
Bạn có thể tìm thấy nhiều mẹo và kinh nghiệm thực tiễn tốt nhất dành cho các nhà phát triển và người sáng tạo Unity chuyên nghiệp tại trung tâm kinh nghiệm thực tiễn tốt nhất Unity . Hãy lựa chọn từ hơn 30 hướng dẫn được tạo ra bởi các chuyên gia trong ngành, các kỹ sư và nghệ sĩ kỹ thuật Unity , giúp bạn phát triển hiệu quả với bộ công cụ và hệ thống của Unity.
