Ngày xửa ngày xưa, khi> nhanh hơn <Chờ Chờ thì sao?


280

Tôi đang đọc một hướng dẫn OpenGL tuyệt vời . Nó thực sự tuyệt vời, tin tôi đi. Chủ đề tôi hiện đang ở là Z-buffer. Ngoài việc giải thích tất cả những gì về nó, tác giả đề cập rằng chúng ta có thể thực hiện các bài kiểm tra độ sâu tùy chỉnh, chẳng hạn như GL_LESS, GL_ALWAYS, v.v. Ông cũng giải thích rằng ý nghĩa thực sự của các giá trị độ sâu (là trên cùng và không phải) tùy chỉnh. Tôi hiểu cho đến nay. Và sau đó tác giả nói một điều không thể tin được:

Phạm vi zNear có thể lớn hơn phạm vi zFar; nếu có, thì các giá trị không gian cửa sổ sẽ bị đảo ngược, xét về những gì cấu thành gần nhất hoặc xa nhất với người xem.

Trước đó, người ta đã nói rằng giá trị Z của không gian cửa sổ là 0 gần nhất và 1 là xa nhất. Tuy nhiên, nếu các giá trị Z không gian clip của chúng tôi bị phủ định, độ sâu 1 sẽ gần nhất với chế độ xem và độ sâu 0 sẽ xa nhất. Tuy nhiên, nếu chúng ta lật hướng kiểm tra độ sâu (GL_LESS sang GL_GREATER, v.v.), chúng ta sẽ nhận được kết quả chính xác tương tự. Vì vậy, nó thực sự chỉ là một quy ước. Thật vậy, lật dấu Z và kiểm tra độ sâu đã từng là một tối ưu hóa hiệu suất quan trọng cho nhiều trò chơi.

Nếu tôi hiểu chính xác, khôn ngoan về hiệu suất, lật dấu Z và kiểm tra độ sâu thì không có gì khác ngoài việc thay đổi <so sánh thành >so sánh. Vì vậy, nếu tôi hiểu chính xác và tác giả không nói dối hoặc làm cho mọi thứ trở nên tồi tệ, thì việc thay đổi <thành >sử dụng là một tối ưu hóa quan trọng cho nhiều trò chơi.

Được tác giả làm cho mọi thứ lên, tôi hiểu lầm gì đó, hoặc là nó thực sự là trường hợp đó một lần <là chậm ( cực kỳ quan , như tác giả nói) hơn >?

Cảm ơn đã làm rõ vấn đề khá tò mò này!

Tuyên bố miễn trừ trách nhiệm: Tôi hoàn toàn biết rằng độ phức tạp của thuật toán là nguồn chính để tối ưu hóa. Hơn nữa, tôi nghi ngờ rằng ngày nay nó chắc chắn sẽ không tạo ra bất kỳ sự khác biệt nào và tôi không yêu cầu điều này để tối ưu hóa bất cứ điều gì. Tôi chỉ là vô cùng, đau đớn, có thể nghiêm túc tò mò.


6
Liên kết đến hướng dẫn này dường như (gần đây) đã chết. :(
TZHX

@TZHX: Vì câu trả lời được chấp nhận là của tác giả của hướng dẫn, chúng tôi hy vọng sẽ tìm thấy nó một lần nữa. Xem bình luận cuối cùng của tôi cho câu trả lời của anh ấy :)
Armen Tsirunyan

3
Hướng dẫn OpenGL được tham chiếu có sẵn ở đây .
Fons

(a <b) giống hệt với (b> a) nên hoàn toàn không cần thực hiện cả hai thao tác so sánh trong phần cứng. Sự khác biệt về hiệu suất là kết quả của những gì xảy ra do hoạt động so sánh. Đây là một con đường dài và quanh co để giải thích tất cả các tác dụng phụ nhưng đây là một vài gợi ý. Các trò chơi được sử dụng để lấp đầy bộ đệm độ sâu để tránh việc xử lý phân đoạn đắt tiền hơn cho các đoạn bị lỗi kiểm tra độ sâu. Quake được sử dụng để phân chia phạm vi độ sâu thành hai nửa để tránh xóa bộ đệm khung vì trò chơi luôn lấp đầy mọi pixel trên màn hình, v.v.
t0rakka

2
@Fons trông giống như liên kết đã chết, một lần nữa :(
nalzok

Câu trả lời:


350

Nếu tôi hiểu chính xác, khôn ngoan về hiệu suất, lật dấu Z và kiểm tra độ sâu không gì khác ngoài việc thay đổi <so sánh với so sánh>. Vì vậy, nếu tôi hiểu chính xác và tác giả không nói dối hoặc làm cho mọi thứ trở nên phức tạp, thì việc thay đổi <thành> được sử dụng là một tối ưu hóa quan trọng cho nhiều trò chơi.

Tôi đã không giải thích điều đó đặc biệt tốt, bởi vì nó không quan trọng. Tôi chỉ cảm thấy đó là một chút thú vị để thêm vào. Tôi không có ý định đi qua thuật toán cụ thể.

Tuy nhiên, bối cảnh là chìa khóa. Tôi chưa bao giờ nói rằng <so sánh nhanh hơn so sánh>. Hãy nhớ rằng: chúng ta đang nói về các bài kiểm tra độ sâu phần cứng đồ họa, không phải CPU của bạn. Không phải operator<.

Những gì tôi đã đề cập đến là một tối ưu hóa cụ thể cũ trong đó một khung hình bạn sẽ sử dụng GL_LESSvới phạm vi [0, 0,5]. Khung tiếp theo, bạn kết xuất với GL_GREATERphạm vi [1.0, 0.5]. Bạn qua lại, theo nghĩa đen là "lật dấu Z và kiểm tra độ sâu" mọi khung hình.

Điều này làm mất một chút độ chính xác độ sâu, nhưng bạn không phải xóa bộ đệm độ sâu, mà trước đây, nó là một hoạt động khá chậm. Vì việc xóa độ sâu không chỉ miễn phí trong những ngày này mà còn thực sự nhanh hơn kỹ thuật này, mọi người không làm điều đó nữa.


1
Lý do xóa bộ đệm sâu ngày nay nhanh hơn có hai lý do, cả hai lý do đều dựa trên thực tế là GPU sử dụng bộ đệm độ sâu phân cấp. Tuy nhiên, chỉ phải xóa các trạng thái gạch thành xóa (nhanh), thay đổi dấu hiệu so sánh độ sâu, tuy nhiên, có nghĩa là toàn bộ bộ đệm HiZ cần được xóa vì nó chỉ lưu trữ giá trị tối thiểu hoặc tối đa tùy thuộc vào dấu hiệu so sánh.
Jasper Bekkers

3
@NicolBolas: Nhận xét của PerTZHX, liên kết đến hướng dẫn của bạn trong câu hỏi của tôi đã chết. Bạn có thể vui lòng cho chúng tôi biết tất cả các hướng dẫn di chuyển và tùy ý chỉnh sửa câu hỏi không?
Armen Tsirunyan

2
Các hướng dẫn có sẵn trên kho lưu trữ web. Nếu @NicolBolas cho phép, sẽ hữu ích cho cộng đồng nếu chúng tôi có thể di chuyển chúng đến một vị trí dễ tiếp cận hơn. Có lẽ GitHub hoặc một cái gì đó. web.archive.org/web/20150215073105/http://arcsynthesis.org/...
ApoorvaJ

3

Câu trả lời gần như chắc chắn là đối với bất kỳ hiện thân nào của chip + trình điều khiển đã được sử dụng, HV phân cấp chỉ hoạt động theo một hướng - đây là một vấn đề khá phổ biến vào thời đó. Việc lắp ráp / phân nhánh ở mức độ thấp không liên quan gì đến nó - Bộ đệm Z được thực hiện trong phần cứng chức năng cố định và được xử lý theo đường ống - không có suy đoán và do đó, không có dự đoán chi nhánh.


0

Tối ưu hóa như thế sẽ ảnh hưởng đến hiệu suất trên nhiều giải pháp đồ họa nhúng vì nó sẽ khiến bộ đệm khung giải quyết kém hiệu quả hơn. Xóa bộ đệm là một tín hiệu rõ ràng cho trình điều khiển rằng nó không cần lưu trữ và khôi phục bộ đệm khi tạo thùng.

Thông tin cơ bản ít: một rasterizer ốp lát / xử lý màn hình với số lượng các ô rất nhỏ phù hợp với bộ nhớ trên chip. Điều này làm giảm ghi và đọc vào bộ nhớ ngoài làm giảm lưu lượng trên bus bộ nhớ. Khi một khung hoàn thành (hoán đổi được gọi, hoặc các bộ xếp hình bị xóa vì chúng đầy đủ, các ràng buộc bộ đệm khung thay đổi, v.v.) bộ đệm khung phải được giải quyết; điều này có nghĩa là mọi thùng được xử lý lần lượt.

Người lái xe phải cho rằng các nội dung trước đó phải được bảo tồn. Việc bảo quản có nghĩa là thùng phải được ghi ra bộ nhớ ngoài và sau đó được khôi phục từ bộ nhớ ngoài khi thùng được xử lý lại. Hoạt động rõ ràng cho trình điều khiển rằng nội dung của thùng được xác định rõ: màu rõ ràng. Đây là một tình huống không quan trọng để tối ưu hóa. Ngoài ra còn có phần mở rộng để "loại bỏ" nội dung bộ đệm.


-8

Nó phải làm với các bit cờ trong lắp ráp được điều chỉnh cao.

x86 có cả hướng dẫn jl và jg, nhưng hầu hết các bộ xử lý RISC chỉ có jl và jz (không có jg).


2
Nếu đó là câu trả lời, nó sẽ đặt ra những câu hỏi mới. Có phải "nhánh lấy" chậm hơn "nhánh bị bỏ qua" trên các bộ xử lý RISC sớm không? Bây giờ chắc chắn không phải là như vậy theo bất kỳ cách nào có thể đo lường được theo như tôi biết. Bạn có phải viết forcác vòng lặp với một nhánh vô điều kiện ngược và một nhánh có điều kiện, hiếm khi được đưa về phía trước để thoát khỏi vòng lặp không? Nghe có vẻ khó xử.
Pascal Cuoq

54
-1: Câu hỏi này không liên quan gì đến CPU . GL_LESS và GL_GREATER là các hoạt động so sánh độ sâu, chạy trên GPU.
Nicol Bolas

8
Thật buồn cười là bạn có thể nhận được bao nhiêu đại diện cho một câu trả lời đúng với tiêu đề nhưng có rất ít liên quan đến câu hỏi thực tế.
Joshua

7
+1 Không, câu trả lời này đúng với ít nhất một phần của câu hỏi. Câu hỏi là: "Có phải tác giả đang làm mọi thứ, tôi đang hiểu nhầm điều gì đó, hay thực sự là trường hợp một khi <chậm hơn (thực tế, như tác giả nói) hơn>?". Có ba lựa chọn được đưa ra. Câu trả lời này đáp ứng về khả năng của tùy chọn 3. Không nơi nào trong bài viết là công nghệ của CPU / GPU được đưa ra, cũng không phải là GPU (trò chơi 3D đầu tiên có trên CPU). Ok ... Tôi không nghĩ rằng có nhiều Trò chơi 3d trên RISC :-)
xanatos

3
(và thẻ GPU đã được thêm vào lúc 20:34. Bản sửa đổi đầu tiên chỉ có thẻ CPU. Phản hồi này được viết vào lúc
18 giờ 44 phút
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.