Hướng dẫn này mô tả quy trình phân tích và tối ưu hoá hiệu suất trò chơi trên các thiết bị Android để mang lại trải nghiệm mượt mà cho người dùng. Báo cáo này trình bày cách xác định các điểm tắc nghẽn về hiệu suất, phân biệt giữa các vấn đề về CPU và GPU, cũng như xác minh kết quả tối ưu hoá.
Dù trò chơi có thú vị hay hấp dẫn đến đâu, nếu không chạy mượt mà trên thiết bị di động, người chơi sẽ không thích và trò chơi đó sẽ không thành công. Ngay cả những trò chơi thú vị cũng có thể gặp phải các vấn đề như số khung hình trên giây (FPS) thấp hoặc thiết bị quá nóng. Những vấn đề này khiến người chơi không hài lòng. Do đó, việc cải thiện hiệu suất trò chơi là điều cần thiết và bạn phải hiểu cách tối ưu hoá hiệu suất.
Quy trình tối ưu hoá hiệu suất bao gồm các bước sau:
Đo lường hiệu suất tổng thể của trò chơi. Định lượng mức giảm hiệu suất trên cơ sở mỗi cảnh để xác định chính xác các điểm bất thường.
Kiểm tra giới hạn CPU và GPU. Xác định nguyên nhân cơ bản, cho dù là do CPU hay GPU.
Công cụ: Unreal Insight, Unity Profiler, Perfetto và các công cụ đo lường hiệu suất.
Tối ưu hoá CPU. Khắc phục các nút thắt cổ chai về hiệu suất đã xác định.
Công cụ: Unreal Insight, Unity Profiler, Perfetto và Simpleperf.
Tối ưu hoá GPU. Khắc phục các nút thắt cổ chai về hiệu suất đã xác định.
Công cụ: RenderDoc, Arm mobile studio, AGI, Công cụ dành riêng cho nhà cung cấp.
Thử nghiệm A/B. Tiến hành thử nghiệm A/B để xác thực một cách nghiêm ngặt hiệu quả của các điểm tối ưu hoá đã triển khai.
Công cụ: Unreal Insight, Unity Profiler, Perfetto và các công cụ đo lường hiệu suất, khoá tần số CPU hoặc GPU và RenderDoc.
Quy trình lặp lại này (1-5) được duy trì cho đến khi đạt được FPS và các thông số nhiệt mục tiêu.
Điều kiện tiên quyết
Có một bản dựng trò chơi sẵn sàng để kiểm thử trên thiết bị chạy Android.
Cài đặt các công cụ sau:
Phân tích hiệu suất toàn diện của trò chơi
Bạn phải kiểm tra hiệu suất tổng thể của trò chơi và xác định mọi trường hợp hiệu suất giảm hoặc bất thường dựa trên cảnh. Trước khi tối ưu hoá trò chơi, hãy kiểm tra hiệu suất hiện tại của trò chơi. Vì trò chơi có nhiều giao diện người dùng và cảnh, hãy phân tích những cảnh có mức sử dụng CPU hoặc GPU cao, hoặc những bố cục hoạt động không như mong đợi, để theo dõi tình trạng giảm hiệu suất và mức sử dụng CPU hoặc GPU trên mỗi cảnh.
- Định lượng mức giảm hiệu suất: Sử dụng các công cụ đo lường hiệu suất để đo lường hiệu suất tổng thể của trò chơi. Đo lường hiệu suất theo từng cảnh để xác định các khu vực cụ thể có sự suy giảm hoặc bất thường.
- Xác định những cảnh có vấn đề: Phân tích dữ liệu để tìm những cảnh có mức sử dụng CPU hoặc GPU cao, hoặc những cảnh mà bố cục màn hình không mang lại hiệu suất như mong đợi.
- Thu thập dữ liệu theo dõi: Sử dụng các công cụ theo dõi để thu thập dữ liệu chi tiết về hiệu suất cho những cảnh có vấn đề đã xác định.
Xác định nút thắt cổ chai CPU hoặc GPU
Nếu trò chơi không đạt được FPS mục tiêu, hãy xác định xem trò chơi có bị giới hạn bởi CPU hay GPU hay không. Việc phân tích hành vi của CPU và GPU là rất quan trọng để tìm ra các cơ hội tối ưu hoá, ngay cả khi thiết bị bị nóng hoặc sử dụng quá nhiều năng lượng trong khi chơi trò chơi. Bạn có thể dùng nhiều phương pháp để tìm hiểu xem hệ thống có bị giới hạn về CPU hay GPU hay không.
Phân tích dữ liệu theo dõi: Sử dụng công cụ mà bạn muốn để phân tích dữ liệu theo dõi:
- Unreal Insight (Unreal Engine): Phân tích dấu vết để xem thời gian cho
GameThread,RenderThreadvàRHIThread.- Nếu
GameThreadhoặcRenderThreadvượt quá giới hạn thời gian kết xuất khung hình (ví dụ: 33, 3 mili giây cho 30 khung hình/giây), thì trò chơi sẽ bị CPU hạn chế. - Nếu
RHIThreadcho thấy quá trình thực thi kéo dài hoặc chiếm phần lớn thời gian kết xuất khung hình, thì trò chơi sẽ bị hạn chế bởi GPU.
- Nếu
Hình 2. Dấu vết thông tin chi tiết của Unreal với GameThread, RenderThread và RHIThread (nhấp để phóng to). - Unity Profiler (Unity): Nếu luồng chính tiêu tốn nhiều thời gian cho các điểm đánh dấu như
Gfx.WaitForPresentOnGfxThreadtrong khi luồng kết xuất cho thấyGfx.PresentFramehoặc<GraphicsAPIName>.WaitForLastPresent, thì trò chơi sẽ bị giới hạn bởi GPU.
Hình 3. Ví dụ về giới hạn GPU cho Unity Profiler (nhấp để phóng to). - Perfetto: Phân tích việc chỉ định nhân CPU và thông tin chi tiết về việc thực thi luồng. Phân tích này giúp xác định các điểm tắc nghẽn hiệu suất thông qua việc xem xét chi tiết thông tin thực thi luồng.
Mức hao tổn CPU: Dấu vết cho thấy khối lượng công việc trên
GameThreadvàRenderThread, cùng với VSync, chịu trách nhiệm về độ trễ trongQueuePresentcủa RHI Thread, do đó cho thấy một tình huống bị giới hạn bởi CPU.
Hình 4. Dấu vết Perfetto có thông tin chi tiết về quá trình thực thi CPU (nhấp để phóng to). Mức sử dụng GPU: Nếu thời gian hoàn thành của GPU vượt quá giới hạn thời gian kết xuất khung hình (ví dụ: 25 mili giây), thì trò chơi sẽ bị ràng buộc bởi GPU. Dấu vết cho biết thời gian hoàn thành của GPU vượt quá 25 mili giây, tức là một trường hợp bị giới hạn bởi GPU.
Hình 5. Dấu vết Perfetto có thông tin chi tiết về mức hao tổn GPU (nhấp để phóng to).
- Unreal Insight (Unreal Engine): Phân tích dấu vết để xem thời gian cho
Sử dụng các lệnh stat của Unreal Engine:
stat unit: So sánh thời gian được phân bổ cho các luồng Trò chơi, Vẽ và RHI. Nếu thời gian của Trò chơi và Vẽ thấp nhưng thời gian RHI liên tục vượt quá giới hạn thời gian kết xuất khung hình, thì trò chơi sẽ bị ràng buộc bởi GPU. Ví dụ: nếu FPS cần thiết là 30 (tương đương với 33,33 mili giây cho mỗi khung hình) và cả luồng Trò chơi và Vẽ đều luôn nằm trong khoảng 10 – 15 mili giây, nhưng RHI luôn vượt quá 30 mili giây, thì điều này cho thấy rõ ràng là tình huống bị ràng buộc bởi GPU.
Hình 6. Đơn vị thống kê giúp ước tính các điều kiện bị ràng buộc bởi GPU. stat VulkanRHI: Kiểm tra thời lượng của Queue Submit và Queue Present.
Hình 7. Stat VulkanRHI hỗ trợ việc ước tính các điều kiện liên kết với GPU (nhấp để phóng to). stat slow: Xem xét kỹ lưỡng thời gian được phân bổ cho các luồng Trò chơi, Kết xuất và RHI để xác định các trở ngại.
Kiểm tra các chỉ số hiệu suất: Sử dụng kết quả từ phân tích toàn diện hiệu suất của trò chơi. Trên Android:
- Bị ràng buộc bởi CPU: Mức sử dụng CPU (đã chuẩn hoá) lớn hơn 15%, với mức sử dụng GPU thấp và FPS thấp.
- GPU-bound: Mức sử dụng GPU lớn hơn 90%.
Thông thường, nếu FPS và mức sử dụng GPU thấp trong khi mức sử dụng CPU vượt quá 15%, thì tình huống này có thể được coi là bị ràng buộc bởi CPU.
Hình 8. Các chỉ số hiệu suất về mức sử dụng CPU và GPU.
Tối ưu hoá hiệu suất CPU
Nếu kết quả phân tích cho thấy trò chơi bị ràng buộc bởi CPU, hãy điều tra thêm để xác định các luồng hoặc API cụ thể gây ra tình trạng tắc nghẽn.
Để biết hướng dẫn chi tiết, hãy xem bài viết Các mẹo tối ưu hoá CPU và GPU cho Android.
Tối ưu hoá hiệu suất GPU
Nếu kết quả phân tích cho thấy trò chơi bị giới hạn bởi GPU, hãy điều tra thêm bằng cách sử dụng trình gỡ lỗi khung hình để phân tích quy trình kết xuất và lệnh vẽ.
Để biết hướng dẫn chi tiết, hãy xem bài viết Các mẹo tối ưu hoá CPU và GPU cho Android.
Xác minh hiệu quả của việc tối ưu hoá
- Tiến hành thử nghiệm A/B: Tạo bản dựng có các điểm tối ưu hoá đã triển khai.
- Đo lường hiệu suất: Sử dụng các công cụ và phương pháp tương tự như trong quy trình phân tích ban đầu để đo lường hiệu suất của bản dựng đã tối ưu hoá.
- So sánh kết quả: So sánh dữ liệu hiệu suất mới với dữ liệu ban đầu để xác nhận rằng các điểm tắc nghẽn đã xác định đã được giải quyết và FPS cũng như các mục tiêu về nhiệt độ đã đạt được.
- Lặp lại: Lặp lại các bước phân tích và tối ưu hoá cho đến khi đạt được hiệu suất mong muốn.