2011-09-07 26 views
5

Tôi chạy công cụ Phân tích ES OpenGL từ các Công cụ trong ứng dụng của tôi, và nó nói rằng sau khi biên dịch bóng đổ, tôi nên thực hiện một cuộc gọi đến glDrawArrays trong một đường prewarming. Vì vậy, tôi đã kiểm tra thời gian của một số shaders tôi đã viết, và thực sự là lần đầu tiên chương trình chạy nó là chậm hơn nhiều.Làm cách nào để khắc phục sự chậm trễ trong lần sử dụng đầu tiên của trình đổ bóng?

Trong mã của tôi, tôi có trình tải đổ bóng chung, không biết đồng phục/thuộc tính của trình đổ bóng, nó chỉ biên dịch nó. Và có vẻ như là nơi tốt nhất để làm mát trước các shader là có (vì vậy tôi không cần phải thêm glDrawArrays ở khắp mọi nơi). Tôi tryed thêm này trong bộ nạp shader của tôi:

glUseProgram(prog); 
glDrawArrays(GL_TRIANGLES, 0, 0); 

Nó cố định sự chậm trễ, nhưng kể từ khi tôi không thiết lập bất kỳ đồng phục/thuộc tính Tôi không chắc chắn nếu nó là an toàn. Ngoài ra nó bằng cách nào đó trông giống như một workaround. Cách tốt nhất để khai trương chương trình là gì?

Trả lời

2

mã của bạn (gần như) hoàn toàn an toàn. Đồng phục không phải là vấn đề vì chúng chứa một số giá trị mặc định. Đối với các thuộc tính, nó không phải là một vấn đề hoặc vì bạn không phát ra bất kỳ đỉnh nào.

Mặt khác, đây có thể là cách dễ nhất để tạo trước các trình đổ bóng, nhưng có thể không phải là cách tốt nhất. Một kỹ thuật tương tự đã được sử dụng ngược lại tại một thời điểm để tạo trước kết cấu (để lấp đầy bộ đệm kết cấu). Nó thường được thực hiện bằng cách hiển thị một vài khung hình trong khi không hiển thị đầu ra. Điều này đã được nhìn thấy ví dụ trong Unreal Tournament, nó hiển thị "Precaching" trong một thời gian ngắn sau khi tải cấp độ. Tôi muốn đề nghị làm như vậy.

+0

Thông tin tuyệt vời mặc dù đây là lần đầu tiên tôi đọc về trình tạo bóng trước. Bạn có bất kỳ tài liệu về điều đó? Nó sẽ hữu ích nhất. Chúc mừng –

+0

Vâng, bởi vì tất cả chi tiết triển khai liên quan đến GPU đều là nhà cung cấp cụ thể và hầu hết là bí mật, tôi muốn nói không có thông tin nào về điều đó (vì không ai biết và luôn thay đổi). Nhưng các khái niệm vẫn giữ nguyên, nếu có một tài nguyên được lưu trữ hoặc tải xuống một cách lười biếng, chỉ cần hiển thị một vài khung để lấp đầy bộ nhớ cache và khiến tài nguyên tải. Không còn gì khác ... –

Các vấn đề liên quan