Chúng ta hãy nghĩ về nền tảng bất khả tri: Tôi muốn tải một số tài nguyên đồ họa trong khi phần còn lại của trò chơi đang chạy.
Về nguyên tắc, tôi có thể tải các tệp thực tế trên một luồng riêng biệt hoặc sử dụng I / O không đồng bộ. Nhưng với các đối tượng đồ họa, tôi sẽ phải tải chúng lên GPU và điều đó chỉ có thể được thực hiện trên luồng chính.
Tôi có thể thay đổi vòng lặp trò chơi của mình để trông giống như thế này:
while true do
update()
for each pending resource do
load resource to gpu
end
draw()
end
trong khi có một luồng tài nguyên tải riêng biệt từ đĩa vào RAM.
Tuy nhiên, nếu có nhiều tài nguyên lớn để tải, điều này có thể khiến tôi bỏ lỡ thời hạn khung và cuối cùng bị rơi khung. Vì vậy, tôi có thể thay đổi vòng lặp này:
while true do
update()
if there are pending resources then
load one resource to gpu
remove that resource from the pending list
end
draw()
end
Hiệu quả chỉ tải một tài nguyên trên mỗi khung. Tuy nhiên, nếu có nhiều tài nguyên nhỏ để tải, tải tất cả chúng sẽ mất nhiều khung hình, và sẽ có rất nhiều thời gian lãng phí.
Tối ưu, tôi muốn tính thời gian tải theo cách sau:
while true do
time_start = get_time()
update()
while there are pending resources then
current_time = get_time()
if (current_time - time_start) + time_to_load(resource) >= 1/60 then
break
load one resource to gpu
remove that resource from the pending list
end
draw()
end
Bằng cách này, tôi sẽ chỉ tải một tài nguyên nếu tôi có thể làm điều đó trong thời gian tôi có cho khung đó. Thật không may, điều này đòi hỏi một cách để ước tính lượng thời gian cần thiết để tải một tài nguyên nhất định và theo như tôi biết, thường không có cách nào để làm điều này.
Tôi đang thiếu gì ở đây? Làm thế nào để nhiều trò chơi có thể tải tất cả nội dung của chúng hoàn toàn không đồng bộ và không bị rớt khung hình hoặc thời gian tải cực kỳ dài?