GL ES: Tối ưu hóa mảnh vỡ


8

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):

nhập mô tả hình ảnh ở đây

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?


Bạn đã bật vsync chưa? Các con số có thể có nghĩa là sau khi thay đổi, bạn bắt đầu bỏ lỡ mọi vsync khác, dẫn đến trung bình 45 FPS.
msell

Tôi đang thử nghiệm trên iPhone 4, tôi cho rằng vsync đã được bật theo mặc định. Nhân tiện, nó đang hiển thị 47 FPS trong Công cụ xcode nên tôi nghĩ vsync hoàn toàn không phải là vấn đề. Nhưng câu hỏi thực sự của tôi là: Tại sao hiệu suất chậm lại và làm thế nào để cải thiện nó?
fakhir

1
Kết cấu của bạn có một kênh alpha? Nếu kết cấu không có kênh alpha và rgb được nhân với vec3, liệu nó có rút được 60 khung hình / giây nữa không?
Sẽ

Vâng, kết cấu có kênh alpha. Xin vui lòng xem các kết cấu đính kèm ở trên.
fakhir

2
SGX 535 lõi đơn, màn hình DPI cao với GPU không bao giờ có nghĩa là xử lý nó. Hiệu suất của đồ họa ở độ phân giải gốc trên các thiết bị đó luôn khủng khiếp. Bạn nên giảm độ phân giải hoặc nhắm mục tiêu 30 khung hình / giây hoặc nhắm mục tiêu phần cứng mới hơn. Bạn đang mong đợi phép màu từ GPU đó. Nó không mất nhiều để chứa nó.
Sean Middleditch

Câu trả lời:


2

Tôi không nghĩ rằng vấn đề hiệu suất đang xảy ra trên phép nhân, nhưng về phép nội suy của bạn DestinationColortrên các hình tam giác, giữa các đỉnh shader và mảnh. Bạn có bốn floats để nội suy giữa các đỉnh cây, cho mỗi phân đoạn cho mỗi sprite.

Đối với 700 sprite 64x64 pixel mỗi pixel, đây là 11468800 thao tác bổ sung cho mỗi khung hình mà bạn đang yêu cầu GPU thực hiện. Rất có khả năng bạn sẽ thiếu một số vsyncs, và do đó giảm xuống còn 40-ish FPS.

Nếu bạn muốn mỗi đỉnh có một màu khác nhau, vì vậy bạn có thể có độ dốc cho mỗi sprite, bạn đã hết may mắn. Ngoài ra còn có một số thủ thuật khác mà bạn có thể muốn thử, nhưng tôi nghĩ rằng đây không phải là trường hợp.

Vì những gì bạn dường như đang làm là nhuốm từng sprite, bạn có thể hạ cấp của bạn DestinationColorxuống a uniform, sử dụng nó trực tiếp trong shader mảnh và thay đổi nó cho mỗi cuộc gọi. Bằng cách đó, không có nội suy sẽ diễn ra. Bạn sẽ mất toàn bộ lô, nhưng bạn có thể bó một chút nếu bạn sắp xếp chúng theo màu.


Tôi đã chỉnh sửa câu hỏi ở trên và thêm một số chi tiết. Về cơ bản, tôi đã thử tước bỏ từng màu của đỉnh và chỉ cần nhân kết cấu với một vectơ CONSTANT, ví dụ: gl_FragColor = texture2D (TextureSampler, TexCoord) * vec4 (1.0,0.0,0.0,1.0); . Có 52 FPS, tăng gần 5 FPS. Nhưng vẫn còn quá chậm so với không có tông màu. Chậm lại 8 FPS chỉ do một phép nhân vector đơn?
fakhir

3
Nhưng nó không phải là một phép nhân duy nhất - nó là ~ 11 triệu mỗi khung hình.
Maximus Minimus

1
@fakhir Độ phân giải của màn hình iPod Touch 4 là 960x640 pixel. Đó là tổng cộng 614400 pixel. Bạn muốn kết xuất 700 sprite 64x64 pixel mỗi pixel. Đó là 2867200 pixel, hoặc gần gấp 5 lần toàn bộ màn hình. Bạn có thể đã nhận được 60 khung hình / giây ban đầu vì trình tối ưu hóa đã tìm ra những gì bạn đang làm và có thể lấy mẫu hình ảnh chỉ một lần, nhưng đừng hy vọng điều đó xảy ra trong mọi trường hợp. Lập trình đồ họa di động bị hạn chế hơn nhiều so với lập trình máy tính để bàn, vì vậy hãy hành động tương ứng.
Panda Pyjama
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.