2012-01-10 27 views
8

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?

Trả lời

6

Thành thật mà nói với bạn tôi đã khá dốt nát về vấn đề này cho đến ngày hôm qua mặc dù tôi đã làm việc trên tối ưu hóa động cơ của tôi trong một thời gian. Vì vậy, trước hết, cảm ơn bạn cho tip :).

Tôi đã nghiên cứu từ đó chủ đề làm ấm bóng đổ và tôi không tìm thấy nhiều thứ xung quanh.

Tôi đã tìm thấy một đề cập đến các tài liệu AMD chính thức trong một tài liệu có tựa đề "Lập trình ATI OpenGL và Tối ưu hóa Hướng dẫn":

http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=6&ved=0CEoQFjAF&url=http%3A%2F%2Fdeveloper.amd.com%2Fmedia%2Fgpu_assets%2FATI_OpenGL_Programming_and_Optimization_Guide.pdf&ei=3HIeT_-jKYbf8AOx3o3BDg&usg=AFQjCNFProzLiXf5Aqqs4jZ2jOb4x0pssg&sig2=6YV7SVA97EFglXv_SX5weg

Đây là một đoạn trích trong đó đề cập đến sự nóng lên của shaders:

Trích:

trong khi R500 natively hỗ trợ kiểm soát dòng chảy trong đơn vị đoạn che, các R300 và R400 asics không. Điều khiển luồng tĩnh cho R300 và R400 được mô phỏng bởi trình điều khiển biên dịch các điều kiện không sử dụng và bỏ vòng lặp dựa trên các hằng số đã đặt. Mặc dù gia đình Asics R500 hỗ trợ điều khiển lưu lượng, trình điều khiển vẫn sẽ cố gắng biên dịch các điều kiện dòng tĩnh cho phép nó tổ chức lại hướng dẫn đổ bóng để lập lịch trình hướng dẫn tốt hơn. Người lái xe cũng sẽ cố gắng để bộ nhớ cache đi bóng đổ biên dịch cho một điều kiện dòng chảy cụ thể thiết lập trong dự đoán cho tái sử dụng của nó. Vì vậy, khi viết chương trình phân đoạn có sử dụng điều khiển luồng tĩnh, bạn nên "làm ấm" bộ đệm đổ bóng bằng cách hiển thị hình tam giác giả trên khung đầu tiên sử dụng các điều kiện tĩnh phổ biến có điều kiện liên quan đến tuổi thọ của trình đổ bóng.

Lời giải thích tốt nhất mà tôi đã tìm thấy xung quanh là những điều sau đây:

http://fgiesen.wordpress.com/2011/07/01/a-trip-through-the-graphics-pipeline-2011-part-1/

Trích:

Ngẫu nhiên, đây cũng là lý do tại sao bạn thường sẽ thấy một sự chậm trễ lần đầu tiên bạn sử dụng trình đổ bóng hoặc tài nguyên mới; rất nhiều công việc tạo/biên dịch bị trì hoãn bởi trình điều khiển và chỉ được thực thi khi thực sự cần thiết (bạn sẽ không tin rằng một số ứng dụng không được sử dụng tạo ra!). Lập trình viên đồ họa biết mặt khác của câu chuyện - nếu bạn muốn chắc chắn rằng một cái gì đó thực sự được tạo ra (trái ngược với chỉ có bộ nhớ dự trữ), bạn cần phải thực hiện một cuộc gọi vẽ giả sử dụng nó để "làm ấm nó". Xấu xí và khó chịu, nhưng đây là trường hợp kể từ lần đầu tiên tôi bắt đầu sử dụng phần cứng 3D vào năm 1999 - có nghĩa là, nó thực sự là một thực tế của cuộc sống bởi thời điểm này, vì vậy làm quen với nó. :)

Trong bài trình bày này, nó được đề cập đến cách mà động cơ cryteck được thực hiện trên động cơ khóc xa mặc dù nó chủ yếu liên quan đến DirectX.

http://www.powershow.com/view/11f2b1-MzUxN/Far_Cry_and_DirectX_flash_ppt_presentation

Tôi hy vọng các liên kết này có thể trợ giúp theo một cách nào đó.

+0

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

+0

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 –

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