Làm thế nào tôi có thể đơn vị kiểm tra kết xuất đầu ra?


19

Gần đây tôi đã nắm lấy Phát triển dựa trên thử nghiệm (TDD) và nó có tác động tuyệt vời đến sản lượng phát triển của tôi và khả năng phục hồi của cơ sở mã của tôi. Tôi muốn mở rộng cách tiếp cận này với một số công việc kết xuất mà tôi làm trong OpenGL, nhưng tôi không thể tìm thấy bất kỳ cách tiếp cận tốt nào cho việc này.

Tôi sẽ bắt đầu với một ví dụ cụ thể để chúng tôi biết những loại điều tôi muốn kiểm tra; giả sử tôi muốn tạo một khối đơn vị xoay quanh một số trục và tôi muốn đảm bảo rằng, đối với một số số khung, mỗi khung được hiển thị chính xác.

Làm thế nào tôi có thể tạo một trường hợp thử nghiệm tự động cho việc này? Tốt hơn là, tôi thậm chí có thể viết một trường hợp thử nghiệm trước khi viết bất kỳ mã nào để kết xuất khối (theo thông lệ TDD thông thường.) Trong số nhiều điều khác, tôi muốn đảm bảo rằng kích thước, vị trí và hướng của khối là chính xác trong từng khung hình được hiển thị. Tôi thậm chí có thể muốn đảm bảo rằng các phương trình chiếu sáng trong shader của tôi là chính xác trong mỗi khung hình.

Cách tiếp cận hữu ích duy nhất từ ​​xa mà tôi đã gặp phải liên quan đến việc so sánh đầu ra được kết xuất với đầu ra tham chiếu, thường loại trừ thực hành TDD và rất cồng kềnh.

Tôi có thể tiếp tục về các yêu cầu mong muốn khác, nhưng tôi sợ những yêu cầu tôi đã liệt kê là ngoài tầm với.


3
Toàn bộ vấn đề ở đây là trường hợp thử nghiệm của bạn được xác định bởi một đầu ra tốt; Nhưng điều gì xảy ra nếu đầu ra đó là lỗi (dương tính giả)? Dù bằng cách nào tôi cũng sẽ bắt đầu bằng cách kiểm tra khung lưới trước; sau đó di chuyển đến một cảnh được chuyển tiếp và cuối cùng bị hoãn lại (nếu bạn sử dụng cảnh đó). Bạn có thể XOR toàn bộ hình ảnh để so sánh nhanh (hoàn toàn vượt qua màu đen). GPU thực sự là một khu vực tồi tệ để áp dụng TDD; Nhưng nếu bạn nghĩ ra bất cứ điều gì thông minh, tôi rất muốn biết.
Jonathan Dickinson

Tôi nghi ngờ rằng tôi sẽ không nhận được chính xác câu trả lời mà tôi hy vọng, nhưng tôi vẫn hy vọng vào một số ý tưởng hay. Suy nghĩ tốt về vượt qua màu đen. Kiểm tra bộ đệm sâu cũng có thể hữu ích.
thịt


@Adam cảm ơn vì đã chia sẻ điều đó. Thật không may, nó cách ngoài tầm với của một indie như tôi làm việc trên trò chơi di động :) Nó cũng thất bại hầu hết các yêu cầu cơ bản của tôi.
thịt

@Adam bạn chắc chắn nên 'trả lời' liên kết đó. Tiểu thuyết khá.
Jonathan Dickinson

Câu trả lời:


8

Đây có vẻ như là một ứng dụng tốt của khung Kiểm tra phê duyệt hoặc một cái gì đó tương tự.

Như đã nêu trong các bình luận, bạn vẫn sẽ gặp vấn đề với dương tính giả, nếu bạn tình cờ phê duyệt đầu ra xấu, nhưng điều này sẽ ở LEAST cho bạn biết khi đầu ra thay đổi đáng kể.

Vì bạn đang sử dụng OpenGL, tôi cho rằng các phê duyệt sẽ không hiệu quả với bạn trực tiếp, nhưng ý tưởng là âm thanh. Chỉ cần kiểm tra tệp băm và nếu nó khác, hiển thị lỗi trong trình xem khác biệt thích hợp (như chương trình tìm khác biệt hình ảnh). Nếu bạn chấp thuận phiên bản mới, hãy cập nhật tệp "được phê duyệt" để phù hợp với kết quả mới.


Đó là một công cụ thú vị. Nếu bạn lấy một cái gì đó giống như trang trại thử nghiệm trong liên kết của Adam trong các nhận xét ở trên và áp dụng một cơ chế phê duyệt tích hợp như thế này, có lẽ bạn sẽ bắt đầu tiếp cận một cái gì đó có chi phí khá thấp. Cám ơn vì đã chia sẻ!
thịt

Các thử nghiệm phê duyệt không phải là thử nghiệm tự động.
zwcloud

@zwcloud: Ý bạn là gì? Nó tự động một khi nó được tác giả, giống như bất kỳ thử nghiệm nào. Chỉ là sự chấp thuận đầu tiên là một phần của quá trình tác giả.
John Gietzen

@JohnGietzen Tôi không hiểu điều đó từ câu trả lời của bạn. Tôi nghĩ bạn nên làm rõ ý tưởng về các bài kiểm tra phê duyệt rõ ràng hơn. Tôi sẽ xóa downvote khi câu trả lời được cập nhật.
zwcloud

6

Tôi không tham gia kinh doanh trò chơi, vì vậy xin vui lòng chịu bất kỳ nhận thức ngu ngốc và ngây thơ tiềm năng nào

Đối với tôi, viết các bài kiểm tra so sánh các hình ảnh được hiển thị đầy đủ không thực sự là các bài kiểm tra đơn vị , mà là các bài kiểm tra tích hợp đầy đủ , bởi vì mọi thứ phải hoạt động tốt để chạy thử thành công.

Điều gì về một lớp trung gian nơi bạn có thể kiểm tra xem mọi thứ có ổn không? Có hai điều tôi nghĩ đến:

  1. Đừng vẽ trực tiếp, nhưng đưa ra một luồng lệnh được chuyển thành kết xuất các cuộc gọi theo cách này. Luồng lệnh có thể được kiểm tra tính chính xác. Đây không phải là thử nghiệm đầu cuối, nhưng bạn muốn thử nghiệm đơn vị , không phải thử nghiệm tích hợp đầy đủ.

  2. Đây thực sự là một biến thể trên 1. Gói OpenGL, bắt tất cả các cuộc gọi đến nó, loại bỏ điều này xuống những gì bạn thực sự muốn kiểm tra và kiểm tra xem đầu ra có còn khớp không. Trình bao bọc OpenGL có thể tự kiểm tra nếu được cấu hình đúng và biến thành một bản giả .


3

Vấn đề là các công cụ 3d không bắt buộc phải xuất ra hình ảnh chính xác từng bit một. Một số độ trễ được chấp nhận miễn là các tạo tác gây ra bởi nó không hiển thị cho người xem. Một kết cấu tối hơn 1% so với dự kiến ​​thường không phải là vấn đề nghiêm trọng ... thông thường. Trong một số điều kiện, nó có thể là một tạo tác trực quan. Và đó là vấn đề: Thật khó để đánh giá một bài kiểm tra tự động mà các tạo tác sẽ được người xem chú ý và không. Tuy nhiên, kiểm tra tự động có thể được sử dụng để kiểm tra độ sạch đơn giản khi được sử dụng trên hình học rất đơn giản.

Những gì bạn có thể làm là kết xuất một số cảnh đơn giản và sau đó so sánh hình ảnh được tạo với kết xuất tham chiếu. Kết xuất tham chiếu đó có thể đến từ một công cụ đồ họa khác hoặc là một ảnh chụp màn hình trước đó từ cùng một công cụ (kiểm tra hồi quy).

Khi một số thử nghiệm thất bại sau khi thay đổi công cụ đồ họa, người thử nghiệm nên so sánh đầu ra với hình ảnh tham chiếu và tự đánh giá nếu đầu ra mới trông vẫn tốt như trước (hoặc thậm chí tốt hơn). Khi đó là trường hợp, thử nghiệm nên được thay đổi để so sánh với đầu ra mới, được cải thiện.

Một điều khác bạn có thể kiểm tra tự động là yêu cầu hiệu suất. Một yêu cầu như vậy có thể là trong bản demo tự chạy (mô phỏng chuỗi thực từ trò chơi), tốc độ khung hình không được giảm xuống dưới 40 Fps trên hệ thống thử nghiệm. Đây là thứ bạn có thể kiểm tra tự động. Những gì bạn không thể kiểm tra là kết xuất được thỏa mãn. Nhưng bạn có thể sử dụng các thử nghiệm như vậy để ngăn các nhà phát triển của mình phát triển một trò chơi trông tuyệt vời nhưng không chạy đúng trên bất kỳ hệ thống giá cả phải chăng nào cho đến nhiều năm sau khi ra mắt (xin chào Crytek).

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.