Có một kết cấu chi tiết mất nhiều thời gian để kết xuất?


22

Hãy nói rằng tôi muốn vẽ một hình vuông; kết cấu của nó là "vuông.png."

Là máy tính dễ dàng hơn để kết xuất nó nếu kết cấu chỉ là một màu trơn?

Và nếu nó là một kết cấu rất ồn ào với màu sắc hoàn toàn ngẫu nhiên ở đây và đó thì sao?

Hoặc điều gì xảy ra nếu kết cấu đó ồn ào theo nghĩa là mọi pixel trong nó khác nhau, nhưng chỉ bằng một chút xíu?

Câu trả lời:


39

Giống như hầu hết mọi thứ trong phát triển trò chơi, và đặc biệt là trong đồ họa trò chơi, câu trả lời là "nó phụ thuộc"

Kích thước kết cấu

Độ phân giải của kết cấu của bạn có thể có tác động đến tốc độ kết xuất. Càng chứa nhiều pixel, dữ liệu thô càng có nhiều dữ liệu để tải lên GPU và càng ít kết cấu chúng ta có thể phù hợp với bộ đệm tại một thời điểm, do đó, trình đổ bóng có thể dừng nhiều lần hơn trong khi chờ phần bên phải của kết cấu để được kéo vào bộ nhớ cache.

Sử dụng mipmapping có thể làm giảm tác động của việc này. Với mipmaps, chúng tôi lưu trữ một chuỗi các phiên bản thu nhỏ của kết cấu, mà thoạt nghe có vẻ giống như nhiều bộ nhớ hơn để schlep xung quanh. Nhưng nó cho phép chúng ta đọc từ các phiên bản nhỏ hơn khi kết cấu được hiển thị ở kích thước nhỏ trên màn hình (giống như một vật ở xa trong phối cảnh), vì vậy các mẫu của chúng tôi sử dụng bộ đệm kết cấu tốt hơn thay vì nhảy khắp nơi. Điều này cũng làm giảm răng cưa.

Chi tiết kết cấu

Nội dung của kết cấu của bạn không có tác động đến hiệu quả hiển thị hầu hết thời gian.

Màu sắc chỉ là một loạt các con số liên quan đến GPU, vì vậy nó không quan tâm nhiều đến những con số đó là gì, nó chỉ đưa chúng qua toán học theo cùng một cách. Nó không làm bất cứ điều gì lạ mắt như ghi nhớ "Ồ, tôi đã thấy một pixel màu xanh lá cây này trước đây, tôi sẽ chỉ sử dụng lại cùng một đầu ra mà tôi đã tính lần trước khi tôi thấy đầu vào này" vì vậy liệu kết cấu của bạn có phải là một màu không hoặc lấp lánh ngẫu nhiên, GPU của bạn đang làm công việc tương tự.

Không giống như các định dạng như PNG & JPG, nén hiệu quả hơn ở các khu vực có thể dự đoán của hình ảnh và ăn nhiều bit hơn ở các vùng phức tạp, các định dạng kết cấu GPU như BTC, ETC, PVRTC hoặc thậm chí RGBA thô sử dụng số bit cố định trên mỗi khối pixel. Vì vậy, làm cho kết cấu của bạn chi tiết hơn hoặc ít chi tiết hơn trong khi vẫn giữ nguyên định dạng nén sẽ không thay đổi kích thước dữ liệu hoặc ảnh hưởng đến việc truyền dữ liệu và hiệu quả liên quan đến bộ đệm.

Nhưng, nếu bạn sử dụng một loại chi tiết cụ thể mà lần nén trước của bạn không bảo toàn tốt, bạn có thể buộc phải thay đổi toàn bộ hình ảnh của mình để sử dụng một định dạng khác, một lần nữa có thể thay đổi kích thước dữ liệu của nó.

Phân nhánh & cảm ứng Shader

Đây là dấu sao lớn nhất trong tình huống: bạn có thể đang sử dụng đầu vào màu kết cấu này để đưa ra quyết định, như một if()nhánh. Ở đây, chi tiết quan trọng cho tốc độ.

Các đơn vị tạo bóng GPU hoạt động trên các khối pixel theo lô, chạy cùng một hướng dẫn song song trên nhiều luồng dữ liệu. Vì vậy, khi một số pixel trong khối lấy một nhánh của ifcác pixel khác và các pixel khác lấy một pixel khác, toàn bộ lô phải đi qua cả hai nhánh (che giấu các kết quả không áp dụng cho một bộ pixel hoặc khác)

Nếu đầu vào của bạn thay đổi theo cách trơn tru / có thể dự đoán được, thì có thể bạn sẽ có nhiều khối chỉ cần lấy một nhánh duy nhất và các trường hợp cả hai nhánh này sẽ bị giới hạn ở các dải hẹp quanh biên giới chuyển tiếp. Nhưng nếu đầu vào của bạn là ngẫu nhiên, chúng tôi hy vọng hầu hết các khối sẽ lấy cả hai nhánh và làm chậm kết xuất.

Điều này cũng có thể xảy ra nếu bạn đang sử dụng một kết cấu để kiểm soát tra cứu thành kết cấu thứ hai, như biến dạng hoặc bản đồ chỉ mục. Nếu kết cấu đầu tiên nhảy ngẫu nhiên, thì chúng ta sẽ lấy mẫu từ các điểm ngẫu nhiên, rải rác của kết cấu thứ hai, sử dụng bộ đệm kết cấu của chúng tôi ít nhất quán và trung bình chờ đợi để có được dữ liệu chúng ta cần.


Vì vậy, về tổng thể: không, nội dung của kết cấu không ảnh hưởng nhiều đến tốc độ kết xuất, ngoại trừ các trường hợp khi thực hiện. ;)


Hoạ tiết độ phân giải thấp (nghĩ Minecraft) sẽ có khả năng tải texels cho các pixel liền kề vào bộ đệm khi một texel cụ thể được tải vào bộ đệm, phải không?
dùng253751

6
@immibis Minecraft có kết cấu nhỏ . Mặc định chỉ là 16x16, rất dễ dàng phù hợp với bộ đệm kết cấu của từng lõi mà thậm chí không hài hước: D Và vâng, hầu hết các mẫu kết cấu sẽ ở cùng một texel, trừ khi bạn ở rất xa khối. Điều này đặc biệt đúng nếu bạn tính đến phân khu màn hình - nếu bạn ở gần một cách hợp lý, toàn bộ lô cho một lõi nhất định có thể ánh xạ tới cùng một texel: GPU đơn giản hơn DA có thể hoạt động tốt hơn cho kết cấu độ nét thấp như vậy - tôi nghi ngờ rất nhiều nỗ lực bị lãng phí cho những tối ưu hóa không giúp được gì cho Minecraft.
Luaan

1
Lưu ý bên lề: "Sử dụng cùng số byte trên mỗi pixel" thực sự là chìa khóa cho một số hack tốc độ mà mã đồ họa sử dụng. Nếu bạn đã cố gắng sử dụng PNG trong nội bộ, hoặc thậm chí một cái gì đó như UTF-8 với kích thước pixel thay đổi, để đến npixel thứ, bạn phải trải qua từng pixel trước nó. Với độ rộng byte pixel không đổi, chỉ là start_of_buffer + width * n, nó nhanh hơn nhiều , đặc biệt là đối với lớn n.
Vụ kiện của Quỹ Monica

@Luaan Ý tôi là ngay cả khi bạn ở xa khối, khi nó tìm nạp một texel (bất kỳ cái nào là đầu tiên), nó cũng nên kéo một số cái liền kề vào bộ đệm.
dùng253751

4
Đó là trường hợp tôi nói ở trên với mipmapping. Để tránh việc các mẫu của chúng tôi bỏ qua tất cả xung quanh kết cấu để lại những khoảng trống lớn giữa ít hoặc không sử dụng lại bộ đệm, chúng tôi lưu trữ phiên bản 512x512 và phiên bản 256x256 và đôi khi giảm xuống còn 1x1. Vì vậy, khi vẽ kết cấu 1024x1024 ở 16x16, hầu hết các trò chơi sẽ thực sự được đọc từ mip 16x16 và nó thực hiện tương tự như trường hợp Minecraft 16x16 về hiệu quả bộ nhớ cache. Điều này cũng làm giảm các tạo tác răng cưa lấp lánh từ đường xuống.
DMGregory

1

Cùng với câu trả lời xuất sắc của DMGregory ở trên, có lẽ, có một trường hợp trong đó độ phức tạp của "kết cấu" có thể ảnh hưởng đến hiệu suất kết xuất và đó là kết quả của kết xuất trước được sử dụng làm nguồn trong lần tiếp theo, ví dụ như bản đồ bóng / phản xạ / bản đồ môi trường.

Một số phần cứng hiện đại có thể áp dụng nén không mất dữ liệu cho các bộ đệm này: ví dụ PowerVR có PVRIC , AMD, Delta Color Nén và ARM có một cái gì đó tương tự. Mục đích của các kỹ thuật nén này là để giảm băng thông tổng thể, do đó, có thể cải thiện hiệu suất kết xuất.

Dữ liệu càng đơn giản, có thể là độ sâu hoặc màu (số nguyên hoặc dấu phẩy động), các lược đồ này sẽ hoạt động tốt hơn. Tất nhiên, tôi sẽ không đề xuất cố tình đơn giản hóa đầu ra kết xuất của bạn chỉ để những thứ này hoạt động tốt hơn, nhưng tránh sử dụng dữ liệu ồn ào có thể giúp ích trong một số trường hợp.

Ngoài ra, thực hiện lấy mẫu thưa các bộ đệm khung / độ sâu sử dụng các sơ đồ này, trong nỗ lực vô ích để giảm băng thông, sẽ không giúp ích gì vì chúng rất có khả năng bị chặn.

Hơn nữa bạn có thể tìm thấy hai câu hỏi và câu trả lời về Đồ họa máy tính SE này:

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.