30/09/2018, 19:38
Hỏi về Surface, Texture, Renderer trong thư viện SDL của C++?
Thực sự mình đang rất là khó hiểu về 3 thứ bên trên, mình không thể định nghĩa chính xác hay hiểu được 3 cái đấy dùng khác nhau như thế nào? Thế nên mình muốn hỏi vài câu.
- Surface là gì, Texture là gì, Renderer là gì?
- Surface dùng khi nào, Texture và Renderer dùng khi nào?
- Điểm khác biệt trong cách sử dụng giữa Suface và Texture?
- Còn thư viện nào dùng trong C++ có chức năng tương đương SDL2 không ?
Bài liên quan
Mọi người cho mình chút nhận xét về Cocos2D-x với.
Cocos2D-x so với SDL thì thế nào?
Cái nào nhẹ hơn, mượt hơn? Vì sao?
Cái nào dễ dùng hơn? Vì sao?
Cái nào mạnh hơn? Vì sao?
Mình cám ơn rất nhiều nhiều nhiều.
Surface là 1 cái hình (image), nhưng gần với software hơn: Surface tồn tại trên RAM, mỗi lần vẽ lên màn hình là ngốn CPU để vẽ
Texture cũng là 1 cái hình, nhưng gần với hardware hơn: Texture tồn tại trên VRAM, mỗi lần vẽ là ngốn GPU để vẽ.
Renderer là cái dùng để vẽ… Bản thân SDL_Window ko thể vẽ được, phải gắn 1 cái renderer vô nó, rồi vẽ bằng cái renderer này.
=> Ko nên vẽ với Surface vì nó ngốn CPU. CPU cần cho các process/chương trình khác nữa, nên CPU của mỗi chương trình chỉ lo tính toán logic thôi, còn vẽ là nhiệm vụ của GPU => vẽ với Texture. Để vẽ texture thì cần phải có renderer. Renderer vẽ vào đâu thì khi CreateRenderer có 1 cái parameter là SDL_Window để nó biết vẽ vào đâu.
=> Surface dùng để load hình từ disk lên RAM, rồi convert Surface thành Texture để chuyển cái hình từ RAM vô VRAM, rồi vẽ cái Texture đó vô màn hình SDL_Window bằng cái Renderer tương ứng với SDL_Window đó.
2 cái nó ko giống nhau thì làm sao so sánh được. Nó giống như so sánh database với cả 1 web framework vậy. Chả ai đi so MSSQL với ASP.NET, MongoDB với Django cả…
Cám ơn bạn bài viết về SDL rất dễ hiểu.
Còn phần này bạn nói rõ giúp mình được không? Mình ko biết về database lẫn framework. Mình tưởng là cả SDL và cocos đều là thư viện giúp hiển thị hình ảnh cho C chứ.
1 game theo mình có thể chia ra nhiều phần:
level 1: Core engine: vẽ (renderer), bắt events/inputs (chuột nhấn, phím nhấn), xử lý game logic, v.v…
level 2: Basic game engine: animation, physics, xử lý input, state engines, v.v… Animation sẽ cần phần vẽ ở level 1 để vẽ từng frame, phần xử lý input ở level để chuyển từ ví dụ
đi_bộ
sangnhảy
; Physics ví dụ như lực tác động khi bắn 1 viên đạn, rồi viên đạn bắn trúng vật X thì X sẽ ra sao, rồi lực ma sát, v.v… phần này cần xử lý logic ở level 1.level 3: Game engine: sử dụng những thứ căn bản ở level 2, cung cấp thêm những thứ cần thiết như animation frames, 3d objects (gọi chung những thứ này là sprites), tùy chỉnh trọng lực lớn mạnh thế nào, ma sát của từng material thế nào, mỗi quái có mỗi skill khác nhau, main char có skill gì, v.v… để tạo ra engine riêng cho game mình.
level 4: Game design: sử dụng game engine có từ level 3, tạo ra từng level hay map cho game, tùy chỉnh độ khó của boss, chỉ số của quái, của người chơi, v.v…
SDL2 dừng ở mức level 1. Tức là bạn phải viết level 2, 3, 4 để viết 1 game hoàn chỉnh.
Cocos2D/Unity/Unreal, v.v… dừng ở mức level 2. Muốn viết game hoàn chỉnh thì bạn phải cung cấp sprites, tùy chỉnh các thông số để tạo ra cái game engine riêng, rồi từ game engine này tạo ra game hoàn chỉnh. (level 3, 4)
level càng thấp thì càng mất công phát triển, nhưng bù lại mình có quyền tùy chỉnh nhiều hơn. Vd level 2 có thể có nhiều thứ bạn ko cần (ví dụ bạn viết game 2D thì ko cần phần 3D trong level 2 (Unreal engine sử dụng vẽ 3D cho 2D), hay game bạn là game đơn giản ko cần physics thì ko cần phần physics trong level 2, v.v…) thì khi viết từ level 1 lên bạn có thể bỏ qua những thứ đó, sản phẩm cuối cùng sẽ nhẹ hơn rất nhiều.