สมมติว่าผู้ไม่เชื่อเรื่องพระเจ้าแพลตฟอร์ม: ฉันต้องการโหลดทรัพยากรกราฟิกในขณะที่เกมที่เหลือกำลังทำงานอยู่
โดยหลักการแล้วฉันสามารถโหลดไฟล์จริงในเธรดแยกต่างหากหรือใช้ async I / O แต่ด้วยวัตถุกราฟิกฉันจะต้องอัปโหลดไปยัง GPU และสามารถทำได้ (ปกติ) บนเธรดหลักเท่านั้น
ฉันสามารถเปลี่ยนลูปเกมของฉันให้มีลักษณะดังนี้:
while true do
update()
for each pending resource do
load resource to gpu
end
draw()
end
ในขณะที่มีทรัพยากรโหลดด้ายแยกจากดิสก์เพื่อแรม
อย่างไรก็ตามหากมีทรัพยากรจำนวนมากที่ต้องโหลดสิ่งนี้อาจทำให้ฉันพลาดกำหนดเส้นตายของเฟรม ดังนั้นฉันสามารถเปลี่ยนวงนี้:
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
โหลดทรัพยากรเดียวต่อเฟรมอย่างมีประสิทธิภาพ อย่างไรก็ตามหากมีทรัพยากรขนาดเล็กจำนวนมากที่ต้องโหลดการโหลดทั้งหมดจะใช้เวลาหลายเฟรมและจะมีเวลาที่สูญเปล่า
อย่างดีที่สุดฉันต้องการกำหนดเวลาการโหลดในลักษณะต่อไปนี้:
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
ด้วยวิธีนี้ฉันจะโหลดทรัพยากรก็ต่อเมื่อฉันสามารถทำได้ภายในเวลาที่ฉันมีสำหรับเฟรมนั้น น่าเสียดายที่ต้องมีวิธีการประมาณระยะเวลาที่ใช้ในการโหลดทรัพยากรที่กำหนดและเท่าที่ฉันรู้มักจะไม่มีวิธีการทำเช่นนี้
ฉันหายไปนี่อะไร เกมหลายเกมจะโหลดของพวกเขาทั้งหมดแบบอะซิงโครนัสและไม่มีเฟรมหลุดหรือเวลาโหลดนานมากได้อย่างไร