Cách tốt nhất để có được kinh nghiệm làm việc C ++ cho một công việc trong các trò chơi (đến từ C #) [đã đóng]


19

Tôi là một nhà phát triển phần mềm, có kinh nghiệm với C # (5 năm kinh nghiệm) cùng với một vài ngôn ngữ khác.

"Công việc mơ ước" của tôi là làm việc trong các trò chơi video với tư cách là nhà phát triển.

Hầu hết các công việc đòi hỏi kiến ​​thức về C ++, mà hiện tại tôi không có (ngoại trừ một số điều cơ bản).

Tôi đã xem xét xung quanh và hầu hết các công ty trò chơi lớn đều yêu cầu điều gì đó trong 3-5 năm kinh nghiệm trước đó với C ++.

Câu hỏi của tôi là - điều gì sẽ là một con đường tốt để đưa bản thân đến mức kinh nghiệm cần thiết này, đến từ C #?

Tôi đã nghĩ ra một số cách có thể để làm điều đó:

Nhận thêm kiến ​​thức về C ++ từ sách. Tham gia vào các dự án nguồn mở được viết bằng C ++. Điều gì sẽ là cách tốt nhất để học C ++ và có kinh nghiệm ở cấp độ làm việc với nó, đặc biệt là cho ngành công nghiệp trò chơi?


1
Cảm ơn tôi sẽ kiểm tra xem nó ra. Mặc dù tôi không chắc đây là câu hỏi chính xác vì tôi không phải là người mới bắt đầu lập trình.
spaceOwl

3
Không ai quan tâm nhiều đến việc bạn có kinh nghiệm từ đâu và bạn có được trả tiền cho việc đó hay không. Nếu bạn muốn có kinh nghiệm về C ++, hãy bắt đầu lập trình C ++.
Maik ngày

@liortal Repost: Xem thêm Một số lời khuyên tuyệt vời cho người mới bắt đầu là gì? (một số người lạ đã xóa tất cả các bình luận của tôi về chủ đề này).
bobobobo

Câu trả lời:


29

Là một nhà phát triển trò chơi, mối quan tâm chính của tôi khi thuê một anh chàng C # sẽ là thiếu kiến ​​thức cấp thấp.

Vì vậy, hãy xem xét một dự án nơi công việc của bạn đòi hỏi tối ưu hóa mức độ thấp như sắp xếp lại bố cục dữ liệu của các lớp hoặc viết lại mã để tận dụng các hướng dẫn SIMD. Hãy chơi một trò chơi mã nguồn mở C ++, tối ưu hóa nó và đăng mức tăng tốc độ khung hình trong sơ yếu lý lịch của bạn.

Nếu tôi đang phỏng vấn bạn, tôi sẽ ít quan tâm đến C ++ trong hồ sơ xin việc của bạn và nhiều hơn về việc bạn có thể trả lời C / C ++ / câu hỏi phỏng vấn cấp thấp của tôi không. Tôi sẽ tham gia một số câu hỏi phỏng vấn tiêu chuẩn mà bạn có thể gặp rắc rối (cảnh báo: Tôi không phải là chuyên gia về C #):

  • Các lớp C ++ được đặt trong bộ nhớ như thế nào? Vẽ sơ đồ các byte. Bao gồm các con trỏ vtable và đệm / căn chỉnh các biến thành viên. Một lớp dẫn xuất thì sao? Một lớp có nguồn gốc đa dạng thì sao?
  • Làm thế nào để một cuộc gọi chức năng ảo xảy ra, ở mức độ thấp? Nói về các hoạt động lắp ráp như đọc một giá trị trong bộ nhớ và nhảy đến một địa chỉ.
  • Biết về truyền kiểu C, static_cast và Dynamic_cast giữa các con trỏ tới các loại có mối quan hệ thừa kế khác nhau. Ví dụ, cả lớp B và C đều xuất phát từ lớp A. Điều gì xảy ra khi bạn cố gắng chuyển từ A * sang B * (hoặc B * sang C *) bằng cách sử dụng các phôi này? (Tôi đề cập vì tôi không nghĩ C # thậm chí sẽ cho phép các diễn viên cụ thể này.)
  • Tại sao nó là khủng khiếp để vượt qua một vector stl theo giá trị, thay vì tham chiếu? (Tôi đề cập vì hầu hết các loại trong C # là các loại tham chiếu và do đó về cơ bản không thể mắc loại lỗi này trong C #.)
  • Cấu trúc hoặc chức năng thân thiện với bộ đệm có nghĩa là gì? Tại sao một cấu trúc của mảng có thể hoạt động tốt hơn một mảng cấu trúc?
  • Hiểu heap, stack và bộ nhớ tĩnh. Nếu một đối tượng được phân bổ mới, nó sẽ sống ở đâu trong bộ nhớ của tiến trình? Còn một biến cục bộ thì sao? Một biến toàn cầu?
  • Rò rỉ bộ nhớ là gì? Một số thực hành tốt nhất để tránh chúng là gì? (Tôi đề cập vì không có xóa trong C #!)
  • Làm thế nào bạn sẽ gỡ lỗi một sự cố vi phạm truy cập bộ nhớ? Còn nếu sự cố xảy ra trong một số thư viện phần mềm trung gian mà bạn không có mã nguồn thì sao?

1
Repost: Tôi đã biết sự hữu ích của việc biết con trỏ vtable ở đâu trong bộ nhớ vì tôi gặp phải một lỗi liên quan đến điều đó trước đây . Tuy nhiên, làm thế nào là câu hỏi thứ 2 hữu ích? Làm thế nào để biết "các hoạt động cấp độ lắp ráp như đọc một giá trị vào bộ nhớ" làm cho một lập trình viên C ++ có thẩm quyền?
bobobobo

Cuộc phỏng vấn Blizzard của tôi cho vị trí thực tập UI của WoW đã chạm vào điểm 1, 2, 3 (ở mức độ thấp hơn), 5 và 7. Anh ấy cũng đặt câu hỏi về gỡ lỗi / kiểm tra (tương tự như điểm 8) Tôi nghĩ rằng câu trả lời này là chính xác thậm chí trong trường hợp chung cho các công ty phát triển trò chơi cấp trên.
Dean Knight

2
@DeanKnight Tôi không nghi ngờ điều đó. Nhưng tôi vẫn muốn biết làm thế nào OP nghĩ rằng loại câu hỏi đó làm cho ai đó trở thành một lập trình viên C ++ giỏi (câu hỏi ban đầu là làm thế nào để trở thành một lập trình viên C ++ tốt hơn) thay vì chỉ giúp ai đó trả lời phỏng vấn.
bobobobo

2
Bạn có vẻ hoài nghi, bobobobo, nhưng liên kết của bạn về lỗi con trỏ vtable là một ví dụ tuyệt vời về cách biết nội bộ của các cuộc gọi chức năng ảo là hữu ích. Hãy xem xét một lỗi tương tự trong đó, thay vì con trỏ vtable là null , đó là rác . Một cách để nhận ra rác thải của nó là bước qua việc phân tách cuộc gọi chức năng ảo và thấy chương trình của bạn không đi đến đâu thay vì đi đến một vtable hợp lệ hoặc một phương thức hợp lệ.
Eric Undersander

1

Những gì Eric nói. Tôi cũng sẽ thêm để tránh "mới" khi nó không cần thiết. Nó rất phổ biến trong C # nhưng được coi là thực tiễn tồi trong C ++ 11 và cũng chậm hơn so với phân bổ ngăn xếp và nguy hiểm hơn vì bạn phải tự giải quyết nó.

Tôi cũng sẽ cẩn thận với những cuốn sách cũ, họ dạy những cách làm cũ. Cá nhân tôi thích các diễn đàn / trang web đáng tin cậy, stackoverflow / isocpp.


Cảm ơn. Tôi đang tìm kiếm những lời khuyên / khuyến nghị rộng hơn, tổng quát hơn về những việc cần làm, hơn là những đặc điểm ngôn ngữ cần nghiên cứu.
spaceOwl

"Tránh new" thực sự không phải là một khuyến nghị hợp lý. Bạn sử dụng newkhi bạn có con trỏ. Nếu class Derived : Base, thì a Base var = Derived();là bất hợp pháp, nhưng Base *var = new Derived();là hợp pháp. Vì vậy, bạn cần con trỏ để có được đa hình để làm việc đúng, rất nhiều.
bobobobo

Có, nhưng bạn có thể sử dụng std :: unique_ptr để thực hiện đa hình và tránh con trỏ trần (mặc dù bạn vẫn sẽ có từ khóa mới trong hàm tạo unique_ptr)
Eric B

Tôi xin lỗi, tôi đã làm sai trong nhận xét trên. Base var = Derived() sẽ hoạt động , nhưng nó sẽ bị cắt và, không biết đến bạn, thông tin bị mất var. Để khắc phục vấn đề cắt lát, bạn có thể sử dụng con trỏ.
bobobobo
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.