Mức sử dụng bộ nhớ là yếu tố quan trọng trong quá trình phát triển trò chơi Android. Khi phát triển trò chơi bằng Unreal Engine, bạn phải liên tục phân tích và theo dõi trạng thái bộ nhớ để đáp ứng những hạn chế về bộ nhớ này, ngăn chặn tình trạng rò rỉ bộ nhớ và việc phân bổ bộ nhớ quá mức.
Tiết kiệm bộ nhớ thông qua việc giảm hoán vị chương trình đổ bóng
Bằng cách xoá các lựa chọn không dùng đến trong Lighting hoặc Mobile Shader Permutation
Reduction, bạn có thể giảm thiểu số lượng hoán vị của chương trình đổ bóng. Điều này giúp giảm đáng kể kích thước đóng gói ứng dụng, giảm số lượng đối tượng trạng thái quy trình (PSO) và ngăn việc tạo các mục tiêu kết xuất hoặc hoạ tiết giả không dùng đến, dẫn đến việc giảm bộ nhớ thời gian chạy và cải thiện hiệu suất.
Để biết thêm thông tin, hãy xem phần Misc Lighting and Shader Permutation Reduction Settings for Mobile (Các chế độ cài đặt khác về ánh sáng và giảm hoán vị của chương trình đổ bóng cho thiết bị di động) trong Performance Guidelines for Mobile Devices (Nguyên tắc về hiệu suất cho thiết bị di động).
Tối ưu hoá việc tải thành phần
Khi tải các tài sản bằng cách sử dụng các tham chiếu cố định, nội dung được kết nối (thậm chí không được dùng trong trò chơi) sẽ được tải vào bộ nhớ cùng lúc, gây ra tình trạng tiêu thụ bộ nhớ không cần thiết. Cụ thể, khi sử dụng sai tính năng kế thừa trong Bản thiết kế, các CDO (Đối tượng mặc định của lớp) không cần thiết từ các đối tượng mẹ sẽ được phân bổ, gây lãng phí một lượng lớn bộ nhớ. Trong những trường hợp như vậy, hãy áp dụng các kỹ thuật sau để tối ưu hoá mức sử dụng bộ nhớ.
- Định nghĩa mã C++ và phân tách dữ liệu: Xác định các chức năng cốt lõi bằng cách sử dụng
UCLASS(Abstract)trong mã C++, tách các chức năng này khỏi dữ liệu thực tế. - Giảm thiểu việc kế thừa: Chỉ thực hiện thiết lập dữ liệu và tải thành phần trong Bản thiết kế nút lá.
- Sử dụng các tham chiếu gián tiếp: Áp dụng các tham chiếu gián tiếp đến thuộc tính bằng cách sử dụng
TSoftObjectPtrđể tránh các tham chiếu cố định và tải các thành phần một cách không đồng bộ khi thực sự cần thiết trong thời gian chạy. - Thận trọng: Khi sử dụng tính năng Tải thành phần không đồng bộ, hãy đảm bảo rằng các quy trình kiểm tra tính hợp lệ (
IsValid) được thực hiện trong lệnh gọi lại hoàn tất quá trình tải để ngăn con trỏ treo hoặc sự cố.
Để biết thêm thông tin, hãy xem phần Tham chiếu đến các thành phần và Tạo trò chơi di động bằng UE5.
Con trỏ thông minh và điều chỉnh bộ thu gom rác (GC)
Việc sử dụng con trỏ thông minh (chẳng hạn như TSharedPtr và TWeakPtr) trong quá trình phát triển C++ giúp ngăn chặn con trỏ treo và rò rỉ bộ nhớ. Hơn nữa, việc sử dụng TWeakPtr sẽ tránh tạo các tham chiếu mạnh đến các đối tượng, do đó, trình thu gom rác sẽ không tăng số lượng tham chiếu khi thu thập các đối tượng. Điều này ngăn chặn sự tồn tại của các đối tượng không cần thiết và giảm độ phức tạp của biểu đồ tham chiếu mà GC cần duyệt qua, giúp giảm đáng kể chi phí GC. Bạn có thể quản lý hiệu quả việc thu thập rác trong môi trường di động bằng cách kích hoạt ForceGarbageCollection trong quá trình chuyển đổi cấp độ hoặc khoảng thời gian không hoạt động, chẳng hạn như khi không có lượt tương tác của người dùng. Ngoài ra, sự kiện này có thể được kích hoạt khi trò chơi ở trạng thái có thể nhận biết hoặc ở chế độ nền (ví dụ: lệnh gọi lại onStop), đảm bảo rằng quá trình thu gom rác được thực hiện mà không ảnh hưởng đến trải nghiệm chơi trò chơi đang hoạt động.
Để biết thêm thông tin, hãy xem phần Thu gom rác và Con trỏ thông minh.
Tối ưu hoá bằng cách sử dụng tính năng nén bảng di dời
Nén bảng di dời là một phương pháp tối ưu hoá giúp nén kích thước Bảng di dời trong các tệp nhị phân ELF để giảm kích thước tệp nhị phân Android. Khi Android minSDKVersion từ 23 trở lên, tính năng Nén bảng di dời APS sẽ được hỗ trợ; khi minSDKVersion từ 28 trở lên, tính năng Nén bảng di dời RELR cũng được hỗ trợ, giúp giảm đáng kể kích thước của tệp .so. Điều này không chỉ giảm kích thước tải xuống mà còn giảm mức sử dụng bộ nhớ của .so mmap trong thời gian chạy, giúp giảm áp lực tổng thể lên bộ nhớ thực.
AndroidToolChain.cs
if (MinSDKVersion >= 28)
{
Result += " -Wl,--pack-dyn-relocs=android+relr,--use-android-relr-tags";
}
else if (MinSDKVersion >= 23)
{
Result += " -Wl,--pack-dyn-relocs=android";
}
Để áp dụng chế độ tối ưu hoá này, hãy xác minh rằng bạn đã bật Enable compression of relocation tables (Bật tính năng nén bảng di dời) trong Project Settings (Cài đặt dự án) hoặc biến bEnableAdvancedBinaryCompression.
Để kiểm tra xem chế độ nén RELR có được áp dụng đúng cách cho tệp nhị phân hay không, hãy dùng công cụ llvm-readelf trong Android NDK.
llvm-readelf -d libUnreal.so | grep RELR
Trên thực tế, việc tạo mẫu ThirdPerson của Unreal Engine và đo lường bằng dumpsys meminfo xác nhận rằng mức sử dụng PSS và RSS cho .so mmap đã giảm.
| Danh mục | Tổng PSS | Private Dirty | Dọn dẹp riêng tư | Swap Dirty | Tổng số RSS |
|---|---|---|---|---|---|
| .so mmap Trước khi nén | 170.210 | 24.360 | 141.564 | 0 | 242.204 |
| .so mmap Sau khi nén | 138.031 | 24.748 | 108.976 | 0 | 210.140 |
Nén hoạ tiết
Sử dụng phương pháp nén hoạ tiết phù hợp để giảm mức sử dụng bộ nhớ của tài nguyên đồ hoạ tổng thể. Việc sử dụng Nén hoạ tiết có thể mở rộng thích ứng (ASTC), tiêu chuẩn di động, mang lại chất lượng hình ảnh vượt trội so với ETC2 ở cùng kích thước hoặc đạt được tỷ lệ nén cao hơn với mức tiêu thụ bộ nhớ thấp hơn trong cùng mục tiêu chất lượng hình ảnh.
Tối ưu hoá tính năng truyền trực tuyến hoạ tiết
Trong môi trường di động, việc sử dụng trực tiếp kích thước nhóm truyền phát kết cấu mặc định của Unreal Engine có thể phân bổ trước một nhóm bộ nhớ quá lớn so với thông số kỹ thuật của thiết bị. Do đó, bạn nên xác định Hồ sơ thiết bị di động và chọn kích thước nhóm truyền phát trực tiếp kết cấu phù hợp theo giới hạn bộ nhớ của thiết bị. Ngoài ra, hãy sử dụng tính năng Statistic (Thống kê) của Trình chỉnh sửa để kiểm tra số liệu thống kê về hoạ tiết và xác định những hoạ tiết tiêu tốn nhiều bộ nhớ có độ phân giải cực cao trong thời gian chạy. Kết hợp tính năng này với tính năng Độ phân giải hoạ tiết bắt buộc để thực thi các giới hạn hoặc giảm độ phân giải tối đa trên các hoạ tiết đòi hỏi nhiều tài nguyên, đồng thời kiểm soát mức sử dụng tài nguyên trong vùng đệm bộ nhớ hoạ tiết được phân bổ.