Bao nhiêu lắp ráp thực sự được sử dụng trong mã trò chơi hiện đại? [đóng cửa]


21

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.


4
C ++ không biên dịch để lắp ráp - nó biên dịch thành mã máy. Ngôn ngữ hội là cách xác định trực tiếp chính xác mã máy bạn muốn tạo.
Kylotan

6
C ++ là (nói chung) không thực sự được biên dịch để lắp ráp, nó được biên dịch trực tiếp vào mã máy. Câu hỏi có lẽ là đề cập đến bao nhiêu lắp ráp viết tay được liên kết đến một dự án hoặc được viết dưới dạng lắp ráp nội tuyến.
Josh

1
Bất kể, tôi không nghĩ rằng có một câu trả lời thiết thực, hữu ích cho câu hỏi này. Về cơ bản, nó phụ thuộc vào một yếu tố tương tự, nhiều yếu tố mang tính chủ quan (nghĩa là ý kiến ​​của các tác giả của mã).
Josh

1
Ngày nay, việc tập hợp viết không quá quan trọng, với một số trường hợp ngoại lệ như lập trình SPU, nhưng việc có thể đọc nó rất quan trọng để phân tích các bãi đổ vỡ
Maik Semder

4
@Legion - bạn có thể khiến trình biên dịch / IDE phát ra lắp ráp, nhưng điều đó không có nghĩa là trình biên dịch tạo ra lắp ráp như là một phần của quá trình biên dịch thông thường. Nó không cần thiết cho nó để làm như vậy và do đó, hầu hết không.
Josh

Câu trả lời:


29

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:

  • trong các trò chơi dựa trên trình duyệt? Không ai.
  • trong game PC điển hình? Không ai. (Nhưng bạn có thể thấy một số trong các thư viện cấp thấp.)
  • trong trò chơi iOS và Android? Không ai.
  • "AAA" trò chơi trên PC và game console? Có thể một chút, có thể 0,05% cơ sở mã. (Với một chút nữa trong các thư việ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.


1
Còn hướng dẫn về SSE thì sao?
Quân đoàn

4
@Legion, mọi người thường viết mã SSE bằng cách sử dụng hoặc các thư viện toán học bao bọc các công cụ SSE hoặc bằng một ngôn ngữ nhỏ chuyên dụng được thiết kế riêng để biên dịch sang SSE, chẳng hạn như ispc . Viết lắp ráp trực tiếp vẫn còn khá hiếm.
Nathan Reed

1
Về trò chơi iOS: Nếu tôi nhớ chính xác, thư viện 3D / Math Oolong đã sử dụng một số lắp ráp ARM nội tuyến. Điều đó không còn cần thiết kể từ khi Apple phát hành khung Tăng tốc.
Nicolas Miari

Đồng ý với Nathan - SSE và các tối ưu hóa cụ thể theo hướng dẫn tương tự thường tồn tại trong các thư viện (vì chúng thường là nơi duy nhất có tổng lợi ích thu được xứng đáng với nỗ lực bỏ ra).
Kylotan

26

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 độ đó.


3
+1 đơn giản là vì Crashworks nổi tiếng trên SO là "anh chàng viết mã được tối ưu hóa ở mức độ thấp cho trò chơi" - nếu có ai biết về chủ đề này, thì đó là anh ta.
BlueRaja - Daniel Pflughoeft

@ BlueRaja-DannyPflughoeft "Nổi tiếng"? Ta tự hào! =) Một sự trùng hợp thú vị, theo nhận xét của Nathan Reed, là tôi đã học được nhiều kỹ năng tối ưu hóa cấp thấp của mình tại Chó nghịch ngợm.
Crashworks

Ở những nơi khác tôi cũng đã nghe thấy tầm quan trọng của việc lắp ráp trong gỡ lỗi. Vì vậy, tôi sẽ tìm hiểu nó. Cảm ơn cho cái nhìn sâu sắc và liên kết.
Quân đoàn

7

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 .


1
Ngay cả trên PS3, mọi người thường không hoàn toàn lập trình. Có một công cụ cho phép bạn viết mã theo cú pháp giống như lắp ráp, trong đó bạn chỉ định các hướng dẫn máy, nhưng nó thực hiện phân bổ đăng ký, lập lịch hướng dẫn và đường ống vòng lặp cho bạn. Chà, có lẽ Nicky Dog thực sự làm tất cả bằng tay, nhưng ngay cả hầu hết các nhà phát triển PS3 SPU cũng không có kinh nghiệm của tôi. :)
Nathan Reed

1
@NathanReed Trong những ngày ở PS2, đường ống vòng lặp thủ công thực sự là một phần của cuộc phỏng vấn lập trình viên của Naughty Dog.
Crashworks

-1

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.