Làm cách nào tôi có thể xử lý kết xuất trên nhiều màn hình với các tốc độ làm mới khác nhau?


8

Cách tốt nhất để xử lý tình huống có thể xảy ra là gì, khi người dùng có hai hoặc nhiều màn hình với độ phân giải và khoảng thời gian đồng bộ hóa dọc khác nhau?

Điều này sẽ áp dụng khi trò chơi có dấu thời gian cố định và đang chạy ở chế độ cửa sổ: nếu một màn hình có tốc độ khung hình là 60.056 và màn hình kia có tốc độ khung hình là 59,94, thì đồng bộ dọc sẽ không thực hiện được công việc của nó, nếu cửa sổ trò chơi được chuyển từ màn hình chính sang màn hình khác.

Bí danh tạm thời cũng sẽ xảy ra, vì dấu thời gian không được hòa hợp chính xác với tốc độ đồng bộ hóa khác. Làm thế nào để các trò chơi thường đối phó với vấn đề này, nếu có?


Chính xác là - bạn đang cố gắng làm gì?
Panda Pajama

@PandaPajama Tôi đang cố gắng cho phép người chơi di chuyển cửa sổ trò chơi giữa các màn hình một cách trơn tru để A) không xảy ra hiện tượng xé rách tại bất kỳ điểm nào và B) không có khung hình nào được lặp lại tại bất kỳ điểm nào. Tôi đoán logic là độc lập với điều đó, vì vậy tôi sẽ giảm phạm vi câu hỏi của tôi xuống chỉ hiển thị.
NmdMystery

Bạn sẽ chỉ nhận được các khung lặp lại nếu logic trò chơi của bạn chạy chậm hơn mã kết xuất. Với 60 khung hình / giây logic, trên 60.056 khung hình / giây, trung bình bạn sẽ nhận được một khung hình lặp lại cứ sau 18 giây. Điều này mất 0,017 giây và rất có thể sẽ không được chú ý. Nếu bạn TỰ TIN PHẢI không có khung lặp lại, bạn có thể có logic trò chơi của mình với tốc độ khung hình nhanh hơn nhiều. Nói 200fps. Bạn sẽ lãng phí rất nhiều quá trình xử lý và nhận được rất nhiều khung hình bị rơi, nhưng bạn sẽ không nhận được các khung hình lặp đi lặp lại, đó dường như là mục đích của bạn.
Panda Pajama

Điều này tất nhiên là hợp lệ cho một thế giới với các bước thời gian riêng biệt, bao gồm phần lớn mã trò chơi. Nếu bạn luôn có thể tính toán trạng thái của thế giới trò chơi của mình trong một thời gian tùy ý nvới mức O(n)độ phức tạp ít hơn (tối ưu O(1)), thì không có gì tôi nói áp dụng. Mô phỏng tương tác không có xu hướng hoạt động như vậy mặc dù.
Panda Pajama

Câu trả lời:


5

Các bước logic trò chơi không phải được đồng bộ hóa với logic hiển thị, ngay cả khi bạn đang sử dụng dấu thời gian cố định.

Hãy xem xét một gameloop như:

var time_per_step = 1 / 60 -- for 60 -logic- steps per second
var prev_time = get_time() -- in seconds

while true do
    var curr_time = get_time()
    while prev_time < curr_time do
        do_step()
        prev_time = prev_time + time_per_step
        // optional: curr_time = get_time()
    end
    draw()
end

Nó không thực sự quan trọng bao lâu draw()cuộc gọi của bạn mất. Miễn là bạn do_step()mất ít hơn time_per_step, logic trò chơi của bạn sẽ không bị tụt lại phía sau.


Làm thế nào về rách? Là giải pháp cho các mức độ làm mới khác nhau tùy thuộc vào nhà cung cấp, hoặc có cách nào hiệu quả để hiển thị vào đúng thời điểm trên cả hai màn hình mà không gặp phải hiện tượng răng cưa tạm thời trên một trong số chúng không?
NmdMystery

Giải pháp này tương thích với vSync. Tôi đã sử dụng 60 bước khung logic mỗi giây, nhưng bạn có thể bơm nó lên hoặc xuống bao nhiêu tùy ý.
Panda Pajama

Quan điểm của tôi là với gameloop này, logic trò chơi của bạn sẽ luôn được cập nhật với đồng hồ thời gian thực. Như vậy, nếu logic vẽ của bạn không chính xác đồng bộ với logic trò chơi, thuật toán này sẽ lặp lại hoặc thả khung khi cần để theo kịp đồng hồ thời gian thực. Điều này có được chấp nhận hay không là tùy thuộc vào bạn quyết định
Panda Pajama

Vì vậy, tôi phải lựa chọn giữa các khung lặp đi lặp lại và xé, về cơ bản? Không có lựa chọn thay thế khác?
NmdMystery

Vâng, nhưng đó là theo định nghĩa. Nếu bạn muốn Xcác khung logic mỗi giây trên Ycác khung đồ họa mỗi giây, thì X != Y, bạn sẽ phải thực hiện giữ logic cho đồ họa (các khung lặp lại và bỏ) hoặc đồ họa giữ thành logic (xé). Một lựa chọn khác là logic logic chạy ở tốc độ đồ họa, điều này sẽ dẫn đến hiện tượng răng cưa tạm thời. Không có khoa học tên lửa ở đây.
Panda Pajama
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.