Trò chơi Scanline Racingline là gì


13

Tôi đã nghe nhiều người làm việc trên VR nói về đua xe quét và rằng nó được cho là giúp cải thiện độ trễ cho chuyển động sang photon. Tuy nhiên, đối với tôi không rõ điều này có thể được thực hiện như thế nào với OpenGL. Ai đó có thể giải thích cách hoạt động của đường đua quét và cách triển khai trên các GPU hiện đại.

Câu trả lời:


14

Khi GPU của bạn hiển thị một khung hình mới trên màn hình, nó sẽ chuyển hình ảnh qua cáp HDMI (hoặc bất kỳ loại nào) trong một quy trình gọi là "quét". Các pixel được gửi theo thứ tự tuyến tính, thường là từ trái sang phải và từ trên xuống dưới. Quá trình này được tính thời gian để nó mất phần lớn thời gian của một khoảng thời gian làm mới để làm điều này. Chẳng hạn, ở 60Hz, một khung hình là ~ 17 ms. Mỗi lần quét sẽ mất khoảng 15-16 ms, với 1-2 ms vblank ở giữa (các giá trị chính xác thay đổi tùy theo chế độ hiển thị và video).

Theo truyền thống, kết xuất được đệm đôi, có nghĩa là có hai bộ đệm được lưu trong bộ nhớ GPU: một bộ đệm hiện đang được quét ("bộ đệm trước") và một bộ đệm được kết xuất thành ("bộ đệm phía sau"). Từng khung hình, hai người được tráo đổi. GPU không bao giờ kết xuất với cùng một bộ đệm được quét ra, điều này ngăn chặn các tạo phẩm do có khả năng nhìn thấy các phần của khung không hoàn chỉnh. Tuy nhiên, một tác dụng phụ của việc này là độ trễ tăng lên, vì mỗi khung hình có thể nằm xung quanh trong bộ đệm trong vài ms trước khi nó bắt đầu được quét ra.

VR rất nhạy cảm với độ trễ, vì vậy điều này không được mong muốn. Một cách tiếp cận khác là kết xuất trực tiếp vào bộ đệm phía trước, nhưng thời gian xử lý rất cẩn thận để bạn đã kết xuất từng dòng của hình ảnh ngay trước khi quá trình quét đến đó. Đó gọi là "đua quét" hoặc "đua chùm" ("chùm" phát ra từ thời CRT ngày xưa). Điều này ít nhiều yêu cầu bạn hiển thị hình ảnh theo thứ tự quét, tức là cùng thứ tự mà các pixel được quét ra. Nó không thực sự phải được kết xuất một dòng tại một thời điểm mà nó có thể được hiển thị thành các dải mỏng cao vài pixel, nhưng nó phải được thực hiện theo thứ tự, vì bạn không thể quay lại và chỉnh sửa các pixel đã có được quét ra.

Có rất nhiều nhược điểm của phương pháp này; nó có các yêu cầu hiệu năng rất nghiêm ngặt, phải được hẹn giờ rất cẩn thận so với vsync và nó làm phức tạp đáng kể quá trình kết xuất. Nhưng về nguyên tắc, nó có thể loại bỏ mili giây khỏi độ trễ của bạn, đó là lý do tại sao mọi người VR quan tâm đến nó.


1
Vì vậy, câu hỏi của tôi là làm thế nào để chúng ta làm điều này trên GPU hiện đại? Tôi không nghĩ có bất kỳ cách nào để truy vấn quá trình quét và dường như tôi thực sự không thể gửi các cuộc gọi rút thăm mỗi lần quét. Ngay cả khi bạn có thể - bạn có gì đảm bảo rằng các khoản rút của bạn sẽ đến đó trước khi quét?
Mokosha

1
@Mokosha Đúng, không có cách nào để truy vấn quét trực tiếp AFAIK. Tốt nhất, bạn có thể tìm ra khi nào vsync (thông qua một số tín hiệu HĐH) và ước tính vị trí quét theo thời gian liên quan đến điều đó (biết chi tiết về chế độ video). Để kết xuất, bạn có thể thử nghiệm để tìm hiểu xem nó thường mất bao lâu giữa glFlush và khi kết xuất hoàn thành và đưa ra một số dự đoán dựa trên điều đó. Cuối cùng, bạn phải xây dựng một chút chậm chạp trong thời gian của mình trong trường hợp có lỗi (ví dụ như ở lại 2-3 giây trước khi quét) và chấp nhận rằng có thể sẽ có những tạo tác không thường xuyên.
Nathan Reed

Ảnh hưởng của độ trễ tăng lên là do vsync, điều này làm cho các giao dịch hoán đổi mặt trước và backbuffer được đồng bộ hóa với vblank của màn hình. Bản thân bộ đệm đôi không gây ra vấn đề này và nó rất hữu ích để giảm thiểu nhấp nháy vì một pixel chỉ có thể thay đổi một lần trong bộ đệm trước.
Maurice Laveaux

Tôi đã đưa ra một cách chính xác để dự đoán các trình quét mà không cần truy vấn dòng quét, xem câu trả lời bên dưới.
Đánh dấu Rejhon

0

Điều tuyệt vời là cuối cùng chúng ta cũng có thể dự đoán độ chính xác raster chính xác của dòng quét mà không có quyền truy cập vào truy vấn trên mỗi lần quét:

https://www.youtube.com/watch?v=OZ7Loh830Ec

Tôi đã đưa ra các công thức chính xác đến từng giây như một phần bù VSYNC, để dự đoán vị trí của một đường nước mắt. Các giọt nước mắt trong khi VSYNC OFF luôn chính xác raster, vì vậy bạn có thể điều khiển chúng ra khỏi tầm nhìn trong khi "kết xuất bộ đệm trước mô phỏng" cấp độ thông qua hoán đổi bộ đệm VSYNC OFF lặp đi lặp lại.

Hãy chú ý đến chủ đề diễn đàn - có một số mã nguồn mở liên tục được thêm vào - https://forums.blurb cluster.com/viewtopic.php?f=10&p=32002


0

Nếu được quan tâm, Dreamcast có chế độ kết xuất "đua tia", nhờ đó, nó có thể dành một phần bộ nhớ tương đối nhỏ cho các pixel framebuffer (ví dụ 64 dòng quét) và nó sẽ hiển thị lần lượt các hàng 32 cập nhật màn hình. Điều này tuy nhiên, chỉ được sử dụng để tiết kiệm bộ nhớ. Tôi nghi ngờ bất cứ ai đang tạo ra hình học "sửa đổi" cho các phần sau của màn hình.

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.