Trung bình, mức độ thường xuyên lắp ráp được sử dụng trong mã trò chơi hiện đại?
Cụ thể trên các nền tảng đã có trình biên dịch C ++ tốt, như x86, PPC hoặc ARM - vì tôi cho rằng các trò chơi trên các hệ thống nhúng sử dụng rộng rãi cho việc lắp ráp.
Trung bình, mức độ thường xuyên lắp ráp được sử dụng trong mã trò chơi hiện đại?
Cụ thể trên các nền tảng đã có trình biên dịch C ++ tốt, như x86, PPC hoặc ARM - vì tôi cho rằng các trò chơi trên các hệ thống nhúng sử dụng rộng rãi cho việc lắp ráp.
Câu trả lời:
Câu trả lời phụ thuộc một chút vào ý nghĩa của "trò chơi" và "đã sử dụng". Tôi sẽ giả sử "đã sử dụng" có nghĩa là "được viết trong quá trình thực hiện dự án trò chơi cụ thể".
Theo kinh nghiệm của tôi và dữ liệu giai thoại từ những người tôi đã nói chuyện:
Kiến thức về ngôn ngữ lắp ráp không được mong đợi cho công việc trong ngành công nghiệp trò chơi, nhưng tùy thuộc vào loại trò chơi bạn tạo ra, nó có thể có lợi.
Đã từng có một cuộc tranh luận rằng trình biên dịch thực hiện công việc tối ưu hóa mã C tốt hơn so với con người với lắp ráp viết tay. Thông thường đó là sự thật, đôi khi nó sai. Nhưng ngày nay, sự kết hợp giữa độ phức tạp của CPU ngày càng tăng và nhu cầu mở rộng quy mô '(nghĩa là tách bộ xử lý) có nghĩa là các nỗ lực tối ưu hóa thường được chi tiêu ở nơi khác.
Trong những năm gần đây, lần duy nhất tôi thấy lắp ráp trong mã trò chơi là các __asm int 3tuyên bố để buộc các điểm dừng và việc sử dụng lắp ráp cá nhân duy nhất của tôi là xem xét việc tháo gỡ một chức năng để chẩn đoán các lỗi sự cố bất thường.
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 độ đó.
Các vấn đề được sử dụng để yêu cầu lắp ráp bằng tay đang ngày càng ít về số lượng. Những gì bạn "có thể" đạt được về tốc độ bạn mất trong khả năng đọc và khả năng gỡ lỗi. Nó cũng chỉ nên được thực hiện như một trong những bước tối ưu hóa cuối cùng trên các phần của mã vì trong hầu hết các trường hợp, các vấn đề về tốc độ không phải là thứ không thể làm tốt hơn khi lắp ráp. Ngày nay, CPU đã nhanh hơn rất nhiều trong khi tốc độ bộ nhớ thì không, điều quan trọng hơn là kiểm soát cách dữ liệu chảy qua CPU hơn bất kỳ thứ gì khác.
Với các trình biên dịch hiện đại, họ cũng khó có thể tối ưu hóa xung quanh mã lắp ráp vì họ phải xử lý bất kỳ thanh ghi nào bạn đã chạm vào và họ thường không thể đặt hàng lại các hướng dẫn trong mã thủ công của bạn. Để giảm nhu cầu lắp ráp, giờ đây cũng có những nội tại giúp truy cập vào các khái niệm cấp thấp, nhưng theo cách thân thiện với trình biên dịch và cho phép chúng làm việc với bạn thay vì chống lại.
Như đã nói, SPU trên PS3 là một lĩnh vực mà mọi người vẫn phải sử dụng lắp ráp để tận dụng tối đa bộ xử lý, ví dụ như sử dụng đường ống dẫn hướng dẫn thủ công như được giải thích ở đây .
Thực tế là chúng ta sống trong một thế giới đa nền tảng và các phần trong mã trò chơi của chúng ta phải được điều chỉnh theo nền tảng cục bộ - cũng không phải, nhưng có những lợi ích nếu chúng ta tận dụng những thứ phần cứng cục bộ!
Đây không phải là về trò chơi hay logic trò chơi, nó là về địa phương phần cứng để thực hiện tối ưu mã theo bản lề logic trò chơi, chúng tôi thực sự có thể bọc các phần mã, ví dụ như sử dụng macro, có một mã nguồn, thực thi tốt trên nền tảng nó được xây dựng để chống lại.