Nơi tôi đã làm việc, chúng tôi luôn sử dụng nhiều cấp độ hồ sơ; nếu bạn thấy một vấn đề, bạn chỉ cần di chuyển xuống danh sách một chút nữa cho đến khi bạn biết được chuyện gì đang xảy ra:
- "Hồ sơ con người", hay chỉ chơi trò chơi ; đôi khi nó cảm thấy chậm hoặc "quá giang"? Nhận thấy hình ảnh động giật? (Là nhà phát triển, lưu ý rằng bạn sẽ nhạy cảm hơn với một số loại vấn đề về hiệu suất và không biết gì về người khác. Lập kế hoạch thử nghiệm bổ sung cho phù hợp.)
- Bật màn hình FPS , là cửa sổ FPS trung bình trượt 5 giây. Rất ít chi phí để tính toán và hiển thị.
- Bật các thanh hồ sơ , chỉ là một loạt các hình tứ giác (màu ROYGBIV) đại diện cho các phần khác nhau của khung (ví dụ: vblank, preframe, cập nhật, va chạm, kết xuất, postframe) bằng cách sử dụng bộ đếm thời gian "đồng hồ bấm giờ" đơn giản xung quanh mỗi phần của mã . Để nhấn mạnh những gì chúng tôi muốn, chúng tôi đặt thanh có giá trị chiều rộng màn hình là đại diện cho khung mục tiêu 60Hz, vì vậy thật dễ dàng để xem bạn có ví dụ như ngân sách 50% (chỉ bằng một nửa thanh) hoặc hơn 50% ( thanh kết thúc tốt đẹp và trở thành một thanh rưỡi). Cũng khá dễ dàng để nói những gì thường ăn hầu hết các khung: red = render, yellow = update, v.v ...
- Xây dựng một công cụ cụ thể đặc biệt chèn "đồng hồ bấm giờ" như mã xung quanh mỗi chức năng. (Lưu ý rằng bạn có thể đạt hiệu năng lớn, dcache và icache khi thực hiện việc này, vì vậy nó chắc chắn xâm phạm. Nhưng nếu bạn thiếu một trình tạo mẫu thích hợp hoặc hỗ trợ tốt trên CPU, đây là một lựa chọn chấp nhận được. về việc ghi lại tối thiểu dữ liệu về chức năng nhập / thoát và xây dựng lại các calltraces sau.) Khi chúng tôi xây dựng chúng tôi, chúng tôi đã bắt chước nhiều định dạng đầu ra của gprof .
- Tốt nhất của tất cả, chạy một hồ sơ lấy mẫu ; VTune và CodeAnalyst có sẵn cho x86 và x64, bạn đã có nhiều môi trường mô phỏng hoặc mô phỏng khác nhau có thể cung cấp cho bạn dữ liệu ở đây.
(Có một câu chuyện thú vị từ một GDC năm ngoái của một lập trình viên đồ họa đã chụp bốn bức ảnh của anh ta - vui vẻ, thờ ơ, khó chịu và tức giận - và hiển thị một hình ảnh phù hợp ở góc của các bản dựng nội bộ dựa trên khung hình. những người sáng tạo nội dung đã nhanh chóng học được cách không bật các shader phức tạp cho tất cả các đối tượng và môi trường của họ: chúng sẽ khiến lập trình viên tức giận. Kìa sức mạnh của phản hồi.)
Lưu ý rằng bạn cũng có thể thực hiện những điều thú vị như vẽ biểu đồ "thanh hồ sơ" liên tục, do đó bạn có thể thấy các mẫu tăng đột biến ("chúng tôi đang mất một khung hình cứ sau 7 khung hình") hoặc tương tự.
Tuy nhiên, để trả lời câu hỏi của bạn: theo kinh nghiệm của tôi, trong khi nó hấp dẫn (và thường bổ ích - tôi thường học một cái gì đó) để viết lại các chức năng / mô-đun đơn lẻ để tối ưu hóa số lượng hướng dẫn hoặc hiệu suất icache hoặc dcache, và chúng tôi thực sự cần phải làm điều này đôi khi khi chúng ta gặp vấn đề về hiệu suất đặc biệt đáng ghét, phần lớn các vấn đề về hiệu suất mà chúng ta thường xuyên phải giải quyết là do thiết kế . Ví dụ:
- Chúng ta có nên lưu trữ trong RAM hoặc tải lại từ đĩa khung hoạt hình trạng thái "tấn công" cho trình phát không? Làm thế nào về mỗi kẻ thù? Chúng tôi không có RAM để làm tất cả, nhưng tải đĩa rất tốn kém! Bạn có thể thấy quá giang nếu 5 hoặc 6 kẻ thù khác nhau xuất hiện cùng một lúc! (Được rồi, làm thế nào về sinh sản đáng kinh ngạc?)
- Chúng ta đang thực hiện một loại hoạt động trên tất cả các hạt hay tất cả các hoạt động trên một hạt? (Đây là một sự đánh đổi icache / dcache và câu trả lời không phải lúc nào cũng rõ ràng.) Làm thế nào về việc tách tất cả các hạt và lưu trữ các vị trí lại với nhau ("cấu trúc mảng" nổi tiếng) so với việc giữ tất cả dữ liệu hạt ở một nơi (" mảng cấu trúc ").
Bạn nghe thấy nó cho đến khi nó trở nên đáng ghét trong bất kỳ khóa học khoa học máy tính cấp đại học nào, nhưng: nó thực sự là tất cả về cấu trúc dữ liệu và thuật toán. Dành một chút thời gian cho thuật toán và thiết kế luồng dữ liệu sẽ giúp bạn có nhiều tiếng vang hơn cho công việc nói chung. (Hãy chắc chắn rằng bạn đã đọc các cạm bẫy tuyệt vời của các slide lập trình hướng đối tượng từ một đồng nghiệp Dịch vụ nhà phát triển Sony để hiểu rõ hơn ở đây.) Điều này không "cảm thấy" như tối ưu hóa; đó chủ yếu là thời gian dành cho một công cụ bảng trắng hoặc UML hoặc tạo ra nhiều nguyên mẫu, thay vì làm cho mã hiện tại chạy nhanh hơn. Nhưng nó thường đáng giá hơn nhiều.
Và một heuristic hữu ích khác: nếu bạn ở gần "lõi" của động cơ, có thể cần thêm một số nỗ lực và thử nghiệm để tối ưu hóa (ví dụ: vectơ các bội số ma trận đó!). Càng đi sâu vào cốt lõi, bạn càng ít phải lo lắng về điều đó trừ khi một trong những công cụ định hình của bạn nói với bạn cách khác.