Bao nhiêu bộ nhớ chiếm một kết cấu trên GPU?


9

Một png lớn trên đĩa có thể chỉ chiếm vài megabyte nhưng tôi tưởng tượng rằng trên gpu, png tương tự được lưu trữ ở định dạng không nén, chiếm nhiều dung lượng hơn. Điều này có đúng không? Nếu nó là sự thật, bao nhiêu không gian?

Câu trả lời:


16

Các tệp JPG và PNG hầu như sẽ luôn nhỏ hơn trên đĩa so với trong bộ nhớ; chúng cần được giải nén nhanh chóng để có được dữ liệu RGB thô, do đó đòi hỏi nhiều sức mạnh xử lý hơn cho việc tải và nhiều RAM hơn sau đó. Vì vậy, nhiều công cụ hiện đại chọn lưu trữ cùng định dạng trên đĩa như trong bộ nhớ, dẫn đến các tệp có cùng kích thước với yêu cầu bộ nhớ của kết cấu (nhưng cũng lớn hơn PNG hoặc JPG). RGB / RGBA và S3TC / DXTn / BCn là các định dạng được sử dụng rộng rãi nhất, bởi vì chúng được đọc thẳng vào bộ nhớ mà không cần xử lý (kết cấu DXT được nén trước).

Vì vậy, đây là các kích thước cho các định dạng kết cấu phổ biến khác nhau:

  • L (độ chói, ví dụ như thang độ xám): chiều rộng * chiều cao * 1 byte.
  • LA (độ chói và alpha, phổ biến cho phông chữ): width * height * 2 byte.
  • RGB (màu, không có alpha): chiều rộng * chiều cao * 3 byte.
  • RGBA (màu với alpha): chiều rộng * chiều cao * 4 byte.
  • DXT1 / BC1 (màu, alpha nhị phân): (chiều rộng * chiều cao * 4 byte) / 8 (tỷ lệ nén 8: 1).
  • DXT3 / BC2 (màu, alpha sắc nét) / DXT5 / BC3 (màu, độ dốc alpha): (chiều rộng * chiều cao * 4 byte) / 4 (tỷ lệ nén 4: 1).

Nếu bạn sử dụng một hình ảnh với mipmap , kết cấu sẽ cần 4/3 bộ nhớ. Ngoài ra, chiều rộng và chiều cao kết cấu có thể được làm tròn bên trong để trở thành sức mạnh của hai trên phần cứng cũ hoặc có khả năng kém hơn, và trên một số phần cứng rất hạn chế, cũng buộc phải là một hình vuông.

Thông tin thêm về DXT: đó là một nén mất mát; điều này có nghĩa là, một số dữ liệu màu bị mất khi nén kết cấu. Điều này có tác động tiêu cực đến kết cấu của bạn, làm biến dạng các đường viền sắc nét và tạo ra các "khối" trên độ dốc; nhưng lợi ích tốt hơn nhiều so với nhược điểm (nếu bạn có kết cấu trông tệ hại khủng khiếp trong DXT, chỉ cần giữ cho nó không bị nén; những cái khác sẽ bù cho việc giảm kích thước). Ngoài ra, do các pixel được nén bởi các khối có kích thước cố định, chiều rộng và chiều cao kết cấu phải là bội số của bốn.


Điều này đúng ngoại trừ câu đầu tiên của bạn - định dạng của kết cấu trên đĩa có thể là bất kỳ định dạng được nén cao nào và do đó, nó không chiếm cùng một không gian trên đĩa như trong VRAM ngoại trừ các định dạng đĩa được xê-ri hóa trực tiếp các định dạng bộ nhớ.

Tất nhiên là có thể, nhưng hãy kiểm tra các tài sản được sử dụng trong các trò chơi được xây dựng bằng Unreal Engine, Source, v.v. Chúng thường không được nén trên đĩa, vì ngày nay có quá nhiều không gian đĩa để không bị nén tài nguyên; và không gian được lưu không bù cho RAM và thời gian CPU cần thiết để giải nén các tệp trên mỗi lần tải.
r2d2rigo

1
Tôi nghĩ bạn sẽ thấy thay đổi từ động cơ này sang động cơ khác. Nhiều động cơ lớn hơn - đặc biệt là các động cơ hoạt động trên bảng điều khiển - sẽ sử dụng định dạng đĩa giống hệt hoặc gần với định dạng bộ nhớ. Nhưng thật dễ dàng để tìm thấy các trò chơi chỉ dành cho PC vận chuyển với tài sản PNG hoặc JPEG. Nếu bạn phải vào đĩa để tải, điều đó sẽ chi phối thời gian của bạn. Thêm vào đó, Mike đặc biệt đề cập đến PNG và JPEG là định dạng đĩa.

Chủ yếu là chính xác, ngoại trừ các định dạng RGB thường không thực sự tồn tại trên GPU; xem: opengl.org/wiki/Common_Mistakes#Texture_upload_and_pixel_reads
Maximus Minimus

9

Rõ ràng: Nó phụ thuộc vào định dạng.

Hãy lấy một kết cấu vuông 256 x 256 pixel. Nếu nó không nén 32 bit với kênh alpha (tính Colorbằng XNA) thì phải mất 256KB ( 256*256*4byte).

Các định dạng 16 bit (ví dụ: Bgr565 :) rõ ràng sẽ có kích thước bằng một nửa - 128KB .

Sau đó, bạn nhận được vào các định dạng nén. Trong XNA, bạn có DXT1, DXT3 và DXT5 (còn được gọi là Nén S3 ). Đây là một định dạng nén mất mát. Nó cũng là một định dạng dựa trên khối - có nghĩa là bạn có thể lấy mẫu từ nó (bởi vì bạn biết khối pixel nào nằm trong đó). Nó cũng nhanh hơn, vì bạn sử dụng ít băng thông hơn.

Tỷ lệ nén của DXT1 là 8: 1 và đối với DXT3 và DXT5 là 4: 1.

Vì vậy, hình ảnh DXT1 của 256x256 là 32KB . Và DXT3 hoặc DXT5 là 64KB .

Và sau đó có mipmapping . Nếu điều này được bật, điều này sẽ tạo ra một loạt hình ảnh trong bộ nhớ đồ họa với kích thước bằng một nửa kích thước trước đó. Vì vậy, đối với hình ảnh 256x256 của chúng tôi: 128x128, 64x64, 32x32, 16x16, 8x8, 4x4, 2x2, 1x1. Một kết cấu với mipmapping là khoảng 133% kích thước của bản gốc.


4

Hầu hết các GPU chỉ có thể đọc một định dạng nén rất cụ thể. ví dụ. BC *, DXT *, không phải định dạng như png. Vì vậy, có, đúng với hầu hết các phần .png sẽ chiếm nhiều dung lượng trong bộ nhớ video hơn trên đĩa.

Hoạ tiết có thể được lưu trữ nén hoặc không nén trong cả bộ nhớ video và bộ nhớ hệ thống.

Đối với kết cấu không nén, quy tắc chung là nó sẽ chiếm cùng một dung lượng trong bộ nhớ video giống như ở dạng không nén trong bộ nhớ hệ thống.

Đối với kết cấu nén DXT1. GPU lưu trữ 8 byte cho mỗi ô xếp 4 x 4 trong kết cấu của bạn. Dữ liệu không nén (ở mức 8 bit trên mỗi kênh RGB) thường sẽ là 4 x 4 = 48 byte, do đó, tỷ lệ nén là 6: 1. Đối với kết cấu nén DXT3 / DXT5, GPU lưu trữ 16 byte cho mỗi ô xếp hình 4 x 4 trong kết cấu của bạn. Đó là tỷ lệ nén thấp hơn 3: 1.

Có một số cảnh báo với cả kết cấu không nén và nén:

  • Hầu hết bộ nhớ được phân bổ trong các trang (kích thước thay đổi giữa các GPU) có kích thước cố định. ví dụ. 4KB và thường không được phân bổ phụ và chia sẻ với dữ liệu gpu khác. I E. nếu dấu chân kết cấu của bạn nhỏ hơn kích thước trang, dấu chân trong vid mem thường sẽ vẫn là kích thước trang.

  • Một số gpus có yêu cầu căn chỉnh rất cụ thể. Trước đây, một số GPU có yêu cầu rằng kết cấu phải có sức mạnh 2 kích thước. Điều này thường được yêu cầu để hỗ trợ một đại diện bị xáo trộn (xem Đặt hàng Morton: http://en.wikipedia.org/wiki/Z-order_(curve )) để cải thiện địa phương truy cập khi lấy mẫu từ kết cấu. Điều này có nghĩa là kết cấu có kích thước lẻ sẽ được đệm để duy trì các yêu cầu này (thông thường, phần đệm này được xử lý bởi trình điều khiển). Mặc dù thứ tự vữa không nhất thiết phải được sử dụng trong gpus hiện đại, nhưng vẫn có thể có sự phình to để hỗ trợ các yêu cầu cụ thể của gpu.

  • Nhiều biểu diễn kết cấu của bạn có thể tồn tại trong bộ nhớ tại bất kỳ thời điểm nào, đặc biệt nếu bạn đang sử dụng loại bỏ khóa trên chúng. Điều này có thể làm tăng mức sử dụng bộ nhớ của bạn cho đến khi các biểu diễn không còn được sử dụng bởi gpu (thường là một vài khung hình phía sau kết xuất CPU)

  • Nếu bạn kích hoạt mipmapping, các mip bổ sung sẽ tiêu thụ trung bình khoảng một phần ba mức mip cơ sở. YMMV dựa trên các cảnh báo trên.


0

AFAIK đó là chiều rộng hình ảnh * chiều cao * BPP, độc lập nếu đó là PNG, JPG hoặc BMP. Tôi không biết DDS hoặc các định dạng có thể nén khác được bố trí như thế nào.

Mip-maps sẽ tăng nhu cầu về bộ nhớ video.

Kiến thức của tôi trong chủ đề này có thể hơi lỗi thời. Tôi đã từ bỏ 3D một thời gian trước đây.


2
Hình ảnh cũng có độ cao (hoặc sải chân), là số lượng byte giữa cuối một dòng và bắt đầu của dòng pixel tiếp theo. Không ai khác đã đề cập đến điều này để tôi có thể bị nhầm lẫn.
CiscoIPPhone

1
Thông thường "cao độ" chỉ độ dài của đường quét tính theo byte (như trong Freetype và SDL) và "sải chân" chỉ khoảng trắng giữa các phần tử, có thể là pixel hoặc đường quét (như trong đối số lát 3 của OpenGL và Python). Cả hai giá trị đều cần thiết để xử lý hình ảnh, nhưng "thường" pitch = width * byte_per_pixel và stride = 0. Các thuật ngữ thường được sử dụng một cách lỏng lẻo và nhầm lẫn, vì vậy tốt nhất là kiểm tra tài liệu API cho thư viện bạn chọn.
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.