2011-12-16 22 views
10

Tôi đang mã hóa ứng dụng OpenGL ES 1.1 dành cho Android và iPhone. Các công cụ OpenGL ES sống trong một thư viện được chia sẻ và được truy cập thông qua NDK trên Android.OpenGL trên Android so với iOS: tối ưu hóa và nơi chúng khác nhau

Tôi đang tìm cách tối ưu hóa hiệu suất OpenGL của mình. Có rất nhiều định dạng phim và nguồn tài nguyên trên mạng, ví dụ .:

http://www.vizworld.com/2010/02/ngmocos-tim-omernick-optimizing-opengl-iphone/

http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/Performance/Performance.html#//apple_ref/doc/uid/TP40008793-CH105

http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/TechniquesforWorkingwithVertexData/TechniquesforWorkingwithVertexData.html

OpenGL ES 2.0 : Seeking VBO Performance/Optimisation Tips For Many Moving Vertices

When are VBOs faster than "simple" OpenGL primitives (glBegin())?

https://gamedev.stackexchange.com/questions/1068/opengl-optimization-tips

Nhưng kỹ thuật nói chung có được nổi tiếng áp dụng phổ biến, chẳng hạn như:

  • đối tượng sử dụng đỉnh đệm (VBOs)
  • Giảm thiểu tình trạng OpenGL thay đổi
  • Sử dụng kết cấu atlassing nếu có thể để tránh việc phải chọn nhiều họa tiết khác nhau

Một số kỹ thuật có thể nhạy cảm hơn một chút trong các chi tiết cụ thể và có thể khác nhau giữa Android và iPhone và đó là những gì tôi quan tâm. le:

  • Làm xen kẽ dữ liệu đỉnh của bạn bên trong mỗi đỉnh: ví dụ: phối hợp đỉnh; phối hợp kết cấu; bình thường. Có một thứ tự ưa thích của các mục trong interleaving?
  • Đưa từng đỉnh sang bội số tiếp theo của một số byte. Tôi nhìn thấy số 32 bandied về, nhưng cũng đã thấy 4 hoặc 8 ở một số nơi.
  • Xem xét sử dụng một đoạn ngắn hoặc tương tự cho mỗi của Vertex phối hợp, chứ không phải là một phao

Vì vậy, câu hỏi của tôi là: là những gì các chi tiết tốt hơn của optimisations kỳ diệu như trong danh sách cuối cùng trên định khác nhau giữa Android và iPhone ? Nơi chúng khác nhau, chiến lược tốt nhất là gì? Chỉ cần sử dụng một giá trị phù hợp với cả hai thế giới? (Tinh chỉnh chi tiết như vậy trong thời gian chạy tùy thuộc vào nền tảng có thể là một chút trên đầu trang?)

+3

Tôi không có chuyên gia trong lĩnh vực này, nhưng AFAIK tối ưu hóa chủ yếu phụ thuộc vào chip cơ bản. IPhone là (một chút) phù hợp hơn trong các chip GPU, nhưng trong Android bạn có thể có một số chip GPU: Adreno 2xx, PowerVR SGXxxx, Malixxx, Tegra2. Có sự khác biệt về chức năng. Ngoài ra, chỉ cần ra khỏi tò mò? Tại sao bạn sử dụng 1,1 và không 2.0? Tôi nghĩ rằng với các shaders có thể lập trình, bạn có thể tối ưu hóa mã tốt hơn (và tất nhiên ứng dụng của bạn sẽ hỗ trợ ít thiết bị hơn ... nhưng AFAIK hiện nay mỗi thiết bị Android supoorts 2.0) –

+0

Đối với việc sử dụng OpenGL ES1.1: Đó là vấn đề hỗ trợ một số thiết bị cũ hơn . Điểm tốt về chipset! – MeinHeinlein

Trả lời

1

Tối ưu hóa chính (chính thống) được đề cập trong câu trả lời. Tuy nhiên, có một số kỹ thuật khác ít được biết đến có thể áp dụng để render trên các thiết bị di động:

  1. Các tốc độ xung nhịp và băng thông bộ nhớ GPU di động đang thấp hơn đáng kể so với những con quái vật máy tính để bàn. Nó sẽ là khôn ngoan để giảm overdraw và kết cấu truy cập càng nhiều càng tốt. Xem xét sử dụng thuật toán và kỹ thuật loại bỏ bề mặt ẩn ở cấp CPU.

  2. Sử dụng trình thu thập thông tin dành riêng cho nhà cung cấp để tinh chỉnh mã của bạn cho các chip cụ thể. Sử dụng các đường dẫn mã khác nhau nếu hiệu suất thay đổi đáng kể từ nhà cung cấp đến nhà cung cấp.

  3. Một lần nữa, việc điền vào thiết bị di động là điều cốt yếu. Sử dụng các loại dữ liệu nhỏ hơn, ít tìm nạp kết cấu hơn.Điều này đặc biệt đúng đối với màn hình võng mạc của Apple trên iPad mới. Ưu tiên tính toán qua tra cứu kết cấu cho các công thức hợp lý (bạn nên lập hồ sơ).

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