Mẹo tối ưu hóa OpenGL [đã đóng]


26

Bạn có mẹo hay thủ thuật nào khi nói đến việc làm cho OpenGL hiệu quả hơn?

Câu trả lời:


16

Sử dụng VBO thay vì glStart () / glEnd (). Điều này giúp tiết kiệm chu kỳ trong việc chuyển dữ liệu vào bộ nhớ của GPU.


7
Hơn thế nữa, glBegin và glEnd không được dùng nữa trong các phiên bản sau và đã bị xóa hoàn toàn (và do đó sẽ không hoạt động) trong các phiên bản 3.x trở lên. Nếu bạn yêu cầu bối cảnh OpenGL 3.x, bạn sẽ không thể sử dụng chúng hoàn toàn.
Slurps Mad Rips

DirectX thực sự buộc điều này theo bạn, nó không có tương đương glStart()/glEnd().
hiệp sĩ666

@SAHChandler Tôi không biết điều đó. Tôi đã không nhận ra nó đã bị phản đối.
MrValdez

3
@SAHChandler: Thật tệ! Tôi đã học tất cả các bản vẽ của mình với glBegin () và glEnd (). Không !!!

8

Mẹo tiêu chuẩn của hồ sơ, hồ sơ, hồ sơ cũng áp dụng ở đây, mặc dù các công cụ hơi khác nhau.

gDEBugger rất tốt trong việc giúp bạn nhìn thấy chính xác những gì đang diễn ra dưới mui xe. Nó đắt tiền, mặc dù.


2
Chỉ muốn thêm rằng bây giờ nó là miễn phí.
DMan

8

Đây là từ các tài liệu tham khảo của Apple về OpenGL nhưng mỗi thứ đều có ích phải không? ;)

Tối ưu hóa hiệu suất OpenGL: Cơ bản
tối ưu hóa thông lượng dữ liệu OpenGL trên OS X

(Cái cuối cùng này là một ứng dụng mẫu)
Tối ưu hóa Vertex

Ngoài ra còn có một số lượng lớn video có sẵn về chủ đề (Cũng từ Apple) nói về các tiện ích mở rộng OpenGL. Một số trong số chúng là dành riêng cho OS X, nhưng một số khác thì khái quát hơn và rất có thể được áp dụng cho Windows và Linux.

Bạn có thể tìm thấy các video ở đây . Tuy nhiên, bạn cần có iTunes và tài khoản Apple để xem chúng (nhưng chúng miễn phí !: D)


7

Chà, nó thực sự, thực sự phụ thuộc vào những gì bạn định làm, nhưng đây là những điều cơ bản:

  • CPU của bạn rất quý trong khi GPU của bạn là một con thú đói. Bù đắp càng nhiều càng tốt cho GPU. Ngày nay bạn có thể làm điều này với các thư viện tuyệt vời như OpenCL, CUDA và Thrust.

  • Làm ánh sáng của bạn trong một shader. Điều này không chỉ giúp duy trì sự tỉnh táo của bạn, mà nó còn cho phép bạn làm những điều rất tuyệt vời như đổ bóng toon và chiếu sáng hoãn lại .

  • Hạt hút. Ngay cả khi sử dụng các sprite điểm OpenGL.


6

Giảm thiểu thay đổi trạng thái của bạn. Trên rất nhiều nền tảng, mỗi thay đổi trạng thái có khả năng tuôn ra đường ống. Sẽ tốt hơn nhiều khi kết hợp các mặt hàng tương tự lại với nhau và thay đổi trạng thái một lần.


4
glEnable(GL_CULL_FACES);

Đơn giản một lớp lót áp dụng loại bỏ mặt sau. Điều này là tuyệt vời để cắt giảm số lượng đa giác. Đồng thời xem xét việc loại bỏ Frustum / Oc Loại để giảm số lượng poly.

Một điều khác để xem xét là SIMD cho các vectơ và bậc bốn của bạn (chủ yếu được sử dụng trong xoay camera). Nếu bạn không muốn gây rối với ASM thì hãy xem libSIMD, một thư viện tuyệt vời để xử lý SIMD trong C.


4

Không sử dụng glGet * khi bạn có thể truy cập các biến cục bộ, ví dụ:

  • Không truy vấn kích thước họa tiết từ OpenGL, lưu trữ chúng khi tải các biến
  • Không truy vấn kích thước chiều rộng / điểm của truy vấn từ OpenGL khi bạn có thể lưu trữ các thay đổi trong ứng dụng của mình

Những cuộc gọi này rất chậm

Di chuyển những thứ không được sử dụng ra bên ngoài mệnh đề glBegin - glEnd (có thể là glColor hoặc glN normal hoặc bất cứ thứ gì khác) nếu nó không thay đổi bên trong. OpenGL là một máy trạng thái, nó sử dụng giá trị cuối cùng.


3

Giảm thiểu các lệnh OpenGL là chìa khóa. Vì vậy, bạn phải bó tất cả các lệnh vẽ. Đối với các trò chơi 2d, nên sử dụng Altas Texture và vẽ tất cả các họa tiết chia sẻ cùng một kết cấu trong một lệnh opengl.


Hãy cẩn thận. Các lô ít hơn và lớn hơn là hữu ích, nhưng tùy thuộc vào các lô "quá lớn" của nền tảng đích sẽ làm giảm hiệu suất.
Andreas

3

Batch, đợt, đợt !! (Ab) sử dụng GPU để kết xuất càng nhiều càng tốt trong mỗi cuộc gọi rút thăm. Các trò chơi hầu hết bị giới hạn bởi số lượng thay đổi trạng thái, không quá nhiều bởi số lượng hình tam giác.

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.