Tôi có một trò chơi chạy khá tốt (55-60fps) trên màn hình võng mạc. Tôi muốn thêm lớp phủ toàn màn hình kết hợp với cảnh hiện có. Tuy nhiên, ngay cả khi sử dụng một kết cấu nhỏ, hiệu suất hit là rất lớn. Có tối ưu hóa tôi có thể thực hiện để làm cho điều này có thể sử dụng được không?Hiệu suất trúng từ pha trộn quad lớn
Nếu tôi sử dụng kết cấu 80x120 (kết cấu được hiển thị khi đang di chuyển, đó là lý do tại sao nó không vuông), tôi nhận được 25-30FPS. Nếu tôi làm cho kết cấu nhỏ hơn, hiệu suất tăng lên, nhưng chất lượng không được chấp nhận. Nói chung, mặc dù, chất lượng của lớp phủ không phải là rất quan trọng (nó chỉ là ánh sáng).
Sử dụng trình kết xuất ở mức 99%.
Thậm chí nếu tôi sử dụng kết cấu hình vuông từ tệp (.png), hiệu suất kém.
Đây là cách tôi có thể tạo các kết cấu:
[EAGLContext setCurrentContext:context];
// Create default framebuffer object.
glGenFramebuffers(1, &lightFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, lightFramebuffer);
// Create color render buffer and allocate backing store.
glGenRenderbuffers(1, &lightRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, lightRenderbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8_OES, LIGHT_WIDTH, LIGHT_HEIGHT);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, lightRenderbuffer);
glGenTextures(1, &lightImage);
glBindTexture(GL_TEXTURE_2D, lightImage);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, LIGHT_WIDTH, LIGHT_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, lightImage, 0);
Và đây là vẽ ...
/* Draw scene... */
glBlendFunc(GL_ONE, GL_ONE);
//Switch to offscreen texture buffer
glBindFramebuffer(GL_FRAMEBUFFER, lightFramebuffer);
glBindRenderbuffer(GL_RENDERBUFFER, lightRenderbuffer);
glViewport(0, 0, LIGHT_WIDTH, LIGHT_HEIGHT);
glClearColor(ambientLight, ambientLight, ambientLight, ambientLight);
glClear(GL_COLOR_BUFFER_BIT);
/* Draw lights to texture... */
//Switch back to main frame buffer
glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);
glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
glViewport(0, 0, framebufferWidth, framebufferHeight);
glBlendFunc(GL_DST_COLOR, GL_ZERO);
glBindTexture(GL_TEXTURE_2D, glview.lightImage);
/* Set up drawing... */
glDrawElements(GL_TRIANGLE_FAN, 4, GL_UNSIGNED_SHORT, 0);
Dưới đây là một số tiêu chuẩn tôi mất khi cố gắng thu hẹp vấn đề. 'Không pha trộn' có nghĩa là tôi glDisable (GL_BLEND) trước khi tôi vẽ quad. 'Không chuyển đổi bộ đệm' nghĩa là tôi không chuyển đổi qua lại từ bộ đệm ngoài màn hình trước khi vẽ.
(Tests using a static 256x256 .png)
No blend, No buffer switching: 52FPS
Yes blend, No buffer switching: 29FPS //disabled the glClear, which would artificially speed up the rendering
No blend, Yes buffer switching: 29FPS
Yes blend, Yes buffer switching: 27FPS
Yes buffer switching, No drawing: 46FPS
Mọi trợ giúp đều được đánh giá cao. Cảm ơn!
CẬP NHẬT
Thay vì pha trộn toàn bộ lightmap sau đó, tôi đã kết thúc viết một Shader để làm việc một cách nhanh chóng. Mỗi mẫu mảnh và hỗn hợp từ lightmap (loại giống như multitexturing). Lúc đầu, hiệu suất đạt được là tối thiểu, nhưng sau đó tôi sử dụng một sampler2d lowp cho bản đồ ánh sáng, và sau đó tôi nhận được khoảng 45FPS.
Đây là shader đoạn:
lowp vec4 texColor = texture2D(tex, texCoordsVarying);
lowp vec4 lightColor = texture2D(lightMap, worldPosVarying);
lightColor.rgb *= lightColor.a;
lightColor.a = 1.0;
gl_FragColor = texColor * color * lightColor;
Tôi nghi ngờ 'glView' đệm công tắc có thể là thủ phạm ở đây. Điều gì đang xảy ra trong những phương pháp đó? Tại sao không sử dụng 'glBindRenderBuffer'? – Justicle
Tôi sẽ nội tuyến các phương pháp để làm rõ. – whooops
Ok để debuf vấn đề perf, hãy thử trước khi rendering lớp phủ (chỉ cần để nó tĩnh cho bây giờ), và sau đó sao chép vào bộ đệm chính mỗi khung. Điều đó sẽ ít nhất cho bạn biết nếu các bộ đệm chuyển mạch chậm (tức là làm hai cuộc gọi đến glBindFrame, glBindRender, glViewport mỗi khung). – Justicle