Phần lớn mã hiệu suất cao trong các trò chơi console hiện đại được viết bằng cách sử dụng một loại trung gian giữa lắp ráp và C ++: nội tại của trình biên dịch . Các cấu trúc này trông và phân tích giống như các hàm C ++, nhưng thực sự được dịch thành các lệnh máy đơn lẻ . Vì vậy, ví dụ, hàm "kẹp từng giá trị của vectơ V là> = a và <= b" trông giống như
// for each v.x, ensure v.x >= a.x && v.x <= b.x
inline __m128 ClampSIMD( const __m128 &v, const __m128 & a, const __m128 & b )
{
return _mm_max_ps( a, _mm_min_ps( v, b ) );
}
Trong các chức năng như thế này, tôi vẫn đang suy nghĩ về các hướng dẫn máy cụ thể , nhưng tôi có sự tiện lợi khi viết chúng bằng C để tôi không phải lo lắng về việc đăng ký tô màu và lên lịch và tải ops và các chi tiết nhàm chán khác.
Bạn vẫn cần lưu ý những gì CPU hỗ trợ, đặc biệt là vì các trình biên dịch hiện đại rất tệ trong việc mã hóa vectơ, so với việc một người thông minh có thể thực hiện công việc tốt như thế nào. Ngoài ra đôi khi các chi tiết tinh tế về cách bạn sắp xếp mã của bạn có thể có ý nghĩa rất lớn đối với hiệu suất không rõ ràng mà không hiểu máy đang làm gì.
Mặc dù chúng tôi có thể không mã trong lắp ráp, chúng tôi vẫn gỡ lỗi trong lắp ráp rất nhiều. Tối ưu hóa trình biên dịch sắp xếp lại mã một cách mạnh mẽ theo cách mà trình gỡ lỗi không thể theo kịp, vì vậy, thường khi gỡ lỗi "chế độ phát hành", điều tốt nhất cần làm là mở trình phân tách và theo dõi mã theo cách đó. Bài nói chuyện này của GDC về "Gỡ lỗi pháp y" về các sự cố minh họa cho nhiều vấn đề rắc rối và rắc rối ở cấp độ đó.