Tôi đang phát triển một trò chơi lớn có luồng dữ liệu cấp (bao gồm cả bóng đổ) khi bạn di chuyển qua thế giới trò chơi. Tôi không muốn bị cản trở trong tốc độ khung hình của mình vì các trình tạo bóng được biên dịch/liên kết hoặc lần đầu tiên chúng được sử dụng.Bạn có thể tạo trước một bóng đổ trên một sợi nền với bối cảnh riêng của nó không?
Tôi có trình biên dịch đổ bóng của mình và liên kết làm việc trên một luồng riêng biệt với bối cảnh mở-gl của riêng nó. Nhưng tôi đã không thể có được prewarming của shaders để làm việc trên thread riêng biệt (để không có hiệu suất hit khi shader được sử dụng đầu tiên).
Tính năng ưu tiên thực sự không được đề cập ở bất kỳ đâu trong tài liệu iOS hoặc OpenGL. Tuy nhiên nó được đề cập trong OpenGL ES Analyzer (một trong những công cụ có sẵn khi profiling từ xcode). Trong công cụ này, tôi nhận được cảnh báo "Shader Compiled Outside of Prewarming Phase" mỗi khi có thứ gì đó được render với một shader chưa được sử dụng để render cái gì đó trước đó. "Chi tiết mở rộng" cho biết điều này:
"OpenGL ES Analyzer đã phát hiện một trình biên dịch đổ bóng không phải là một phần của giai đoạn khởi động ban đầu. Việc biên dịch Shader có thể mất nhiều thời gian để tránh hoạt động. Để thực hiện điều này, hãy tạo một prewarming passwhen ứng dụng của bạn khởi động và thực hiện một cuộc gọi vẽ với mỗi chương trình đổ bóng được sử dụng, sử dụng bất kỳ cài đặt trạng thái gl nào mà chương trình đổ bóng sẽ được sử dụng kết hợp với các quốc gia như blending, color mask, logic ops, multisamping, định dạng kết cấu và trạng thái nguyên thủy điểm có thể ảnh hưởng đến việc biên dịch bóng đổ. "
Thuật ngữ "biên dịch" hơi khó hiểu ở đây. Các vertex và fragment shaders đã được biên dịch và chương trình đã được liên kết. Nhưng lần đầu tiên một cái gì đó được kết xuất với một trạng thái OpenGL đã cho, nó sẽ thực hiện thêm một số công việc trên trình đổ bóng để tối ưu hóa nó cho trạng thái đó mà tôi đoán.
Tôi có mã để làm ấm trước các trình đổ bóng bằng cách hiển thị tam giác có kích thước bằng không trước khi sử dụng lần đầu tiên.
Nếu tôi biên dịch, liên kết và làm ấm trước các trình đổ bóng trên sợi chính với cùng bối cảnh Open GL như hiển thị bình thường thì nó hoạt động. Tuy nhiên nếu tôi làm điều đó trên các chủ đề nền với bối cảnh Open GL riêng biệt của nó nó không hoạt động (nó vẫn nhận được cảnh báo Analyzer về sử dụng đầu tiên).
Vì vậy, ... có thể là việc tạo sẵn một trình đổ bóng trên một ngữ cảnh riêng biệt không ảnh hưởng đến các ngữ cảnh khác. Hoặc có thể là tôi không có cùng một trạng thái thiết lập bối cảnh riêng biệt. Có rất nhiều tiềm năng Open GL nhà nước có thể cần phải được thiết lập. Tôi đang sử dụng bộ đệm hiển thị ngoại vi trên chuỗi nền để có thể được coi là một phần của trạng thái.
Có ai đã thành công trong việc làm việc trước khi làm việc trên một chủ đề nền không?
Cảm ơn các liên kết. Tôi đã biết rằng vấn đề này cũng tồn tại trên PC. Tôi quan tâm nhiều hơn đến trải nghiệm của mọi người về điều này trên ES OpenGL. Nếu ai đó đã thực hiện công việc này trên iOS hoặc một nền tảng OpenGL ES khác thì điều đó thật tuyệt vời. Nếu không, tôi sẽ phải sử dụng để phát triển một hệ thống mà tôi tính toán trước tất cả các trình đổ bóng có thể được sử dụng ở mức độ và ngữ cảnh mà chúng được sử dụng - sau đó làm ấm trước tất cả trong quá trình tải ban đầu. – Namaste
Liên kết cho Ati là hết hạn. Tài khoản mới: http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2012/10/ATI_OpenGL_Programming_and_Optimization_Guide.pdf –