Tóm tắt: Tôi nhận được FPS làm chậm ngay khi tôi cố gắng nhuốm các họa tiết (nghĩa là: nhân kết cấu với màu trong shader mảnh)
Chi tiết:
Phần cứng: iPod touch 4
Tôi đang vẽ 700 họa tiết trên màn hình bằng glDrawArrays. Và vâng, tôi đang xử lý tất cả những điều này trong một cuộc gọi rút thăm duy nhất. Dưới đây cho thấy cấu trúc dữ liệu của Vertex:
struct Vertex {
float Position[2];
float Color[4];
float Texture[2];
};
Có, tôi đang gửi màu với mỗi đỉnh vì tôi cần chọn lọc một số họa tiết nhưng không phải màu khác. Sau đây là shader mảnh tôi đang sử dụng:
varying lowp vec2 TexCoord;
uniform sampler2D TextureSampler;
void main(void)
{
gl_FragColor = texture2D( TextureSampler, TexCoord );
}
Cho đến bây giờ nó vẫn hoạt động TUYỆT VỜI, mang lại cho tôi 60 FPS đầy đủ !!!
NHƯNG
Ngay sau khi tôi thay đổi shader mảnh thành phần sau (để cho phép pha màu):
varying lowp vec4 DestinationColor;
varying lowp vec2 TexCoord;
uniform sampler2D TextureSampler;
void main(void)
{
gl_FragColor = texture2D( TextureSampler, TexCoord ) * DestinationColor;
}
Sử dụng kết cấu png 64x64 sau có chứa kênh alpha, kết xuất với glEnable (GL_BLEND):
Hiệu suất giảm xuống chỉ còn 47 FPS do thay đổi duy nhất này {chỉ bằng cách nhân với MỘT vectơ} (FPS được đo bằng các công cụ xcode và thám tử OpenGL). Bất cứ ý tưởng những gì đang xảy ra ?
Cảm ơn.
Biên tập:
Tôi cũng đã thử tước bỏ thuộc tính màu đỉnh:
struct Vertex {
float Position[2];
float Texture[2];
};
Và sửa đổi shader mảnh như sau:
precision lowp float;
varying lowp vec2 TexCoord;
uniform sampler2D TextureSampler;
void main(void)
{
gl_FragColor = texture2D( TextureSampler, TexCoord ) * vec4(1.0,0.0,0.0,1.0);
}
Nó đang chạy ở tốc độ 52 FPS cho 700 sprite (mức tăng chỉ 5 FPS). Vì vậy, đây không phải là nội suy, có vẻ như phép nhân cực kỳ tốn kém. Chỉ cần MỘT phép nhân này?