Tự động kiểm tra hiệu suất XNA?


8

Tôi đã tự hỏi những cách tiếp cận hoặc suy nghĩ của mọi người về việc tự động hóa thử nghiệm hiệu suất trong XNA. Hiện tại tôi đang xem xét chỉ làm việc trong 2d, nhưng điều đó đặt ra nhiều lĩnh vực mà hiệu suất có thể được cải thiện với các triển khai khác nhau.

Một ví dụ sẽ là nếu bạn có 2 cách triển khai phân vùng không gian khác nhau, một cách có thể nhanh hơn cách khác nhưng không thực hiện một số thử nghiệm hiệu năng thực tế, bạn sẽ không thể biết chắc chắn cái nào (trừ khi bạn thấy mã bị chậm một cách rõ ràng các bộ phận). Bạn có thể viết một bài kiểm tra đơn vị trong một khung thời gian nhất định tiếp tục thêm / cập nhật / xóa các thực thể cho cả hai lần triển khai và xem có bao nhiêu được thực hiện trong mỗi khung thời gian và cái cao hơn sẽ là nhanh hơn (trong ví dụ cụ thể này).

Một ví dụ cấp cao hơn sẽ là nếu bạn muốn xem bạn có thể có bao nhiêu thực thể trên màn hình mà không cần xuống dưới 60fps. Vấn đề với điều này là để tự động hóa nó, bạn sẽ cần phải sử dụng thủ thuật ẩn hoặc một số thứ khác để khởi động một trò chơi giả và hoàn toàn kiểm tra những phần bạn quan tâm và vô hiệu hóa mọi thứ khác.

Tôi biết rằng đây thực sự không phải là một vấn đề đơn giản vì ngay cả khi bạn có thể tự động hóa các bài kiểm tra, thực sự sẽ tùy thuộc vào con người để giải thích nếu kết quả đủ hiệu quả, nhưng là một phần của bước xây dựng, bạn có thể chạy các bài kiểm tra này và xuất bản kết quả ở đâu đó để so sánh.

Theo cách này, nếu bạn đi từ phiên bản 1.1 đến 1.2 nhưng đã thay đổi một số thuật toán cơ bản, bạn có thể nhận thấy rằng nhìn chung điểm hiệu năng sẽ tăng lên, có nghĩa là bạn đã cải thiện hiệu suất tổng thể của ứng dụng, và sau đó từ 1.2 đến 1.3 bạn có thể nhận thấy rằng bạn đã giảm hiệu suất tổng thể một chút.

Vì vậy, có ai đã tự động loại điều này trong các dự án của họ không, và nếu vậy làm thế nào để bạn đo lường sự so sánh hiệu suất của bạn ở mức cao và bạn sử dụng khuôn khổ nào để kiểm tra? Khi cung cấp, bạn đã viết mã của mình để có thể kiểm tra / có thể thử nghiệm được đối với hầu hết các phần, bạn chỉ có thể sử dụng các thử nghiệm của mình làm cơ chế để nhận được một số kết quả hiệu suất ...

=== Chỉnh sửa ===

Để rõ ràng, tôi quan tâm nhiều hơn đến cách tốt nhất để sử dụng các thử nghiệm tự động trong XNA để theo dõi hiệu suất của bạn, không chơi thử nghiệm hoặc đoán bằng cách chạy trò chơi của bạn trên máy một cách thủ công. Điều này hoàn toàn khác với việc xem trò chơi của bạn có thể chơi được trên phần cứng X hay không, nó thiên về việc theo dõi sự thay đổi về hiệu suất khi công cụ / khung công cụ trò chơi của bạn thay đổi.

Như đã đề cập trong một trong các ý kiến, bạn có thể dễ dàng kiểm tra "tôi có thể chèn / xóa / cập nhật bao nhiêu nút trong QuadTreeA trong vòng 2 giây", nhưng bạn phải xem xét các kết quả này mỗi lần để xem nó có thay đổi không, có thể thay đổi tốt và vẫn tốt hơn là chỉ dựa vào chơi nó để xem bạn có nhận thấy sự khác biệt nào giữa các phiên bản không. Tuy nhiên, nếu bạn định đưa Assert vào để thông báo cho bạn về sự cố nếu nó xuống thấp hơn mức cho phép 5000 trong 2 giây, bạn sẽ có một bài kiểm tra dễ vỡ vì nó theo ngữ cảnh đối với phần cứng, không chỉ là việc thực hiện. Mặc dù điều đó được nói rằng các loại thử nghiệm tự động này chỉ thực sự được sử dụng nếu bạn đang chạy thử nghiệm như một loại đường ống xây dựng, tức là:

Thanh toán -> Chạy Kiểm tra đơn vị -> Chạy Kiểm tra tích hợp -> Chạy Kiểm tra hiệu suất -> Gói

Vì vậy, sau đó bạn có thể dễ dàng so sánh các số liệu thống kê từ bản dựng này với bản dựng khác trên máy chủ CI dưới dạng báo cáo thuộc loại nào đó và một lần nữa, điều này có thể không có ý nghĩa nhiều với bất kỳ ai nếu bạn không quen với Tích hợp liên tục. Mấu chốt chính của câu hỏi này là xem mọi người quản lý vấn đề này như thế nào giữa các bản dựng và cách họ thấy tốt nhất để báo cáo. Như tôi đã nói nó có thể chủ quan nhưng vì kiến ​​thức sẽ thu được từ các câu trả lời nên nó có vẻ là một câu hỏi đáng giá.


+1 câu hỏi tuyệt vời. Tôi chưa làm điều này bao giờ, nhưng cần phải sớm.
tro999

Chỉ để làm rõ tôi không thực sự nói về trình biên dịch hoặc các công cụ bên ngoài thực sự, mặc dù đó có thể là một điều bổ sung để giúp chẩn đoán các phần chậm, v.v. Điều tôi nghĩ là sử dụng các bài kiểm tra đơn vị của bạn để cung cấp cho bạn một số bối cảnh như thể bạn cũng đang cải thiện hiệu suất, do đó bạn có thể triển khai một thuật toán mới để tìm đường và ngay lập tức kiểm tra nó một cách tách biệt với phiên bản trước của bạn và so sánh các con số ngay lập tức cho bạn biết rằng bạn đã cải thiện nó hoặc lãng phí thời gian mà không cần phải tích hợp nó vào dự án chính và triển khai nó.
Grofit

câu hỏi của bạn có vẻ hơi bối rối; bạn đang nói về đo lường hiệu suất chung, có thể được thực hiện mà KHÔNG cần kiểm tra; nhưng bạn cũng có thể viết các bài kiểm tra như "kiểm tra X xảy ra trong vòng 3 giây."
tro999

Đúng và "thử nghiệm X xảy ra trong vòng 3 giây" nằm dọc theo đường dẫn bên phải, nhưng thay vào đó là một thử nghiệm như "Tôi có thể chèn bao nhiêu nút vào một cây tứ giác trong 5 giây", kết quả của một lần xây dựng có thể là 10000, và bản dựng tiếp theo có thể là 5000. Khi thấy ngay lập tức, bạn có thể đưa ra quyết định sáng suốt nếu bạn đã đưa ra một vấn đề. Vấn đề đối với tôi là tất cả thông tin này đều tốt, nhưng bạn phải xem nó. Vì việc thêm một xác nhận cho <7500 trong thời gian có vẻ tốt, nhưng nếu bạn chạy nó trên một máy khác thì nó có thể không vượt qua, nhưng trên thực tế, THỰC HIỆN không chậm hơn.
Grofit

Câu trả lời:


2

Tôi hiểu rằng bạn hoàn toàn muốn loại trừ "Chạy trò chơi thực tế", vì vậy về cơ bản, câu trả lời của tôi không đủ tiêu chuẩn. Nhưng có lẽ bạn có thể lấy một cái gì đó từ nó, vì vậy tại sao tôi đăng bài này bất kể:

Đối với luận án thạc sĩ của tôi, tôi có nhiều triển khai độc lập / song song khác nhau để đạt được điều tương tự đối với một số mô-đun của công cụ trò chơi của mình và tôi cần thực hiện một số phép đo hiệu suất. Về mặt kỹ thuật, không có gì ngăn cản tôi chạy trò chơi và nhìn vào những con số được hiển thị trong hồ sơ trên màn hình, nhưng tôi vẫn muốn tự động hóa điều đó bởi vì đó là một quá trình tẻ nhạt để thực hiện mỗi khi thay đổi triển khai của tôi.

Vì vậy, những gì tôi có là đây:

  • Trình lược tả phạm vi (đặt một đối tượng lên ngăn xếp, lấy dấu thời gian khi xây dựng và một khi giải cấu trúc) được sử dụng để đo thời gian thực hiện chức năng / phạm vi quan tâm
  • Một mô-đun lưu trữ một số lượng mẫu được định hình nhất định và bỏ giá trị trung bình trên n mẫu cuối cùng vào một tệp văn bản đơn giản
  • Một dòng lệnh trong trò chơi có thể được sử dụng để bắt đầu trò chơi, tải bản đồ, thay đổi thuật toán được sử dụng trong mô-đun để kiểm tra, thay đổi đường dẫn của tệp kết xuất hồ sơ và nhiều nội dung khác. Dòng lệnh đã nói được thiết lập để kiểm tra một tệp đặc biệt nào đó trong thư mục thực thi và tải nó để thực thi chuỗi được lấy từ nó (như một phương tiện giao tiếp giữa các quá trình rất thô sơ)

Vì vậy, những gì điều này cho phép tôi làm là khởi chạy ứng dụng của mình từ bất kỳ môi trường tập lệnh nửa chừng nào (giả sử, dấu nhắc lệnh của windows thông qua các tập lệnh bó - nhưng tôi thực sự sử dụng Ruby cho mục đích đó), đặt đường dẫn tệp kết xuất, tải bản đồ, để lại nó chạy trong vài phút, thoát khỏi trò chơi đang chạy, đặt đường dẫn tệp kết xuất khác, chuyển thuật toán sang sử dụng, tải lại bản đồ, rửa sạch, lặp lại. Tập lệnh Ruby giao tiếp với trò chơi đang bay bằng cách tạo tệp đặc biệt đó mà mô-đun dòng lệnh đang tìm kiếm và đặt các lệnh mong muốn theo cú pháp mà dòng lệnh hiểu trong đó.

Tôi thực sự không sử dụng tích hợp liên tục vào dự án này ngay bây giờ, nhưng không có gì ngăn cản tôi tạo ra kịch bản Ruby để phân tích các bản ghi hiệu suất được tạo và sản xuất XML tương thích xUnit để giao tiếp với hệ thống CI khi hiệu suất bất ngờ xảy ra đi haywire vì một số lý do và chạy tập lệnh trên mọi bản dựng đầy đủ trên bản dựng sever.

Được rồi, trò chơi của tôi cũng không được viết bằng XNA (đó là C ++ và DirectX đơn giản), cách tiếp cận này cũng không tôn trọng thực tế là bạn không thực sự muốn chạy trò chơi trên máy chủ bản dựng của mình. Nó cũng không linh hoạt như những gì bạn có thể tìm kiếm - nhưng vẫn là một ứng dụng công nghệ thấp, gọn gàng để đo lường hiệu suất tự động có phần thân thiện với CI (với điều kiện là máy chủ xây dựng mạnh mẽ).

Chỉnh sửa: Về khoảng cách tôi đã thực sự thực hiện phương pháp đó - tôi chỉ so sánh các phép đo hiệu suất đạt được từ các triển khai khác nhau của chỉ một mô-đun này. Nhưng toàn bộ hệ thống được thiết lập theo cách cho phép tôi loại bỏ bất kỳ một trong các loại được xác định cho khung cấu hình nhẹ của mình và sử dụng môi trường tập lệnh bên ngoài để diễn giải kết quả theo bất kỳ cách nào có vẻ hữu ích ngay lúc đó. Lấy khía cạnh hồ sơ hiệu suất ra khỏi phương trình, tôi dự định tiếp tục

  • Kiểm tra tính hợp lệ / tính nhất quán của tất cả các tài sản bằng cách tải tất cả các bản đồ chứa tất cả các mô hình / kết cấu / âm thanh và kiểm tra nhật ký động cơ xem có gì bất thường không
  • kiểm tra căng thẳng động cơ và theo dõi nhật ký xem có bất kỳ hành vi bất ngờ nào xảy ra trong khoảng thời gian vài giờ / ngày không

1
Tất cả thông tin tốt, đã cho bạn +1. Từ âm thanh của nó mặc dù mọi thứ bạn đang làm ở trên có thể dễ dàng được thực hiện trong một bài kiểm tra tích hợp các loại. Điều duy nhất bạn cần lo lắng là chế nhạo trò chơi / mô phỏng thực tế. Khi bạn tập trung vào việc làm cho các thành phần động cơ / khung của bạn bị cô lập để chúng có thể được kiểm tra trong bối cảnh của riêng chúng, đó là nơi tôi đang cố gắng thực hiện. Vì tôi không muốn kiểm tra hiệu năng trò chơi của mình vì đó là một con thú luôn thay đổi, tuy nhiên khung này hiếm khi thay đổi và có thể dễ dàng được thiết lập để chạy một số lượng kịch bản nhất định như bạn đề cập.
Grofit

Cảm ơn. Như được chỉ ra bởi những điều tôi muốn đạt được trong tương lai, tôi đã nhắm đến việc tự động hóa những thứ xảy ra trong trò chơi thực tế - Kết quả cũng rất thuận tiện cho việc đo lường hiệu suất.
Koarl

0

Tôi không thấy những gì bạn mô tả là một công cụ hữu ích. Là một nhà phát triển, một số hiệu suất đơn giản là gần như vô dụng.

Những gì bạn muốn là lập hồ sơ mã của bạn, chia nó thành các phần logic và đo lường thời gian mỗi người sử dụng, cao điểm và trung bình. Bây giờ bạn có thể cho biết phần nào của mã đang gây ra sự cố và bạn biết nơi cần tìm tối ưu hóa.

Phần khó khăn không phải là hiệu suất thay đổi từ bản dựng này sang bản dựng khác, bạn không cần tự động để hình dung điều đó. Phần khó khăn là sự khác biệt về hiệu suất giữa các máy khác nhau, không có cách nào để ngoại suy hiệu suất từ ​​máy này sang máy khác bằng thẻ video khác, v.v.

Vì vậy, những gì bạn muốn là một tính năng điểm chuẩn để bạn có thể thực hiện một cú nhấp chuột và nhận được các số hồ sơ. Bằng cách này, bạn sẽ có thể kiểm tra nhiều máy cùng một lúc. Có một số cách để làm điều này, ví dụ, bạn có thể ghi đè đầu vào của người dùng để tiến gần đến việc chạy một phiên trò chơi bình thường nhất có thể.

Bạn cũng có thể muốn có một bài kiểm tra dài hơn để phát hiện rò rỉ bộ nhớ.


3
Nếu bạn làm theo cách tiếp cận kiểu CI điển hình, khi bạn chạy phần mềm của mình thông qua máy chủ xây dựng, bạn sẽ luôn kiểm tra trên cùng một máy để luôn có cùng phần cứng, điều này mang lại cho bạn một đường cơ sở cho số liệu của bạn. Vì đó là hướng tôi đến từ thực sự. Bạn nói rằng bạn không cần một công cụ để tìm ra sự thay đổi hiệu suất giữa các bản dựng, đó là sự thật bạn có thể tự chạy nó và thấy sự khác biệt, nhưng sẽ rất tuyệt nếu hệ thống xây dựng hoặc máy tính hiện tại của bạn có thể cung cấp cho bạn những con số đó mà bạn không cần để làm bất cứ điều gì khác hơn là chạy thử nghiệm.
Grofit

Nếu bạn ít nghiêm túc nhất về việc kiểm tra, bạn cần nhiều máy kiểm tra khác nhau. Trong mọi trường hợp, vấn đề thực tế là gì? Bạn không chắc chắn làm thế nào để mã điểm chuẩn vào trò chơi?
aaaaaaaaaaaa

Không có vấn đề như vậy, tôi chỉ cố gắng để có được một số thông tin về cách một số người đã áp dụng điều này cho các dự án của họ. Tôi không nghĩ rằng có các máy riêng biệt sẽ giúp ích theo mọi cách, vì bạn không thực sự thử nghiệm để xem liệu nó có chạy ở tốc độ 30 khung hình / giây trên phần cứng thấp và 60 hình / giây trên phần cứng nhanh. Bạn đang đưa phần cứng ra khỏi phương trình và PURELY nhìn vào mã nguồn / mã nguồn của bạn. Vì thực sự không có vấn đề gì nếu bạn đang thử nghiệm trên lõi 486 hoặc lõi tứ, vì bạn đang thử nghiệm bản dựng này với bản dựng khác, không phải một bộ phần cứng nữa so với bản khác.
Grofit

3
Tôi phải đồng ý một chút với cả Grofit và eBusiness về vấn đề này. Kiểm tra tự động rất quan trọng, đặc biệt là đối với các dự án lớn, để khi có bất kỳ bản dựng nào đi qua, bạn sẽ biết liệu có thứ gì đó bị tổn thương hoặc giúp hiệu suất hay không, và điều này được thực hiện lý tưởng trên một máy. Với các trò chơi trên PC, ít nhất bạn cũng cần kiểm tra nhiều loại phần cứng, các bài kiểm tra tự động của bạn có thể nói hiệu năng rất tuyệt, nhưng sau đó bạn chạy trò chơi của mình trên GPU cũ hoặc thấy mình chạy vào bộ nhớ ảo và tất cả các bể hiệu suất đột ngột. Bạn cần có khả năng kiểm tra những thứ đó trước khi chúng đến tay khách hàng.
Nic Foster

@Grofit Vấn đề là, nó có thể chỉ là máy cũ phá vỡ bản dựng. Không có gì khác thường khi một thay đổi không có hiệu ứng hiệu năng đáng kể trên máy tính mới, hoặc thậm chí là một sự cải tiến, trong khi thay đổi tương tự hoàn toàn ngăn trò chơi chạy trên máy tính cũ. Bạn không thể lấy phần cứng ra khỏi phương trình, không có thứ gọi là hiệu năng mã bị cô lập. Nhưng nếu bạn muốn thiết lập chạy thử tự động chỉ trên một máy duy nhất, ít nhất là thực hiện trên máy rác cũ, điều đó sẽ cho bạn cơ hội tốt hơn để thử nghiệm thất bại.
aaaaaaaaaaaa
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.