Tại sao C / C ++ được ưa thích cho các nhà phát triển trò chơi?


14

Một số người nói rằng nó cung cấp nhiều quyền kiểm soát hơn cho các nhà phát triển, nhưng chính xác thì điều gì có thể được kiểm soát thông qua C ++ mà không thể kiểm soát được bằng Java?

Câu trả lời:


21

Java chạy trong một máy ảo, trong khi C ++ được chạy trực tiếp trên phần cứng. Điều này có nghĩa là bạn có nhiều quyền kiểm soát hơn về bộ nhớ của bạn và những gì được thực hiện với nó trong C ++.

Java là một ngôn ngữ được thu thập rác. Bạn không có quyền kiểm soát trực tiếp trên bộ nhớ của bạn. Bạn có thể phân bổ các khối bộ nhớ mới, nhưng bạn không có quyền kiểm soát (tốt) khi nó bị xóa. Trình thu gom rác kiểm tra từng phần bộ nhớ bạn đã phân bổ cho từng khung x và xác định xem đó có phải là rác hay không.

Đối với các trò chơi này có thể là thảm họa. Cứ sau vài khung hình, một số trình thu gom rác lại xuất hiện để kiểm tra từng phân bổ bạn đã thực hiện để xem liệu nó có còn được sử dụng không? Nói về một sự chậm lại!

Thứ hai, hầu hết các thư viện chúng tôi sử dụng đều được viết bằng C hoặc được viết bằng C ++. Tôi đang nói về Scaleform, công cụ vật lý Havok, PhysX, SpeedTree, v.v ... Tất cả các gói chuyên nghiệp, được sử dụng rộng rãi trong ngành. Nếu một ngôn ngữ khác muốn trở thành vua, tốt hơn là hỗ trợ họ.

Quan điểm cá nhân của tôi là Java thực sự tốt cho các ứng dụng và ứng dụng trên máy tính để bàn, nhưng không phải cho các trò chơi. Java có rất nhiều công cụ hay dành cho nhà phát triển và về mặt lý thuyết nó có thể chạy trên bất kỳ nền tảng nào có triển khai Máy ảo Java, nhưng tôi vẫn thích C ++ hơn vì tôi cần điều khiển bộ nhớ của mình. Đặc biệt là khi bạn bắt đầu làm việc với các cấu trúc dữ liệu kỳ lạ (cây đỏ đen, danh sách liên kết đôi, v.v.), nó sẽ giúp giữ một cái nhìn tổng quan tốt về tất cả các phân bổ bộ nhớ của bạn.

Tôi không nói: không sử dụng Java. Tôi đang nói: nghĩ về lý do tại sao bạn sử dụng Java. Minecraft được xây dựng bằng Java, vì vậy chắc chắn có thể xây dựng các trò chơi bằng Java. Nhưng nó có phải là một game hay hơn không, nếu nó được xây dựng trong C ++? Chà, chắc chắn sẽ không rẻ đến mức để nó chạy trên ba công cụ lớn (Windows, MacOS, Linux), nhưng ngay cả như vậy, nó đã gặp phải rất nhiều lỗi cụ thể về nền tảng trong quá trình phát triển của nó, những lỗi mà Java không thể thực hiện được kết thúc.

Hiện tại có rất nhiều khung C ++ dành cho các lập trình viên mới bắt đầu. Thực sự không có lý do gì để không học nó, đặc biệt nếu bạn muốn tiếp tục sự nghiệp của mình trong ngành.


1
Chỉ là một nitpick, nhưng trong hầu hết các môi trường hoạt động, mã gốc chạy trong một máy ảo. Java chạy trong một máy ảo bên trong một máy ảo.
Skyler Saleh

1
@RTS: Sẽ hơi khó khăn khi gọi op -> micro-op dịch một máy ảo, nếu đó là những gì bạn đang làm.

Không, tôi đã nói về máy ảo mà tất cả các ứng dụng được đưa vào bởi các hệ điều hành hiện đại để cho phép đa nhiệm an toàn. Điều này xảy ra trên HĐH chạy trên các kiến ​​trúc không có micro-op (RISC). Điều này bao gồm bộ nhớ ảo, ngắt phần mềm, hệ thống để truy cập phần cứng đồng thời, bộ lập lịch hệ điều hành và xử lý tệp đăng ký.
Skyler Saleh

@RTS Tôi không chắc rằng cách ly nhiệm vụ thực sự đủ điều kiện là một VM. Đó là một RM (Máy thật) với một số bảo vệ được tích hợp. Không có lớp trừu tượng hướng dẫn rõ ràng giữa tìm nạp / thực thi. Trình biên dịch và trình liên kết tạo mã có thể định vị lại theo yêu cầu. CPU cung cấp hỗ trợ phần cứng cho phần lớn việc này - giúp loại bỏ khía cạnh "ảo".
3Dave

2

Câu trả lời ngắn: C ++ biên dịch thành mã gốc, do đó hiệu năng phụ thuộc vào nhà phát triển, không phải thời gian chạy hay VM.

Câu trả lời dài:

C ++ "nhanh hơn" không liên quan gì đến C ++. Hiện tại, đây là một trong số rất ít ngôn ngữ có sẵn được hỗ trợ bởi các công cụ tạo mã độc lập, mã gốc cho nhiều nền tảng.

Trước đây, bạn có thể sử dụng C, C ++, BASIC / 2, Delphi, v.v. và có được các tệp thực thi hiệu quả, độc lập. Sự lựa chọn ngôn ngữ là một vấn đề sở thích cá nhân và lực lượng thị trường.

Ngày nay, giả định rằng "C ++ nhanh hơn" về cơ bản là một lời tiên tri tự hoàn thành, mặc dù LLVM đang ở một vị trí tốt để thay đổi điều đó vì nó làm bất cứ điều gì đi vào trình phân tích cú pháp, như đã từng.

Borland đã đúng: Nhiều ngôn ngữ được phân tích cú pháp, tối ưu hóa đầu tiên được áp dụng, sau đó được chuyển đến một trình biên dịch và trình liên kết phụ trợ chung. Đó là một trong những thành tựu chính của LLVM.

Java được cấu trúc theo cách mà sẽ rất khó thực hiện nếu không có JVM. Thật kỳ lạ, C #, thông thường và không chính xác, được cho là gần tương đương với Java, đã biên dịch thành mã gốc trên một số nền tảng, bao gồm cả iOS.

Đầu danh sách Giáng sinh của tôi? Một cỗ máy thời gian quay trở lại và thêm các thuộc tính, xử lý ngoại lệ thực tế và tính đa hình LÀM VIỆC thực tế cho C ++ và loại bỏ cú pháp cú pháp mũi tên lên mà trình phân tích cú pháp có thể tự tìm ra. Tôi đã viết một bộ tiền xử lý trong 10 năm đó. Trước đây vì nó ngu ngốc.


Bạn có nghĩa là truy cập thành viên gián tiếp (như trong h-> x)? Loại bỏ điều đó sẽ làm cho xử lý và các loại con trỏ thông minh ít hữu ích hơn. Nếu bạn lập luận để thay đổi nó chỉ cho con trỏ thô, bạn chỉ làm cho ngôn ngữ không nhất quán.
Lars Viklund

1
Điều gì không hoạt động về tính đa hình của C ++?
Casey

@LarsViklund vâng, ý tôi là vậy. Nhưng, trong khi địa chỉ, trình duyệt và các toán tử thành viên (&, *, ::, -> ...) đều có ý nghĩa khác nhau, hầu hết thời gian có thể suy ra kết quả drsjted từ ngữ cảnh. Mọi thứ có thể đã được đơn giản hóa lên phía trước, như được thực hiện bằng các ngôn ngữ khác. Một điểm dính nhỏ, nhưng một điểm có khả năng tăng độ phức tạp của mã (và do đó phát triển thời gian và chi phí).
3Dave
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.