2013-02-21 35 views
8

Tôi là rất mới cho OpenGL.Android Openg GL ES 2 vẽ họa tiết lớn chậm

Tôi đang cố gắng vẽ các điểm ảnh kết cấu (2 hình tam giác). Kích thước của kết cấu là 900x900px. Tôi không có vấn đề với một quad nhưng khi tôi cố gắng để vẽ 5-10 quads tôi thấy đáng chú ý chậm lại.

Có lẽ tôi đang làm gì đó sai ...

Code:

public void onDrawFrame(GL10 gl) { 
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); 
    ... matrix calculation ... 
    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0); 
    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); 
} 

vertex shader:

uniform mat4 uMVPMatrix; 
attribute vec4 vPosition; 
attribute vec2 a_TexCoordinate; 
varying vec2 v_TexCoordinate; 
void main() { 
    gl_Position = uMVPMatrix*vPosition; 
    v_TexCoordinate = a_TexCoordinate; 
} 

Fragment Shader:

precision mediump float; 
    uniform sampler2D u_PreviewTexture; 
    varying vec2 v_TexCoordinate; 

    void main() { 
     vec4 color = texture2D(u_PreviewTexture, v_TexCoordinate); 
     gl_FragColor = color; 
    } 

kiểm tra nền tảng là Galaxy S3. Trong profiler tôi thấy rằng khoảng 60ms mất eglSwapBuffers gọi.

Làm cách nào để vẽ hình tứ giác có kết cấu lớn nhanh?

+0

thông tin quan trọng hơn một chút: bitmap có định dạng ARGB_8888 và GL_BLEND được bật. –

Trả lời

4

Điều này có thể là do kích thước họa tiết của bạn và việc triển khai trình điều khiển OpenGL của các thiết bị bạn đang sử dụng.

Hầu hết các GPU hiện đại đều hoạt động khá tốt với kết cấu NPOT (không có điện hai) nhưng điều này khiến cho kết cấu bị thay đổi mỗi khi cần được vẽ đến công suất gần nhất là 2 (trong trường hợp 1024X1024) .

Cố gắng sử dụng 2 giải pháp sau:

1- Chuyển đổi kết cấu của bạn để 1024x1024 và sử dụng tọa độ trong hình học của bạn để chỉ vẽ những gì bạn cần (900x900)

2- Cố gắng tạo mipmaps, nếu bạn có nhiều phóng to thì đây là một vị cứu tinh hiệu suất trong nhiều tình huống.

+0

Nếu kết cấu là nén tĩnh cũng có thể làm giảm băng thông bộ nhớ. Nén ETC1 có thể có sẵn trên tất cả các thiết bị di động. Nó chỉ hỗ trợ định dạng RGB, không có kênh alpha. – marekb

+0

Cảm ơn bạn đã trả lời. Tôi đã cố gắng để mở rộng kết cấu đến 1024x1024 nhưng nó không đưa ra bất kỳ sự khác biệt nào. Và tôi không thể sử dụng ETC1 vì tôi nhận bitmap trong thời gian chạy. Tôi đã cố gắng sắp xếp các cuộc gọi gpu và có vẻ như tất cả các cuộc gọi đều mất chưa đến 2ms ... –

+0

một thử nghiệm khác: 10 quad, mỗi hai có 1024x1024 kết cấu (trộn() được sử dụng): eglSwapBuffers call mất abiut 35-40ms nhưng GPU profiler tất cả quá trình vẽ mất ít hơn 3ms. –

1

S3 của bạn có thể có khoảng 600 triệu lần điền/giây (xem GLBenchmark). Nếu bạn đang kết xuất quad-screen toàn màn hình - mười quad-kết cấu quads cung cấp 20M texels mỗi frame. Giả sử GLBenchmark làm những gì nó nói (đo thông lượng texturing) 20M texels là 1/30 của fillrate, cho 33ms tốt nhất hw có thể xử lý một frame. Framebuffer pha trộn Tôi chắc chắn cạnh tranh tích cực cho các fillrate - 10M pixel pha trộn khá nhiều vì vậy tôi có thể đoán nút cổ chai cũng có thể ở đó.

Những gì bạn có thể thử để đảm bảo phần chậm là gì - giảm kích thước họa tiết để nói, 512x512 và xem nó ảnh hưởng như thế nào đến hiệu suất. Giảm kích thước màn hình của các điểm ảnh kết xuất (đáng kể, như với kết cấu - ví dụ: làm cho nó nửa/phần tư của màn hình).

0

Theo kinh nghiệm của tôi, các vấn đề về hiệu suất kết cấu thường xuất phát từ cách thiết lập tính năng lọc MIPMAP. Rất nhiều hoạt động có thể bị mất với các thông số sau không được thiết lập một cách tối ưu (cài đặt tối thiểu được hiển thị):

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

Nếu có thể, hãy cố gắng vô hiệu hóa kiểm tra chiều sâu. @ marekb của lời khuyên về kết cấu nén cũng cung cấp rất nhiều lợi ích hiệu suất.

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