Phát hiện nút điều khiển cực nhanh?


7

Người chơi thường có thể nhấn và nhả một nút trong một khung hình duy nhất để công cụ trò chơi không có thời gian để phát hiện ra nó?

Làm thế nào để lập trình viên thường xử lý tình huống này? Nó thậm chí là cần thiết để xử lý nó?

Trong khi thử nghiệm, tôi có thể nhấn và nhả một nút trong khoảng 14 hoặc 15 mili giây (hơn 1 lần nhấp / khung hình). Tuy nhiên, tôi không thể làm điều này trong khi vẫn giữ phím điều khiển bình thường và chu kỳ phát hành báo chí sẽ phải bắt đầu vào gần như thời gian chính xác của khung hình bắt đầu.

Cụ thể, tôi đang hỏi về khả năng nhập cần điều khiển của GLFW.

Tôi hiện đang sử dụng GLFW để tạo trò chơi và tôi nhận thấy rằng bàn phím và chuột có chức năng gọi lại, trong khi cần điều khiển thì không. Ngoài ra, dường như không thể bật "phím dính" cho cần điều khiển. (Tôi mới chỉ bắt đầu sử dụng GLFW gần đây, vì vậy vui lòng sửa cho tôi nếu tôi sai, vì có một trong hai cách giải quyết vấn đề.)

Mặc dù tôi đang hỏi về GLFW, các câu trả lời liên quan đến bất kỳ thư viện / công cụ / ngôn ngữ nào đều được chào đón.

Câu trả lời:


7

Trên phần cứng của Nintendo và Sony, đôi khi chúng tôi đã thăm dò ý kiến ​​đầu vào với tốc độ cao hơn so với chúng tôi đã vẽ các khung; sử dụng luồng điều khiển hẹn giờ để xem I / O của bộ điều khiển ở mức 120hz, chẳng hạn, ngay cả khi chúng ta đang kết xuất ở mức 30hz. Bởi "một luồng điều khiển thời gian" Tôi có nghĩa là có một bộ đếm thời gian phần cứng chọc một ngắt làm cho một chức năng cụ thể được gọi trong thời gian thực. Trên các hệ thống này, bộ điều khiển xuất hiện dưới dạng I / O được ánh xạ bộ nhớ, do đó bạn chỉ cần tải một từ ra khỏi một vị trí bộ nhớ cụ thể và sẽ có vị trí trục X của cần điều khiển tại thời điểm đó. Bạn sẽ lưu nó ở đâu đó trong bộ nhớ chính và sau đó khi vòng lặp trò chơi chính của bạn chạy, nó sẽ có lịch sử 4 hoặc 8 hoặc nhiều mẫu dữ liệu đầu vào trong một khoảng thời gian nhất quán.

Điều này không phải là để phát hiện thao tác bấm nút, nhưng để có được thời gian trong khung hình rõ nét cho các trò chơi chiến đấu khi nó quan trọng (vì bạn được phép xếp hàng đầu vào "trước" một khung kích hoạt quan trọng trong hoạt hình và tốc độ hoạt hình có thể không như ổn định như chúng tôi muốn, vì vậy chúng tôi cần phân biệt xem bạn có nhấn nút trước ranh giới khung hay trên nó không).

Tôi không biết nếu có thể với GFWL. Hệ thống đầu vào của DirectX bị ràng buộc khá chặt chẽ với chu kỳ kết xuất và có rất nhiều hệ điều hành giữa bạn và các công tắc trong gamepad USB.


Đây là giải pháp tốt nhất tôi đã thấy cho đến nay. Theo như tôi biết, đầu vào cần điều khiển, ít nhất là trên Windows, không bị ràng buộc với hệ thống kết xuất theo bất kỳ cách nào. Theo mặc định, tôi bỏ phiếu đầu vào một lần trên mỗi khung (khi tôi trao đổi bộ đệm), nhưng chắc chắn có thể chuyển cái này thành một chuỗi.
Táo

2

Bạn có chắc chắn về điều đó không? Tôi có thể có thể thấy một quá trình chuyển đổi trạng thái diễn ra nhanh chóng ở đây và đó, nhưng bạn có nhận ra rằng sẽ phải mất 70 lần nhấn mỗi giây để thấy một nút giảm xuống sau mỗi 14ms? Xin lỗi nhưng điều đó không thể thực hiện được, mặc dù có lẽ bạn có thể tạo ra nó ở đây và ở đó với một số thao tác bấm nút điên cuồng, và có thể có một số phần bị trả lại trong chính phần cứng. Bạn đã bao giờ xem video về những người chơi StarCraft chuyên nghiệp, nơi họ sử dụng tất cả các ngón tay trên một bàn tay cộng với một con chuột và nhấp nhanh đến mức đó có phải là một vệt mờ không? Những kẻ đó là những vị thần nếu họ có thể thực hiện 300 hành động mỗi phút , tức là 5 giây mỗi giây bằng cả hai tay ...

Điều đó nói rằng, nói chung với rất nhiều trò chơi, bạn chỉ thấy đầu vào được thăm dò mọi khung hình. Khả năng toàn bộ thông cáo báo chí xảy ra trong một khung hình và bị mất là khá xa vời với tốc độ khung hình tương tác, và tôi chưa bao giờ biết một nhà phát triển trò chơi lo lắng về điều này.

Trên một số hệ thống, bạn có thể nhận được bộ đệm đầu vào. Hệ thống giám sát các thiết bị đầu vào không đồng bộ và lấp đầy hàng đợi với tất cả các thay đổi trạng thái diễn ra kể từ truy vấn cuối cùng và nói chung, bạn sẽ để bộ đệm lấp đầy giữa các khung và xử lý từng khung, do đó độ phân giải có thể cao hơn so với bỏ phiếu trạng thái từng khung.

Một số hệ thống được điều khiển theo sự kiện, vì vậy bạn có thể đăng ký một cuộc gọi lại kích hoạt mỗi khi thay đổi trạng thái đầu vào, mặc dù độ phân giải sẽ phụ thuộc vào phần còn lại của ngăn xếp phần mềm và có thể hoặc không thể tốt hơn đáng kể so với kiểm tra theo từng khung. Ví dụ: nếu API chỉ thăm dò phần cứng mọi khung hình, so sánh nó với khung cuối cùng và sau đó thực hiện các cuộc gọi lại áp dụng, bạn sẽ không làm gì tốt hơn.

Với các hệ thống nhúng và một số hệ thống trò chơi cũ đã được lập trình cho kim loại, bạn sẽ có các ngắt cho các nút. Một ngắt là một đoạn mã nhỏ mà bạn đăng ký với hệ thống chạy mỗi khi có điều gì đó xảy ra. Trong trường hợp nút bị gián đoạn, phần cứng sẽ được thiết kế vật lý để khi điện áp trên dây kết nối với nút chuyển từ thấp đến cao hoặc cao đến thấp, nó sẽ chạy đoạn mã này. Đây sẽ là hệ thống trực tiếp và phản hồi nhanh nhất nhưng hầu hết các trò chơi hiện nay có rất nhiều phần cứng và phần mềm giữa bạn và các nút.


1
Tôi đồng ý với những gì bạn đang nói, nhưng trong tình huống này, số lần nhấn trung bình mỗi giây không quan trọng bằng việc một lần nhấn nhanh như thế nào. Ví dụ: trong các thử nghiệm của tôi, thời gian nhấn trung bình của tôi (được đo bằng lượng thời gian nút ở trạng thái "xuống") là khoảng 50 ms. Tuy nhiên, điều này không có nghĩa là tôi đã nhấn nút 20 lần mỗi giây, vì thời gian trung bình nút ở trạng thái "được giải phóng" là khoảng 150 ms. Điều này cho thấy việc nhấn và nhả một nút trong một khung hình dễ dàng hơn nhiều so với việc giữ trung bình 60 vòi mỗi giây.
Táo

OK, tôi hiểu rồi. Điều đó có ý nghĩa, tương tự như tình huống mà Crashworks đã thảo luận với các trò chơi chiến đấu, trong đó thời gian có độ phân giải cao của các sự kiện là rất quan trọng. Tôi chắc chắn hiểu làm thế nào điều này có thể là một vấn đề cho bạn, có thể muốn thực hiện lấy mẫu đầu vào không đồng bộ như ông đề xuất.
Suboptimus

0

Giả sử một trò chơi chạy ở tốc độ 60 khung hình / giây, mỗi khung hình là khoảng 17 mili giây. Rất khó có ai đó có thể nhấn phát hành trong khoảng thời gian đó. Nếu bạn có thể nhấp đủ nhanh để nhận được khoảng 60 lần nhấp mỗi giây , thì bạn sẽ nhấn và phát hành đủ nhanh để đánh bại các khung.


Điều này là đúng, nhưng tôi vẫn có thể thấy một số trường hợp cạnh có thể xảy ra. Có lẽ tốt nhất là không nên lo lắng về điều này, vì một người dùng nhấn nút nhanh chóng có thể đang vô tình làm điều đó hoặc đang sử dụng một công cụ gian lận. Mặc dù vậy, tôi vẫn đang tìm kiếm một giải pháp cho vấn đề.
Táo

Không có trò chơi chuyên nghiệp nào làm gì đặc biệt để xử lý việc này và bạn không nghe thấy mọi người phàn nàn. Con người không thể nhấn nút nhanh như vậy.
Sean Middleditch

2
@DBRalir Nếu bạn bỏ phiếu đầu vào, không có cách nào để phát hiện điều này, vì theo như chương trình của bạn có liên quan, điều đó đã không xảy ra. Có nhiều điều quan trọng phải lo lắng hơn trường hợp cạnh cực kỳ hiếm này.
MichaelHouse

@ Byte56 Vâng, tôi đang bỏ qua nó. Tôi có thể thường xuyên có thời gian nhấn dưới 15 ms, nhưng điều đó thường sẽ trùng lặp với thói quen bỏ phiếu. Để chương trình bỏ lỡ toàn bộ vòi, nó sẽ phải kéo dài khoảng 7 ms, điều này dường như không thể. Cảm ơn câu trả lời của bạn.
Táo

Thật tốt khi nghe. Âm thanh như trò chơi của bạn sẽ được nhịp độ nhanh! Điều đó sẽ rất vui. Chúc may mắn với nó :)
MichaelHouse
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.