STL cho các trò chơi, phải hay không? [đóng cửa]


144

Mỗi ngôn ngữ lập trình đều có thư viện chứa các thuật toán, thuật toán và các công cụ hữu ích khác. Với các ngôn ngữ như C #, Java và Python, thực tế không thể sử dụng ngôn ngữ mà không có lib chuẩn.

Tuy nhiên, trên nhiều trò chơi C ++ mà tôi đã làm việc, chúng tôi hoàn toàn không sử dụng STL, sử dụng một phần rất nhỏ của nó hoặc sử dụng triển khai của chúng tôi. Thật khó để biết liệu đó có phải là một quyết định đúng đắn cho các trò chơi của chúng tôi hay chỉ đơn giản là do sự thiếu hiểu biết về STL.

Vậy ... STL có phù hợp hay không?



1
Yup, đó là ý tôi muốn nói là "đã sử dụng triển khai của chúng ta". :)
khoan hồng

3
Nếu bạn có cơ hội tìm và mua Đá quý lập trình trò chơi hay nhất, hãy làm điều đó. Có một tiêu đề bài viết "Sử dụng STL trong lập trình trò chơi" của James Boer, ArenaNet, nơi anh ấy thực hiện một trường hợp thực sự tốt khi sử dụng STL.
chiguire

Trên thực tế, sử dụng Java mà không có lib tiêu chuẩn của nó là khá dễ hiểu, nó được gọi là J2ME: p
Bart van Heukelom

1
Câu hỏi tuyệt vời!
Alan

Câu trả lời:


191

Quay lại khi tôi làm việc trong lĩnh vực phát triển game chuyên nghiệp, STL còn quá non nớt và bồng bềnh. Nhưng đó là> 10 năm trước.

Bây giờ tôi làm việc trong mô phỏng quân sự, có yêu cầu hiệu năng thậm chí còn khó khăn hơn (như tốc độ khung hình không bao giờ có thể xuống dưới một số FPS). Trong mô phỏng quân sự, STL được sử dụng ở mọi nơi.

Một số người nói với bạn không sử dụng STL sử dụng lập luận rằng nó không phải luôn luôn là giải pháp hoàn hảo hoặc thậm chí là tốt nhất cho vấn đề. Nhưng đó không phải là một câu trả lời cho câu hỏi. Câu hỏi nên là: Có điều gì đó vốn đã sai khi sử dụng STL trong các trò chơi? Tôi muốn nói là không, STL hầu hết thời gian là một triển khai tốt hơn so với những gì người dùng sẽ tự mình nghĩ ra.

Chỉ cần chắc chắn rằng bạn biết cách sử dụng STL và sử dụng nó trong trò chơi của bạn. Đọc một số sách và xem mã triển khai trong STL bạn đang sử dụng.


49
Đây là lời khuyên khá vững chắc. Meme "STL chậm" không đúng trong ít nhất năm năm và có lẽ lâu hơn nữa. Nó sẽ tiếp tục tồn tại, giống như "Java chậm" và ".NET chậm", cho đến khi mọi người thấy rõ rằng nó không còn là vấn đề nữa. STL giúp bạn viết các chương trình tốt hơn; Tôi đã đi xa để nói rằng không sử dụng nó, trong hầu hết các trường hợp (ngoài 0,1% ở đâu đó), là vô trách nhiệm. (Các tuyên bố rằng nó không phù hợp với một miền vấn đề nhất định thường là một bản cáo trạng về cách giải quyết vấn đề, chứ không phải bản thân STL. Khắc phục mã của bạn , folks.)
Ed Ropple

5
@Ed Ropple: Tôi nghĩ rằng vấn đề không phải là STL không phù hợp với một vấn đề nhất định, vấn đề là nó phù hợp với quá nhiều vấn đề khiến mã trong đó quá phức tạp. Thật đáng sợ khi mọi người sử dụng quá mức STL và tôi nghĩ đó là một trong những nguyên nhân khiến rất nhiều người (bao gồm cả bản thân tôi) không sử dụng nó. Giống như một ví dụ mà tôi đã thấy cách đây không lâu, nơi câu hỏi là làm thế nào để có được số lớn nhất trong 3 số, một trong những câu trả lời là đẩy chúng vào một std :: vector và sau đó std: sắp xếp nó. Điều đó chắc chắn buộc một giải pháp không cần thiết đối với một vấn đề rất đơn giản.
Simon

22
@Simon: với tất cả sự tôn trọng, ví dụ cuối cùng là dấu hiệu của sự vô cảm và không liên quan gì đến STL ... người đó sẽ làm tương tự trong bất kỳ ngôn ngữ nào khác với các danh sách có thể được sắp xếp. Đó là suy nghĩ của anh ấy đã bị phá vỡ.
ggambett

@EdRopple cố gắng triển khai trình phân tích cú pháp STL cho các tệp hình ảnh PPM (tổng cộng ít hơn 100 dòng mã nếu chỉ nhắm mục tiêu P6 hoặc P3). Một nửa mã kết quả chỉ dành cho việc bỏ qua các dòng bình luận vì STL không cung cấp một cái gì đó nhưif(stream.nextCharacter() == '#') stream.skipLine();
GameDeveloper

@DarioOO Tôi không biết định dạng tệp đó, nhưng đó là những gì bộ điều hợp luồng và bộ lọc dành cho. Tôi đã viết nhận xét đó năm năm trước, tâm trí (và đôi khi nó cứ quay trở lại!), Nhưng những ngày này tôi viết về bất cứ điều gì không siêu, cực kỳ quan trọng trong một phong cách dựa trên biến đổi và chức năng như bạn. đang mô tả rơi ra khỏi vấn đề. Tôi thực sự không quan tâm nhiều đến số lượng dòng (và IMO cũng như bạn), tôi quan tâm đến tính chính xác của việc triển khai, sau đó là sự rõ ràng, sau đó là hiệu suất và sau đó là những thứ như độ dài mã.
Ed Ropple

63

Tôi sẽ nói rằng, ngoài đỉnh đầu của tôi, tốt hơn là sử dụng STL trừ khi bạn biết chính xác lý do tại sao bạn không muốn sử dụng nó.

Đây là điều về STL: nó được phát triển bởi những người thông minh hơn bạn. Điều đó không có ý định gây khó chịu hay bất cứ điều gì, chỉ là STL được phát triển bởi những người có công việc thực sự xây dựng STL. Nó sẽ thực sự nhanh như nền tảng có thể cho phép và nói chung sẽ mạnh hơn nhiều so với giải pháp cuộn tại nhà (và điều này cũng đáng lo ngại nếu không phải lo lắng về tốc độ thô - vì nhu cầu trò chơi của bạn mạnh mẽ hơn một chút so với bạn cần tốc độ, cái sau là vô nghĩa nếu không có cái trước).

Những lời phàn nàn rằng STL thi hành một "cái nhìn hạn hẹp về thế giới" tấn công tôi như một chút ngớ ngẩn. Chúng là những container. Họ có một bộ hoạt động hạn chế vì các container có bộ hoạt động hạn chế. Bạn đang làm gì mà không đi đôi với điều này?


4
Tôi không nghĩ ai đó phải giải thích lý do tại sao họ không nên sử dụng STL. Cũng không đồng ý với toàn bộ 'sử dụng nó vì họ thông minh hơn bạn'. STL đã được thiết kế xung quanh một cái nhìn cụ thể của một miền vấn đề, không chỉ là container tức là thuật toán, allocators, vòng lặp, đặc điểm vv Đó là đủ công bằng nhưng nó không phải là cách duy nhất nhìn thấy vấn đề miền
zebrabox

2
Vì vậy, bạn muốn mã cuộn tại nhà hơn mã thường được kiểm tra, mạnh mẽ? Miền vấn đề không khác biệt nhiều so với dự án (ngoài các dự án có thể nhúng - ngay cả các bảng điều khiển cũng có triển khai STL tốt trong những ngày này!). Bất kể trò chơi nào, vấn đề của bạn không khác biệt lắm và nếu bạn đang tạo ra thứ gì đó bạn định gửi, bạn có trách nhiệm ngầm để viết mã mạnh mẽ. Là thực hiện lại bánh xe sẽ dẫn đến sự mạnh mẽ và linh hoạt tốt hơn ? Tôi nghiêng về phía "không". Đó không phải là "cách duy nhất" không có nghĩa là nó không vượt trội.
Ed Ropple

20
Tôi muốn nói rằng gamedev là về làm game , nhưng OK. Nếu các giả định của bạn kém đến mức bạn sẽ được khoan vào loại phân bổ tài nguyên đó, thì, vâng, bạn cần phải lùi lại và đánh giá lại chúng. Nhưng bạn cũng có thể tạo ra các ứng dụng nhanh chóng sử dụng STL - và, chắc chắn, bất kỳ triển khai nào khác - khi bạn thực sự biết bạn đang làm gì . Học những gì bạn đang làm> nuôi dưỡng hàng hóa từ chối STL. Không ai nói STL luôn là câu trả lời tốt nhất. Điều tôi đang nói là nếu bạn không thể giải thích tại sao đó không phải là khóa học tốt nhất , bạn nên sử dụng STL.
Ed Ropple

11
Tôi không nghĩ nó khiêu khích chút nào - nó diễn ra theo cách khiến nó dính vào ký ức của ai đó, nhưng đó là một lập trường cực kỳ bảo thủ và thẳng thắn. Tóm lại: những người phát triển STL có kiến ​​thức và được trang bị tốt hơn so với những người nhận thấy rằng họ phải hỏi câu hỏi này. Nếu bạn phải hỏi người khác xem STL có phù hợp hay không, bạn gần như chắc chắn thiếu kiến ​​thức về miền cụ thể để chuẩn bị đầy đủ giải pháp cuộn tại nhà.
Ed Ropple

4
"Nó sẽ diễn ra nhanh như thực tế mà nền tảng có thể cho phép". Đây là một sự không chính xác, vì nhiều nhà cung cấp trình biên dịch không thể bận tâm viết lại STL để nó thực sự sẽ làm giảm hiệu suất cao nhất trong kiến ​​trúc cụ thể. STL không đảm bảo bất cứ điều gì về các đặc tính hiệu suất ngoại trừ O. O lớn tuy nhiên có thể hiệu quả hoặc không hiệu quả như nhà cung cấp trình biên dịch muốn thực hiện.
Kaj

35

Tôi đã thấy rất ít lý do để không sử dụng STL cho các trò chơi.

Đối với các vấn đề cấp phát bộ nhớ, nhiều người không biết điều này nhưng bạn có thể viết các cấp phát tùy chỉnh cho các lớp chứa STL của mình. Phân bổ về cơ bản là các lớp chính sách bạn chuyển vào các mẫu của bạn để xác định cách phân bổ được thực hiện. Sử dụng những thứ này bạn thường có thể giải quyết mọi vấn đề về bộ nhớ có vấn đề trên nền tảng bạn chọn.

Tất nhiên, nếu bạn đang sử dụng STL và làm những việc ngớ ngẩn như ánh xạ các chuỗi thành các loại lớn, không phải con trỏ, thì bạn sẽ gặp vấn đề lớn hơn.


thực sự sử dụng các loại con trỏ không lớn trong bản đồ là một trường hợp sử dụng tốt vì các bản đồ stdlib có yêu cầu không làm mất hiệu lực các trình lặp mà buộc thực thi sử dụng các con trỏ và các phần tử được ánh xạ riêng lẻ. Giải pháp tốt nhất cho các trò chơi là sử dụng google::sparse_maphoặc tự viết.
v.oddou

Tại sao bản đồ không dày đặc?
Nhà phát triển GameD

23

STL mặc định có một số vấn đề hợp lý gây khó khăn khi sử dụng với các trò chơi, đặc biệt là khi căn chỉnh bộ nhớ.

Một biến thể tùy chỉnh như EA STL được thiết kế đặc biệt cho các trò chơi và có thể giúp bạn có hiệu suất bộ nhớ và khả năng sử dụng bảng điều khiển tốt hơn nhiều. Nó đã trở thành mã nguồn mở vào năm 2016, theo điều khoản BSD-3, với kho lưu trữ trên GitHub .


19
Các vấn đề với việc sử dụng bộ nhớ và trò chơi của STL thường có thể được giải quyết bằng các lớp cấp phát tùy chỉnh. Thật vậy, ở công việc trước đây của tôi, lớp vectơ "tùy chỉnh" của chúng tôi chỉ là một lớp bao bọc mỏng xung quanh std::vectorphân bổ mặc định.
Blair Holloway

1
@Blair Holloway: "Các bộ cấp phát tùy chỉnh là dựa trên lớp, không dựa trên cá thể. Phân bổ được yêu cầu để xây dựng và phá hủy các đối tượng cũng như phân bổ chúng. Điều này buộc phải trộn lẫn hai khái niệm riêng biệt: phân bổ và xây dựng. Đây chỉ là một số không may là vấn đề với người phân bổ stl. " EA STL đưa ra một số lý do hợp lệ hơn tại sao các bộ cấp phát STD không tốt. Đó không chỉ là "thời tiết hay không họ có thể bị ghi đè".
Simon

@Simon - Tôi sẽ không tranh luận rằng hệ thống phân bổ của STL là hoàn hảo, bởi vì nó không phải vậy. Chúng tôi đã mất một thời gian dài để tìm ra giải pháp hiệu quả. Những gì tôi đang nói là trong một số trường hợp, nó tốt để có được một hoàn toàn khả thi, trò chơi thân thiện với giải pháp sử dụng STL và một chút công việc với allocators tùy chỉnh.
Blair Holloway

@Simon - Để giải thích: trong khi STL có thể cồng kềnh, thì đó là một đoạn mã được kiểm tra rất tốt và không có lỗi; nếu bạn có thể sử dụng nó, bạn sẽ tiết kiệm được hàng giờ để gỡ lỗi một giải pháp tùy chỉnh. Công việc hiện tại của tôi tránh STL ủng hộ các nhà phân phối sản xuất tại nhà và tôi đã phải dành thời gian để gỡ lỗi và tái cấu trúc một số mã đó, vì nó không ở cùng mức độ trưởng thành như STL.
Blair Holloway

1
@Simon: Tôi đến bữa tiệc muộn một chút, nhưng tôi tò mò liệu bạn có đưa ra một ví dụ cụ thể về ý của bạn không. Một ví dụ tốt về việc giải quyết một vấn đề cụ thể theo cách mà STL quá chung chung để giải quyết hiệu quả là gì?
Bánh nướng

21

Dưới đây là những gì Mike Acton (Giám đốc động cơ tại Insomniac Games of Spyro the Dragon, Ratchet & Clank và Kháng chiến nổi tiếng) đã nói về điều này khi được hỏi ở đây . Lưu ý rằng anh ta đã được hỏi về cả STL và Boost nói chung liên quan đến việc sử dụng trong nhà phát triển trò chơi.

STL / Boost, nó có thuộc về gamedev không? Nếu chỉ là một phần của nó, những cái nào?

Bạn đang hỏi về hai điều khác nhau ở đây, phải không? STL và Boost, riêng biệt. Nhưng thực sự, câu trả lời của tôi là như nhau: Không có gì sai với mỗi người, nhưng tôi không khuyến khích họ sử dụng. Sử dụng một trong hai khuyến khích mọi người phù hợp với giải pháp cho một vấn đề thay vì tìm giải pháp cho một vấn đề. Giải pháp phải luôn phù hợp với dữ liệu trong tay và các ràng buộc của phần cứng, v.v ... Cả STL và Boost đều có tầm nhìn cực kỳ hẹp về "thế giới" và việc sử dụng phù hợp của chúng bị hạn chế. Thực sự, tôi không khuyến khích họ vì họ dẫn các lập trình viên đi sai hướng ngay lập tức, tôi thường nói nếu bạn cảm thấy như bạn cần một trong những điều mà bạn có thể không thực sự hiểu vấn đề mà bạn '

Tôi cũng nhận thấy rằng hầu hết các nhà phát triển game chuyên nghiệp đều nỗ lực hướng tới C nhiều hơn C ++.


18
Tôi không đồng ý về việc phấn đấu nhiều hơn đối với C. Phần lớn các nhà phát triển trò chơi cũng như các nhà văn SDK sử dụng C ++. Trên thực tế, người dùng C chính cuối cùng là id và thậm chí cả Carmack đã chuyển sang C ++ ngay bây giờ ...
Goz

82
Nhận xét của ông Acton có vẻ sơ sài. Nói chung, STL phù hợp với những vấn đề đó. Nếu bạn đang cố gắng làm điều gì đó theo cách mà cách tiếp cận STL có vẻ "sai", thì có lẽ nên đánh giá lại cách tiếp cận của bạn và xem bạn có thực sự làm theo cách thông minh không. Theo kinh nghiệm của tôi, thường xuyên hơn không, có lẽ bạn không. (IMO thông minh hơn rất nhiều, để giải quyết vấn đề bằng cách hiểu rõ vấn đề trong bối cảnh các công cụ của bạn hơn là vứt bỏ các công cụ của bạn chỉ để làm lại từ đầu.)
Ed Ropple

50
Trải nghiệm của tôi với STL đã gần như ngược lại. Đó là hiệu quả và tiết kiệm thời gian. Nếu bạn cảm thấy cần phải cuộn thư viện mẫu hoặc thư viện container của riêng mình, thì tốt thôi. Nhưng đừng giả vờ rằng STL (hoặc boost, cho vấn đề đó) là xấu. Tôi đã sử dụng STL rộng rãi trên các trò chơi iPhone, Nintendo DS, Wii, PC, Mac và Xbox thương mại. Mỗi lần tôi bị buộc phải sử dụng thư viện "tốt hơn" của người khác, tôi thấy nó thiếu và có lỗi.
CẦU

5
Nó hoạt động tốt trên DS như trên mọi nền tảng khác mà tôi đã sử dụng. Tôi đã sử dụng STL trên tất cả các mã UI và AI. Trò chơi là ds.ign.com/articles/832/832147p1.html . Tôi đang làm việc tại một studio nhỏ là một phần của Amaze, một phần của Foundation 9.
BRaff

7
Mike là tất cả về dữ liệu. Nhìn vào dữ liệu cho thấy phương pháp tốt nhất để chuyển đổi dữ liệu. Áp dụng nó trên quy mô lớn và bạn có lập trình. Trong bối cảnh này, những lời chỉ trích của ông có rất nhiều ý nghĩa. STL (và các mẫu thiết kế) đề nghị thay vì kiểm tra dữ liệu để đưa ra giải pháp, chúng tôi kiểm tra các giải pháp trong túi thủ thuật của chúng tôi để tìm ra giải pháp phù hợp với dữ liệu. Tôi không có ý định nói cho Mike, nhưng tôi tin rằng anh ta sẽ đề xuất rằng cách tiếp cận vấn đề này là ngược, và có khả năng dẫn đến các giải pháp không hiệu quả hoặc cồng kềnh.
Dan Olson

19

Nếu bạn thấy mình đang viết lại một cái gì đó đã tồn tại trong STL, vì bất kỳ lý do gì, hãy dừng lại . Sử dụng STL.

STL đã được tối ưu hóa qua nhiều năm phân tích và thời gian, và đó là một sự đánh cược an toàn có lẽ bạn sẽ không viết một cái gì đó hiệu quả hơn. Điều đó không có nghĩa là bạn nên sử dụng STL khi có thể có giải pháp đơn giản hơn (nghĩa là sử dụng một mảng khi bạn có số lượng vật phẩm đã biết, không phải là danh sách stl ::), nhưng nếu bạn đang viết bản đồ thực hiện của riêng mình ( cấu trúc dữ liệu cơ bản, không phải bản đồ thế giới trò chơi), bạn đang làm sai.


7
map <> gần như không bao giờ là thứ bạn muốn sử dụng cho mọi thứ bộ nhớ hoặc CPU hiệu quả trong bối cảnh của một trò chơi. hash_map <> hầu như luôn là lựa chọn tốt hơn, mặc dù hiệu suất của hash_map khác rất nhiều với nhà cung cấp. Nếu bạn đang xây dựng một trò chơi dành cho bảng điều khiển hoặc các tính năng có thể mở rộng mạng, STL hoàn toàn có thể quá chậm hoặc cồng kềnh cho mục đích của bạn.
Ben Zeigler

3
unordered_map <> hiện có sẵn rộng rãi và có các yêu cầu hiệu suất cực kỳ nghiêm ngặt trong dự thảo TR1 hiện tại. (Theo quan điểm của sự quá mức tôi nghĩ - nó thậm chí còn cấm băm mở, và mặc dù điều đó thường chậm hơn, tôi không nghĩ rằng nó nên bị cấm theo tiêu chuẩn.)

5
STL cung cấp các thuật toán cũng như các thùng chứa. Không bao giờ có lý do để không sử dụng phiên bản stl của một thuật toán. Ví dụ, std::sortthường sử dụng introort bên dưới, cực kỳ nhanh và phức tạp đến mức bạn sẽ không muốn tự mình làm điều đó.
deft_code

sự thật là unordered_mapC ++ 11 hoặc boost đều quá chậm, điều bạn muốn là một bản đồ băm địa chỉ mở, chẳng hạn như google :: spzzy_map hoặc của riêng bạn.
v.oddou

16

STL có phù hợp với game không? Chắc chắn rồi. Trò chơi là những phần mềm phức tạp, STL cung cấp các tính năng giúp quản lý sự phức tạp, vì vậy nó rất tốt.

Nó có phù hợp với nền tảng của bạn không? Không cần thiết. Nếu bạn đang viết cho một giao diện điều khiển thì bạn phải rất cẩn thận về việc sử dụng bộ nhớ và bộ nhớ cache. STL không làm điều này rất dễ dàng.

Tôi nghĩ rằng tất cả quá thường xuyên chúng ta nhầm "trò chơi" với "trò chơi thời gian thực hiệu suất cao chạy trên phần cứng nhúng hoặc bespoke", nhưng điều quan trọng là phải phân biệt. Nếu bạn đang viết một trò chơi Windows không cố chạy ở chế độ toàn màn hình với tốc độ 60fps không đổi thì không có lý do gì để tránh các công cụ mà thư viện chuẩn cung cấp cho bạn.


10

Tôi biết điều này là rất muộn cho bữa tiệc, nhưng thời gian thay đổi và câu trả lời vẫn ở xung quanh. C ++ 11 có những thay đổi khá lớn, nhiều trong số đó là để tăng hiệu suất của C ++ và thư viện chuẩn. Có vẻ như những người không sử dụng STL hoặc Boost, có xu hướng không theo kịp các tiêu chuẩn mới, khiến các giải pháp quay vòng tại nhà thiếu các cải tiến quan trọng, tất nhiên điều này không phải luôn luôn như vậy.

Tôi đã sử dụng STL cho mọi dự án từ giữa những năm 90 đến nay, ngoại trừ một thời gian ngắn tại EA. Tôi nghĩ rằng bên chống STL có một số lý do hợp lý để không sử dụng nó. Những thứ đó phần lớn đã biến mất. Phân bổ tùy chỉnh là một giải pháp, sử dụng dự trữ là một giải pháp khác và không vượt qua mọi thứ theo giá trị là một phần ba, nhưng những điều này khá đơn giản và bất kỳ lập trình viên nào cũng nên biết những điều này. Quan trọng hơn là việc sử dụng các thuật toán. Người viết trình biên dịch biết chính xác những gì một for_each () làm và có thể tối ưu hóa mã. Điều đó không thể xảy ra với một vòng lặp nhà. for_each () trên một đối tượng const thậm chí còn tốt hơn. Microsoft tối ưu hóa for_each theo nhiều cách bao gồm cả tuần tự hóa. Họ cũng có thư viện AMP cóallel_for_each (). Nếu bạn có cơ hội, hãy nói chuyện với các kỹ sư biên dịch về điều này. Trình biên dịch bảng điều khiển sẽ tối ưu hóa những gì được sử dụng, vì vậy nó ' sa một chút của một vấn đề gà và trứng. Microsoft đang rất nặng nề với C ++ 11 và XBox tiếp theo sẽ không khác. Tôi không biết gì về PS4, chúng tôi chưa có ai.

Cấp phát tùy chỉnh là một cách để xử lý vấn đề bộ nhớ, nhưng một tùy chọn khác (thường bị bỏ qua) là sử dụng lớp mới và xóa. Tăng hiệu suất rất lớn có thể có cách này.

Quan niệm rằng Boost và STL có quan điểm hạn hẹp trong việc giải quyết vấn đề là sự điên rồ thuần túy. Tôi choáng váng khi có bao nhiêu thứ trong STL và Boost có thể tùy chỉnh thông qua các đặc điểm và chính sách. Tìm trường hợp chuỗi độc lập so sánh làm ví dụ.

Về thời gian liên kết dài và phình mã, mẫu extern mới sẽ giúp với điều này. Nói chung tôi thấy thời gian biên dịch dài đến từ khớp nối thừa và lạm dụng pch.

Lý do thuyết phục nhất để sử dụng STL so với âm hộ là có hàng triệu người có thể giúp bạn với STL. Như mọi khi, không tối ưu hóa sớm và kiểm tra, thử nghiệm, kiểm tra.


ý tưởng thú vị; bạn có ý nghĩa gì khi " sử dụng lớp mới và xóa "? Bạn có nghĩa là, tăng tốc một quá trình bằng cách sử dụng các đối tượng đã có trong heap?
johnbakers

9

Đây là một chủ đề nóng trong phát triển trò chơi. Cá nhân tôi không khuyên dùng nó, ngoại trừ EASTL như đã đề cập ở trên. Tôi có hai vấn đề chính với STL (về mặt kỹ thuật là "Thư viện chuẩn C ++", vì STL không còn là tên) trong các trò chơi. 1) Cấp phát bộ nhớ động thường lãng phí rất nhiều thời gian chạy trong các trò chơi khi sử dụng STL. 2) Việc sử dụng STL khuyến khích cách tiếp cận mảng cấu trúc trong kiến ​​trúc trò chơi, trong khi cách tiếp cận cấu trúc của mảng là thân thiện với bộ đệm hơn nhiều.


Như đã đề cập ở nơi khác, bạn có thể cung cấp các cấp phát tùy chỉnh cho các lớp container - chúng có thể sử dụng các công cụ tự do nếu bạn muốn (các mảng được sắp xếp trước). Các mảng cấu trúc so với cấu trúc của các mảng phụ thuộc rất nhiều vào những gì bạn đang cố gắng thực hiện - không có quy tắc cứng và nhanh nào về cái nào tốt hơn.
Skizz

Tôi đánh giá cao quan điểm của bạn rằng điều quan trọng là phải hiểu rõ vấn đề bạn đang giải quyết. Nhưng với sự tôn trọng, tôi vẫn nghĩ rằng tôi không đồng ý với kết luận của bạn. Mọi vấn đề đều có các kiểu sử dụng không thể biểu thị cho các cấp phát STL tùy chỉnh, nhưng có thể dễ dàng tận dụng trong một thùng chứa tùy chỉnh, chẳng hạn như phân bổ khối cố định được triển khai với một mảng phẳng. Và áp dụng một phép biến đổi cố định trên một mảng các kiểu đồng nhất rất có thể sẽ dẫn đến sự kết hợp bộ đệm tốt hơn nhiều so với việc lặp lại trên một vectơ của các kiểu đa hình và gọi các phương thức ảo.
Terrance Cohen

5

Nó phụ thuộc. Dự án lớn như thế nào, nền tảng nào và dòng thời gian là gì?

Nếu bạn đang làm việc trong một dự án lớn, trên các nền tảng có nguồn lực hạn chế, với thời gian và ngân sách đáng kể, thì bạn có thể tiết kiệm cho mình rất nhiều rắc rối bằng cách tránh địa ngục không thể tránh khỏi sẽ nhìn vào một nửa triệu cơ sở mã dòng xả rác với STL, không thể giữ tốc độ khung hình trên 30, ăn đủ RAM để phù hợp với nhiều tài sản hơn và mất 2 giờ để xây dựng.

Tuy nhiên, trong các tình huống khác, STL và thậm chí Boost có thể rất hữu ích khi được áp dụng phù hợp. Tôi đã làm việc với các tựa game sử dụng lựa chọn STL / Boost và là một giấc mơ tuyệt đối để mã hóa: ít lỗi / rò rỉ hơn và dễ duy trì mã có nghĩa là có nhiều thời gian mã hóa các tính năng mới thú vị hơn! Đối với các dự án sở thích đặc biệt, đó là một chiến thắng lớn trong bộ phận động lực.

Biết khi nào nên giao dịch hiệu suất cho thuận tiện!


1
"Biết khi nào nên giao dịch hiệu suất cho thuận tiện". Đúng. Câu này một mình là một câu trả lời tốt như bất kỳ. Tìm hiểu những gì bạn cần đạt được với trò chơi của mình, tham khảo ý kiến ​​đồng nghiệp và quyết định xem STL sẽ giúp bạn đến đó hay cản trở bạn. Tôi muốn nói rằng nếu bạn không muốn thiết lập thanh cho đồ họa và hiệu suất thế hệ tiếp theo với trò chơi của mình, STL có thể sẽ giúp bạn.
gkimsey

4

IMHO Tôi muốn nói rằng nó phù hợp vì STL đã hoạt động tốt và được tối ưu hóa cho các nhiệm vụ được thực hiện. Bên cạnh đó, bạn đang làm việc trên một trò chơi vì vậy, hãy sử dụng các công cụ bạn có trong tay để giúp cuộc sống của bạn dễ dàng hơn và mã của bạn ít bị lỗi hơn.

Tại sao phải phát minh lại bánh xe khi bạn có thể làm việc trên một thứ khác như AI, trải nghiệm người dùng hoặc tốt hơn; kiểm tra và gỡ lỗi?


2
Trong thực tế, đến cuối dự án, hiệu suất có xu hướng là một vấn đề quan trọng. Nếu bạn sử dụng STL, bạn có rất ít cơ hội để tối ưu hóa bởi vì nó cần các ứng dụng cụ thể của bạn và giải quyết chúng một cách chung chung. Giải quyết các trường hợp cụ thể theo một cách cụ thể (và không có phân bổ bộ nhớ động) hầu như luôn có hiệu suất cao hơn.
Terrance Cohen

2
Nhưng nếu bạn không muốn cấp phát bộ nhớ động, thì bạn không nên sử dụng STL. Đó là loại điểm. Mã của riêng bạn sẽ không tốt hơn, và chắc chắn có thể khá tệ hơn. Các quyết định thiết kế để lạm dụng STL là vấn đề ở đây, không phải là STL, khả năng của mình, hoặc các đặc Perf của nó. Bạn đang tấn công phần sai của vấn đề.
Ed Ropple

4

STL hoàn toàn tốt để sử dụng trong các trò chơi, miễn là bạn hiểu rõ về nó. Động cơ của chúng tôi sử dụng khá rộng rãi và nó chưa bao giờ là một vấn đề. Tôi không có bất kỳ kinh nghiệm nào về phát triển giao diện điều khiển, đây có thể là một câu chuyện hoàn toàn khác, nhưng nó được hỗ trợ tốt trên tất cả các nền tảng PC (Windows / Mac / Linux).

Điều quan trọng nhất là phải hiểu được điểm mạnh và điểm yếu của từng loại container là gì và chọn đúng container cho công việc bạn đang làm.


4

Chủ cũ của tôi đã chuyển từ sử dụng một tập hợp mạnh mẽ các lớp container tùy chỉnh sang STL. Thời gian xây dựng tăng lên và dễ dàng gỡ lỗi đi xuống, cả hai khá đáng kể. Nếu chúng tôi đã bắt đầu từ đầu, STL (có lẽ được sử dụng tốt hơn) có thể có ý nghĩa, nhưng tôi không bao giờ rõ ràng rằng chúng tôi đã đạt được bất cứ điều gì khi chuyển sang STL, điều đó sẽ biện minh cho việc loại bỏ mã hoạt động, nhanh, có thể gỡ lỗi.

Đối với các dự án cá nhân của tôi, việc STL có phù hợp hay không phụ thuộc vào dự án. Nếu tôi đang cố gắng thực hiện một số công việc được tối ưu hóa truy cập bộ nhớ, bộ nhớ và bộ nhớ cache theo kiểu dữ liệu của Mike Acton, thì ít nhất tôi sẽ nghĩ về việc cuộn các cấu trúc dữ liệu tùy chỉnh của riêng mình. Nếu tôi đang tạo mẫu một số thuật toán hoặc trò chơi và không quan tâm đến hiệu suất, khả năng mở rộng, nền tảng đích, v.v. Tôi sẽ tự động lấy STL.


4

2 xu của tôi về điều này là STL hoạt động tốt. Tôi đã phát triển một công cụ trò chơi 3D (không phải chất lượng AAA, nhưng đủ tiên tiến - các loại thực thể theo kịch bản, trình kết xuất hoãn lại, vật lý Bullet tích hợp) cho PC và tôi vẫn chưa thấy container trở thành nút cổ chai chính. Việc sử dụng API 3D không chính xác và các thuật toán kém là mục tiêu tốt nhất (được xác định bằng cách định hình!) Mỗi ​​khi tôi đi vào và cố gắng tăng hiệu suất hơn một chút.


3

Tôi đã xây dựng các trò chơi bằng STL và tôi thích nó, và nó dường như hoạt động tốt.


3

Câu hỏi hay! Một câu hỏi cụ thể hơn là một số yêu cầu phổ biến mà một trò chơi sẽ không thể đáp ứng với STL và Boost.

Theo kinh nghiệm của tôi, các giới hạn bộ nhớ chặt chẽ của phần cứng bảng điều khiển làm cho bất kỳ loại thùng chứa kích thước động nào trở thành một ý tưởng tồi cho dù bộ phân bổ tùy chỉnh của bạn thông minh đến mức nào. Các container không có giới hạn có chủ ý khuyến khích các lập trình viên viết mã không giới hạn các giới hạn của tập dữ liệu của họ. Tùy thuộc vào vô số biến khó theo dõi, bạn có thể vượt quá giới hạn bộ nhớ. Tôi có linh cảm rằng đây là một trong những nguyên nhân chính gây mất ổn định trong các trò chơi hiện đại.

Ngoài ra, việc sử dụng quá mức các mẫu có thể dẫn đến thời gian biên dịch rất dài trong một cơ sở mã lớn và sẽ làm tăng kích thước của tệp thực thi của bạn để nó không còn vừa trong bộ đệm của, ví dụ, lõi phụ trên ps3.

Tuy nhiên, đối với sự phát triển chỉ dành cho PC tôi nghĩ STL và Boost rất tốt. Trong khi các giải pháp trường hợp chung không phải lúc nào cũng lý tưởng, chúng thường đủ tốt. Giải pháp đầu tiên của bạn cho một vấn đề gần như không bao giờ lý tưởng, và bạn cải thiện hoặc thay thế những bất cập cho đến khi nó đủ tốt.


2

STL phù hợp với trò chơi của bạn nếu STL phù hợp với trò chơi của bạn.

Như với tất cả các lựa chọn công nghệ được thực hiện trong quá trình phát triển, bạn cần cân nhắc những ưu và nhược điểm - liệu thư viện của riêng tôi có mang lại cho tôi việc sử dụng bộ nhớ, hiệu suất và năng suất hiệu quả hơn so với việc sử dụng STL không? Có khả năng; mặc dù thật dễ dàng để tạo ra một vectortriển khai sử dụng nhiều bộ nhớ hơn, chậm hơn và đòi hỏi một lượng lớn bảo trì để duy trì chức năng so với những gì đã tồn tại.

Mọi người không nên tránh sử dụng STL trong các trò chơi của mình vì những người khác tránh sử dụng STL trong các trò chơi; họ nên tránh sử dụng nó nếu họ đã cân nhắc tất cả các lựa chọn của mình và họ thực sự tin rằng việc thực hiện khác sẽ cải thiện chất lượng sản phẩm của họ.


2
Tôi đồng ý 100% với phần cuối cùng của nhận xét của bạn, nhưng tôi sẽ đi xa hơn: nếu bạn có thể chứng minh một cách thuyết phục tại sao STL không phải là một lựa chọn tốt, đừng sử dụng STL. Nếu không, làm. Sự sùng bái hàng hóa (mọi thứ từ "oh, nhà phát triển trò chơi sử dụng C ++!" Đến "oh, nhà phát triển trò chơi không sử dụng STL!") Là không lành mạnh. Tuy nhiên, tôi sẽ có một chút vấn đề với đoạn thứ hai của bạn: rất khó có khả năng những người vẫn còn ngây thơ nghĩ rằng thực hiện lại STL là một ý tưởng tốt sẽ xây dựng tốt vectorhơn so với những người STL. Đến lúc bạn có thể làm điều đó, bạn không còn nghĩ rằng mình cần phải làm thế nữa! :-)
Ed Ropple

2

Như với hầu hết các câu hỏi, câu trả lời không bao giờ là "yea hay nay", đen hay trắng. STL phù hợp với một số vấn đề, sử dụng nó cho những vấn đề đó sẽ ổn. Thật sai lầm khi cho rằng nó vô dụng, nhưng cũng là một sai lầm khi cho rằng nó phù hợp để sử dụng trong mọi tình huống.

Vấn đề lớn nhất cần chú ý khi sử dụng STL trong phát triển trò chơi là phân bổ bộ nhớ. Các nhà phân bổ mặc định của STL dường như không phù hợp với các chiến lược phân bổ ưa thích để phát triển trò chơi. Tất nhiên các cấp phát tùy chỉnh có thể được sử dụng, nhưng điều này làm cho toàn bộ ý tưởng bớt hấp dẫn hơn nếu bạn đang cân nhắc có nên thêm STL vào một cơ sở mã không STL hay không.

Thêm vào đó là nếu cơ sở mã của bạn không phải là STL, bạn có thể không có ai đủ quen thuộc với STL hoặc các khái niệm mẫu để triển khai các cấp phát tùy chỉnh một cách chính xác.


2

Tôi nghĩ rằng cuộc thảo luận này có thể được tóm tắt như sau:

mã ứng dụng được viết một cách tầm thường <mã mục đích chung được viết tốt <mã dành riêng cho ứng dụng được viết tốt

Bất cứ ai có giải pháp trồng tại nhà sẽ rơi vào loại 3 chắc chắn biết câu trả lời cho câu hỏi ban đầu cho vấn đề cụ thể của họ. STL rơi vào loại 2. Vì vậy, đối với người cần đặt câu hỏi, " tôi có nên sử dụng STL không", câu trả lời có lẽ là có.


2

STL hoàn toàn phù hợp để sử dụng trên PC, bởi vì hệ thống bộ nhớ ảo tiên tiến của nó cho thấy nhu cầu phân bổ bộ nhớ cẩn thận ít quan trọng hơn một chút (mặc dù người ta vẫn phải rất cẩn thận). Trên bảng điều khiển, với các thiết bị bộ nhớ ảo bị hạn chế hoặc không có bộ nhớ cache cắt cổ, bạn có thể không muốn viết các cấu trúc dữ liệu tùy chỉnh có thể dự đoán và / hoặc hạn chế phân bổ bộ nhớ. (Và bạn chắc chắn sẽ không đi quá xa khi làm điều tương tự trong một dự án trò chơi trên PC.)


1

Tôi nghĩ rằng câu hỏi này thực sự là một câu hỏi không có nội dung lớn hơn - tôi có nên sử dụng X trong Y của mình không? Và cách duy nhất để thực sự trả lời đó là thử nó cho chính mình. Đối với mọi người bạn thấy rằng X hoạt động rất tốt, bạn sẽ tìm thấy ai đó nói điều đó thật kinh khủng. Và cả hai đều đúng - cho dự án của họ.

Điều tuyệt vời về phần mềm, không giống như hầu hết các ngành khác, là bạn luôn có thể thay đổi mọi thứ sau này nếu bạn thấy nó không hoạt động theo cách bạn muốn. Sau này bạn phát hiện ra rằng STL không hoạt động cho bạn trong dự án này? Xé nó ra, đặt một cái gì đó khác vào vị trí của nó. Không thích cách bạn phân chia nhiệm vụ giữa các đối tượng của bạn? Cấu trúc lại. Đừng như thế mà bạn đã sử dụng các đối tượng? Thay thế chúng bằng các phương pháp C thẳng. Không thích mọi thứ được lưu trữ trong các cấu trúc và phương pháp để thao túng chúng? Thay thế chúng bằng các đối tượng C ++.


1
Trong khi bạn đúng, có thể có một hình phạt rất lớn cho việc tái cấu trúc; do đó, đưa ra quyết định trả trước thay vì quyết định tùy tiện sẽ giúp bạn tiết kiệm thời gian về lâu dài.
Alan

1

Tôi nói điều này với STL. Lý do của tôi khá đơn giản:

  1. Bạn không cần STL để viết trò chơi. Thậm chí không lớn.
  2. STL làm tăng đáng kể thời gian biên dịch của bạn.
  3. Thời gian biên dịch lớn dẫn đến ít lần lặp hơn so với sự phát triển của bạn.

Tôi giữ số lần lặp là quan trọng nhất, vì vậy tôi chỉ cần tránh xa STL và bất kỳ kỹ thuật phát triển nào khác làm chậm các lần lặp (như kiến ​​trúc vì lợi ích của nó, hoặc các ngôn ngữ kịch bản cần được biên dịch).

Lặp đi lặp lại tốn kém dẫn đến các nhóm phát triển khổng lồ của những người đang cố gắng hoàn thành công việc với rất ít thực sự xảy ra. Tôi đã nhìn thấy nó và nghe thấy nó, và một trong những thủ phạm dường như là thời gian biên dịch cho các thư viện mẫu.


1
Tôi đồng ý về thời gian biên dịch. Bất kỳ thời gian biên dịch đáng kể nào cũng nhân đôi số lượng công việc bị mất; ví dụ: nếu quá trình biên dịch kéo dài 5 phút, bạn sẽ dành 10 phút để uống cà phê mỗi lần. ;)
Ipsquiggle

Trong khi tôi thấy cả hai mặt của tranh luận này, tôi phải nói rằng tôi rất đồng ý với lập luận của bạn, Richard. +1.
Kỹ sư
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.