2010-01-15 38 views
9

Tôi đang cố gắng để tăng hiệu suất của ứng dụng iPhone OpenGL ES. Theo Instruments, việc sử dụng tiler của tôi gần như 100% thời gian, và FPS của tôi là khoảng 24. Tôi muốn có FPS của tôi trên 30. Tôi có thể đến đó bằng cách chuyển đổi từ GL_FLOAT sang GL_SHORT, nhưng trình bày một số vấn đề kỹ thuật khá khó khăn đối với tôi vào lúc này. Tôi không muốn đến đó.GlDrawElements() có hiệu quả hơn glDrawArrays() khi có nhiều đỉnh trùng lặp không?

Vì vậy, tôi đang cân nhắc việc chuyển từ glDrawArrays() sang glDrawElements(). Tôi có 35 mắt lưới tạo thành 708 đỉnh, nhưng rất nhiều đỉnh được chia sẻ giữa các khuôn mặt. Tôi là bản đồ kết cấu nhưng lưới chủ yếu là đồng đều về màu sắc. Các khuôn mặt yêu cầu texturing đặc biệt sẽ được giữ nguyên.

Giả sử tôi có thể cắt giảm một nửa số đỉnh. Hãy cũng nói rằng tôi cũng tổ chức hình học của mình theo cách có ý nghĩa với iPhone: giả sử, sử dụng công cụ Imagination Technologies PVRTTriStrip. Bỏ qua một lượng nhỏ bộ nhớ phụ cho mảng chỉ mục, điều đó có nghĩa là tôi đã cắt giảm băng thông bộ nhớ một nửa vì vậy tôi sẽ thấy hiệu suất khá tốt.

Điều này có đúng không, hoặc tôi thiếu hoặc hiểu nhầm điều gì đó? Lời khuyên được đánh giá cao.

Trả lời

17

Trong trường hợp bất kỳ ai quan tâm, tôi đã tiếp tục và thử điều này, không có phần công cụ PVRTTriStrip. Tất cả các thử nghiệm đã được thực hiện trên iPhone 3G. Tôi đã có thể chia tỷ lệ của tôi xuống từ 708 đến 113. Và kể từ khi tôi dưới 255, tôi đang sử dụng GLubyte làm loại chỉ mục của tôi. Vì vậy, tôi đã đi từ:

35 * (708 * 32) = ~ 774K

Để:

35 * (113 * 32 + 708 * 1) = ~ 148K

nào giảm tổng băng thông bộ nhớ của tôi dưới 20% của nó là gì. FPS của tôi tăng lên ~ 34. Vì vậy, tôi thấy cải thiện 42% trong FPS. Nói chung, tôi khá hạnh phúc. Tôi nghĩ có nhiều thứ để đạt được, nhưng bây giờ tôi có cá lớn hơn để chiên.

Ngoài ra, tôi lọc ra một loạt các tam giác thoái hóa (không phải là loại hữu ích) để có được chỉ số của tôi đếm xuống 522, từ 708. Từ đó tôi thấy tăng lên ~ 40 FPS từ ~ 34 FPS. .

1

Nếu bạn đang sử dụng Tiler bằng 100% dụng cụ (like I was), bạn đang bị hạn chế bởi kích thước hình học của mình. Trong tất cả những điều tôi đã cố gắng để cải thiện hiệu suất, tôi chỉ nhận thấy một vết sưng đáng kể trong tốc độ khung hình khi tôi giảm kích thước hình học. Vì vậy, có, nếu bạn có thể loại bỏ một số đỉnh từ được gửi đi, bạn sẽ thấy một tăng hiệu suất.

Mặc dù bạn nói rằng rất khó để làm, tôi khuyên bạn nên chuyển đổi từ GL_FLOAT thành GL_SHORTs, bởi vì bạn sẽ thấy một bước nhảy lớn trong tốc độ kết xuất. Tôi đã làm điều này trong ứng dụng của tôi, và nó không phải là quá nhiều rắc rối để thực hiện cho các loại trở lại tôi nhận được.

+0

Ồ, tôi hết lòng đồng ý với bạn. Tôi thực sự đã có nó làm việc tại một thời điểm, nhưng sau đó tôi bắt đầu thực hiện một số tính năng mới, và chuyển đổi GL_SHORT đã gây ra cho tôi vấn đề. Tôi đã ủng hộ nó để tiến bộ về tính năng mới; sau đó, khi tôi đã thêm nó trở lại, tôi đã tìm thấy một lớp phức tạp mới. Nó chắc chắn sẽ là điều tiếp theo tôi cố gắng nếu tôi thấy tôi cần phải ép ra hiệu suất hơn. –

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