Sự khác biệt giữa bề mặt và kết cấu (SDL / chung)


83

Bất cứ ai có thể giải thích cho tôi bằng những từ đơn giản sự khác biệt giữa kết cấu và bề mặt là gì? Tôi thấy nó được sử dụng SDL2như SDL_SurfaceSDL_Texture. SDL_Textuređược tạo từ SDL_Surfaceđó lần lượt được tạo từ ảnh / bitmap. Cả hai đều là tập hợp các pixel. Nhưng tôi không thấy sự khác biệt chính giữa chúng (phải làm gì đó với GPU?)

Tôi đã cố gắng google nó nhưng tất cả các giải thích tôi thấy quá phức tạp để hiểu chúng mà không cần tìm hiểu sâu hơn về đồ họa máy tính.


7
Hãy xem câu trả lời của tôi tại đây: stackoverflow.com/questions/21007329/what-is-a-sdl-renderer/… Nó sẽ giải thích SDL_TextureSDL_Surfacecũng như SDL_Renderer. Nói chung, SDL_Texturelà những gì được sử dụng cho vẽ, nhưng khi bạn tải kết cấu thông tin sử dụng SDL_Imagehoặc SDL_ttf, bạn sẽ nhận được dữ liệu như mộtSDL_Surface
olevegard

@olevegard Câu trả lời đó khá là sao chép, tôi thực sự muốn một câu trả lời với một số kiến ​​thức.
này

3
Đúng như bạn giả định, SDL_Surfacechỉ là một tập hợp các pixel trong khi SDL_Texturean efficient, driver-specific representation of pixel datanghĩa là nó có thể được sử dụng bởi GPU wiki.libsdl.org/SDL_Texture . Đã làm điều đó trả lời câu hỏi của bạn? Bạn thực sự cần đào sâu hơn vào đồ họa máy tính để hiểu thêm
olevegard

2
@olevegard Thật tệ là bạn đã không viết điều đó trong câu trả lời của mình. Đây là cơ hội của bạn.
này

Câu trả lời:


84

Về cơ bản, giả định của bạn "phải làm gì đó với GPU?" đúng.

SDL_Surfaceđược sử dụng trong kết xuất phần mềm . Với kết xuất phần mềm, như saloomi2012 đã nhận thấy chính xác, bạn đang sử dụng RAM thông thường để lưu trữ dữ liệu hình ảnh. Vì vậy, trong hầu hết các trường hợp, bạn có thể truy cập trực tiếp bộ đệm dữ liệu liên kết với bề mặt, sửa đổi nội dung của nó, tức là nó đang sử dụng CPU, do đó có tên phần mềm .

SDL_Texturemặt khác, được sử dụng trong kết xuất phần cứng , kết cấu được lưu trữ trong VRAM và bạn không có quyền truy cập trực tiếp vào nó như với SDL_Surface. Các hoạt động kết xuất được tăng tốc bởi GPU, sử dụng API OpenGL hoặc DirectX (chỉ có sẵn trên Windows), sử dụng phần cứng video của bạn, do đó có tên là phần cứng kết xuất.

Không cần phải nói rằng kết xuất phần cứng theo đơn đặt hàng nhanh hơn kết xuất phần mềm và nên luôn được coi là tùy chọn chính.


4
Nếu có khả năng tăng tốc phần cứng, có lợi thế nào để sử dụng SDL_Surface không? Ví dụ: đối với các hoạt động kết xuất nhỏ, chi phí dành cho phần cứng quá lớn?
Timmos

3
@Timmos Kết xuất phần cứng luôn nhanh hơn phần mềm. Tuy nhiên, có một ưu điểm đối với bề mặt phần mềm: vì nó được lưu trữ trong bộ nhớ chính có thể truy cập được bằng CPU, bạn có thể ghi trực tiếp dữ liệu vào nó. Điều này có thể hữu ích nếu bạn muốn tạo kết cấu trong thời gian thực, chẳng hạn như nội dung được tạo theo thủ tục trong trò chơi điện tử. (Mind, mặc dù, rằng các loại ngày nay nhiều thế hệ thủ tục cũng có thể được thực hiện trên GPU sử dụng shaders.)
cemper93

1
@Timmos Bạn có toàn quyền kiểm soát cách bề mặt được làm việc, tạo, kiểm soát đọc ghi đầy đủ, ý tôi là thực sự ... kiểm soát là thứ mà bề mặt mang lại cho bạn. OpenGL và các API như vậy bắt buộc phải hoạt động với GPU vì các nhà sản xuất GPU không cho phép truy cập trực tiếp vào GPU, đó là lý do tại sao đôi khi bạn sẽ nghe thấy mọi người phàn nàn về sự kém hiệu quả với OpenGL hoặc DX hoặc những điều ngu ngốc mà các API đó làm, bởi vì họ có thể viết thứ gì đó nhanh hơn hoặc hiệu quả hơn, nhưng họ không thể, vì họ không có quyền truy cập vào GPU.
Trevor Hart

8

SDL_Texture được tải trong VRAM của thẻ video của bạn thay vì RAM thông thường.


2

Bề mặt sử dụng RAM của bạn và Kết cấu sử dụng thẻ video của bạn nhanh hơn bề mặt.


1

Có thêm thông tin về điều đó trong:

https://thenumbat.github.io/cpp-course/sdl2/05/05.html

Như đã đề cập trong bài học trước, các kết cấu tương đương với GPU hiển thị trên các bề mặt. Do đó, các kết cấu hầu như luôn được tạo ra từ các bề mặt, sử dụng hàm SDL_CreateTextureFromSurface (). Chức năng này ít nhiều thực hiện những gì bạn mong đợi — các tham số là bối cảnh kết xuất và bề mặt để tạo kết cấu từ đó. Cũng như các hàm tạo khác, nó sẽ trả về NULL khi bị lỗi.

Tôi hy vọng nó sẽ giúp bạ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.