- Có thể phát triển game đủ dễ và thú vị ngay cả khi không dùng game engine thương mại
- Không cần đến phần lớn tính năng của các engine lớn; tự viết công cụ sẽ tăng tính linh hoạt và hiệu quả phát triển
- Tận dụng C# hiện đại và các thư viện mã nguồn mở có thể mang lại môi trường phát triển đầy đủ bất kể quy mô nhóm
- Có thể xây dựng pipeline phù hợp nhu cầu bằng cách kết hợp các thư viện như FMOD, SDL3, Dear ImGui với công cụ tự làm
- Xét về phát triển đa nền tảng, bảo trì và tính khả chuyển, một framework gọn nhẹ tự xây dựng có nhiều lợi thế rõ rệt
Lời mở đầu: suy ngẫm của một nhà phát triển game 20 năm kinh nghiệm
- Đến năm 2025, tác giả vẫn đang phát triển trò chơi điện tử mà không dùng game engine thương mại
- Nhiều người xung quanh thường ngạc nhiên khi thấy tác giả không dùng engine thương mại
- Các tính năng mặc định của những engine lớn như Unity hay Unreal không thỏa mãn bằng việc tự triển khai, và cuối cùng vẫn phải làm lại nhiều phần
- Khi dùng engine thương mại, dễ bị ảnh hưởng bởi các thay đổi chính sách kinh doanh hoặc vấn đề phát sinh từ các bản cập nhật
- Tự làm những công cụ nhỏ vừa khít với từng dự án sẽ hiệu quả hơn và cũng dễ bảo trì hơn về lâu dài
Chọn ngôn ngữ lập trình cần thiết cho phát triển game
- Tác giả đã dùng C# làm ngôn ngữ chủ lực trong thời gian dài
- C# hiện đại đã được cải thiện rất nhiều về hiệu năng, cú pháp và trải nghiệm phát triển so với trước đây
- Có tính năng hot reload như dotnet watch, rất tiện cho việc sửa mã và kiểm thử theo thời gian thực
- Ngay cả người không phải lập trình viên cũng dễ tiếp cận, giúp phân chia vai trò và cộng tác trong nhóm hiệu quả hơn
- Tính năng reflection tích hợp sẵn là một lợi thế lớn khi làm editor hoặc công cụ
Thư viện đa nền tảng và cách triển khai render·input
- Dùng SDL3 để triển khai mọi chức năng cơ bản như cửa sổ, render, controller và hỗ trợ đa nền tảng
- Nhờ lớp trừu tượng GPU của SDL3, việc hỗ trợ nhiều môi trường như DirectX, Vulkan, Metal trở nên dễ dàng hơn
- Trên nền SDL, tác giả dùng một lớp C# tự viết (ví dụ: Foster) làm tiện ích dùng chung
- FMOD là công cụ âm thanh thương mại cuối cùng còn được sử dụng; ngoài ra pipeline được xây dựng dựa trên mã nguồn mở
- Trước đây tác giả cũng từng tự triển khai trực tiếp OpenGL/DirectX, nhưng độ ổn định của SDL là một lợi thế rất lớn
Cách xử lý asset
- Khi không dùng engine có sẵn, chỉ cần nạp đơn giản những tệp thật sự cần cho trò chơi
- Với asset quy mô nhỏ như trong game pixel art, có thể nạp toàn bộ tệp một lần ngay lúc khởi tạo
- Với dự án lớn, chỉ nạp asset khi có yêu cầu và giải phóng bộ nhớ khi chuyển cảnh
- Nếu cần chuyển đổi định dạng, chỉ cần viết script tự động xử lý lúc biên dịch là đủ
Level editor và công cụ UI
- Dễ liên kết dữ liệu với các level editor mã nguồn mở như LDtk, Tiled, Trenchbroom
- Phần lớn trường hợp, tác giả tự triển khai editor tùy biến cho từng dự án
- Không tự viết toàn bộ UI mà tận dụng mạnh Dear ImGui với GUI chế độ tức thời
- Kết hợp reflection của C# với ImGui giúp trực quan hóa trạng thái đối tượng trong game theo thời gian thực
- Khi cần, có thể trộn lẫn công cụ ngoài phù hợp mục đích với công cụ tự làm
Đa nền tảng và khả năng port sang console
- Trước đây việc port sang console khiến C++ gần như là lựa chọn bắt buộc, nhưng điều này đã được giải quyết với C# Native-AOT
- Các framework mã nguồn mở như FNA cũng đang tích cực mở rộng hỗ trợ console
- Nếu tận dụng lớp trừu tượng phổ dụng do SDL3 cung cấp, có thể vận hành cùng một codebase trên hầu hết hệ thống
Môi trường phát triển: hệ sinh thái mở lấy Linux làm trung tâm
- Tác giả đã chuyển nền tảng phát triển chính sang Linux, rất hợp với toolchain mã nguồn mở
- Dù vẫn còn gắn với một số phần mềm thương mại nhất định (ví dụ: vscode, github), nhưng khi hệ sinh thái mã nguồn mở mở rộng thì mức hỗ trợ cũng tăng theo
- Cá nhân tác giả cũng đang thiết lập cùng một môi trường làm việc trên nhiều nền tảng Linux như Steam Deck
Hỏi đáp thêm và các ví dụ
- Về việc dùng Godot: nếu có nhu cầu phát triển xoay quanh engine mã nguồn mở thì khuyến nghị Godot; ngoài ra tác giả thiên về công cụ tùy biến hơn
- Làm 3D: engine lớn có lợi thế, nhưng với các dự án nhỏ và chuyên biệt thì framework tùy biến là đủ
- Nhu cầu công nghệ hiệu năng cao: tùy mức yêu cầu, dùng các engine lớn như Unreal cũng hoàn toàn ổn
- Thay đổi engine ở cấp độ nhóm: phù hợp với phát triển solo/nhóm nhỏ; ngay cả các studio vừa và lớn cũng ngày càng có thêm trường hợp chuyển sang engine tùy biến để tránh rủi ro dài hạn
- Quy trình asset: có thể tự động chuyển đổi tệp Aseprite thành animation bằng cách tận dụng tag và timing tích hợp sẵn
Kết luận
- Việc làm game mà không cần game engine thương mại là một lựa chọn phụ thuộc vào gu cá nhân và cách làm việc
- Chỉ cần ưu tiên nhu cầu và niềm vui, rồi chọn phương pháp phù hợp nhất với bản thân
5 bình luận
Đây là một hoạt động hay.
Tôi là nhà phát triển game thuộc thế hệ đầu tiên.
Trước khi Unreal xuất hiện, các công ty phát triển đương nhiên
tự phát triển engine,
và đó cũng chính là năng lực cạnh tranh của họ.
Việc phát triển engine khi ấy chủ yếu là phát triển công cụ
dựa trên core, kernel, rendering và các thành phần vào/ra khác.
Hồi đó tôi phụ trách các công cụ particle, sound, layer và object,
ban đầu nhóm có 7 người nhưng nếu gom lại thì chắc cũng dễ dàng vượt quá khoảng 20 công cụ.
Từ một ngày nào đó, khi Unreal xuất hiện và các game sản xuất hàng loạt
tràn ra thị trường, người ta không còn đầu tư vào phát triển engine nữa.
Có lẽ lúc đó rất nhiều người đã ra riêng và lập công ty.
Vậy mà đã là câu chuyện của 27 năm trước rồi.
Giờ đây tôi cũng đã có tuổi và đang làm một công việc khác, không còn là game nữa.
Tôi lại nhớ về những ngày xa xưa khi làm phần core
theo từng chế độ DirectX, OpenGL tùy theo card đồ họa.
Cố lên nhé...
Gần đây tôi định làm một game chiến thuật nên đã tìm engine suốt thời gian dài, đến mức nghĩ rằng thôi thì tự làm một cái còn hơn, nhưng khi thấy một trường hợp đã thực sự làm và thành công thì cảm giác như được tiếp thêm rất nhiều dũng khí.
Ý kiến Hacker News
Sau 5 năm một mình phát triển engine game 2D và làm công việc trả phí liên quan, tôi muốn nói về một điểm quan trọng mà nhiều người không biết
Engine là phần dễ
Điều thực sự quan trọng là tooling xung quanh engine, nội dung và asset pipeline
Import texture, audio, file model (
gltf,fbx, animation, v.v.) từ nhiều nguồn dữ liệu và định dạng khác nhauCác tính năng chỉnh sửa cơ bản trong ứng dụng editor như cắt, sao chép, dán, hoàn tác, làm lại, lưu, xóa
Khả năng hiển thị trực quan và các tính năng để developer có thể tạo và thao tác dữ liệu thực trong editor (entity, animation, scene, audio graph, hỗ trợ scripting, v.v.)
Đóng gói và tiền xử lý dữ liệu như baking static geometry, biên dịch shader, resample và đóng gói texture·audio, tạo asset pack cho nội dung game
Khi xong tất cả những thứ đó, phần runtime thực tế (tức main loop của game và các subsystem bên dưới) chỉ là một phần nhỏ của toàn bộ hệ thống
Vì vậy trong game studio, số người phụ trách engine rất ít, còn đa số là programmer làm tool
engine detonator: https://github.com/ensisoft/detonator
Điều quan trọng là tập trung vào việc tạo engine phù hợp với game của mình thay vì tính đa dụng
UI, nén dữ liệu, v.v. có thể giải quyết bằng library và framework
Việc OP dùng các library nhỏ như imGUI là một ví dụ hay
Vì không phải làm engine cho mọi game, nên có rất nhiều việc thực ra không cần làm
Engine giống như một phần runtime nhỏ gắn vào asset pipeline
Ngày nay ngay cả shader compiler cũng đang ngày càng quan trọng hơn 3D API
Phần thú vị tập trung ở shader compiler, còn 3D API chỉ làm nhiệm vụ thực thi shader và truyền dữ liệu
Khi nói đến engine, mọi người thường có xu hướng tính luôn cả asset pipeline và editor
Engine ngày nay không chỉ là main loop + các hàm 3D API
Ngay cả khi dùng engine như Unity, số developer chỉ viết code rendering là cực kỳ ít
Dĩ nhiên dùng Unity/Unreal cũng không có nghĩa là hoàn toàn không phải dùng tool asset riêng
Gần đây tôi đã làm lại engine cho phần tiếp theo và cực kỳ đồng ý với điểm này
Như tôi viết trong postmortem, khi nói đến engine thì đa số nghĩ đến đoạn code nằm trong file thực thi của game, nhưng trên thực tế tôi thấy phần code không được phát hành cùng game như level editor, content pipeline, debugging/profiling, workflow phát triển mới chiếm tỷ trọng lớn hơn
Phát triển tool là công việc chán và dễ kiệt sức hơn phát triển engine
Đó là lý do nhiều dự án game dùng custom engine bị dừng giữa chừng
postmortem: https://ruoyusun.com/2025/04/18/game-sequel-lessons.html
Tự làm editor từ đầu là một khối lượng công việc rất lớn
Nếu có thể thì nên tận dụng editor sẵn có
Ví dụ như kết hợp TrenchBroom (editor cho Quake) + func_godot, còn 2D thì có Tiled
Để quản lý dữ liệu game từng có CastleDB, nhưng giờ đã được tích hợp với Hide (một editor 3D đầy đủ)
Sau khi làm xong tool, việc thiết kế game và tạo nội dung lại là một giai đoạn lớn khác
Vài năm trước tôi tạo một lớp "sprite" đơn giản bằng SDL2 và một ít C++, rồi thêm các tính năng cơ bản như collision
Nếu phải gọi thứ tôi làm là engine thì nó chỉ giống như một dạng trợ lực xe đạp điện
Điểm là "engine" rất hay dẫn dắt toàn bộ project/game
Rất thường xảy ra chuyện game phải uốn theo engine, nên tôi luôn tránh dùng các engine lớn như Unity
Cuối cùng những engine đó thường chỉ tạo ra cùng một kiểu cấu trúc game, chỉ khác asset
Cá nhân tôi thấy thay vì lãng phí thời gian học engine, có thể bắt đầu với SDL có đường cong học tập ngắn hơn, và SDL còn dùng được cho các project đa nền tảng ngoài game
Game của tôi: https://store.steampowered.com/app/2318420/Glypha_Vintage/
Dù tự làm engine mất nhiều thời gian, tôi muốn hỏi rằng để thực sự thành thạo Unreal hay Unity đến mức có thể biến ý tưởng thành game ngay lập tức thì cần bao nhiêu thời gian
Rốt cuộc khi hoàn thành engine của riêng mình, tôi cũng sẽ có ngay mức độ chuyên môn đó, nên về dài hạn sẽ tiết kiệm thời gian
Càng có nhiều kinh nghiệm kỹ sư thì tự làm càng có lợi về mặt thời gian
Game càng độc đáo hoặc càng thuộc thị trường ngách thì việc tự làm càng hợp lý
Việc lạc trong UI phức tạp của Unreal hàng tháng trời rồi nhận ra thứ mình muốn vốn gần như không thể làm bằng engine đa dụng là rất kém hiệu quả
Ngược lại, nếu làm một open-world RPG siêu quy mô thì tự làm không phải lựa chọn tốt
Những ràng buộc của custom engine đôi khi lại khơi dậy sáng tạo, và kể cả không đạt đỉnh cao kỹ thuật thì game vẫn có thể độc đáo hơn
Tôi đã từng tự làm engine
Lúc đầu mất khoảng 1 năm với vô số thử-sai và ngõ cụt
Tôi đã triển khai gần như mọi subsystem có trong game: 3D rendering, UI thích ứng, skeletal animation, save file, smart object, pathfinding, scripting, audio, physics, v.v.
Đặc biệt là tự triển khai tính năng tua ngược (giống hệ thống của Braid)
Những tính năng như vậy đòi hỏi mọi subsystem trong engine (script, physics, v.v.) đều phải hỗ trợ
Vì tôi biết mọi phần trong engine mình làm ra nên có mức tự do cực lớn khi phát triển thêm tính năng
Nhưng sau 1 năm phát triển, tôi dần burnout và mất động lực
Tôi không rõ Unreal, nhưng với Unity thì phát triển nhanh hơn ít nhất 10 lần so với tự code
Thêm tính năng vật lý chỉ mất 1 phút, còn với engine tự làm thì chỉ riêng tích hợp thư viện ngoài cũng mất 1-2 ngày
Các tính năng trực quan hóa nội bộ mà Noel cho thấy ở Unreal cũng có sẵn trong Unity
Những thao tác chỉnh sửa như điều khiển bounding box cũng được tích hợp mặc định
Nếu hành vi mặc định của engine chưa đủ, có thể dễ dàng mở rộng bằng ImGui hoặc CSS engine dựa trên Yoga
Nó còn cung cấp vô số tính năng như particle editor nâng cao, shader đã được xử lý bớt độ phức tạp, streaming dữ liệu mô-đun
Về lý thuyết ai cũng muốn tự làm hết, nhưng cuối cùng vấn đề vẫn là thời gian nên ưu tiên hoàn thành
Thời gian để học Unreal hay Unity đến mức triển khai được ngay ý tưởng game, và thời gian để tự làm engine là hai câu hỏi khác nhau
Chỉ cần đưa một ít ý tưởng là tôi có thể làm một prototype chơi được trong vài giờ
Với Unity, ban đầu chỉ cần biết lập trình, còn Unreal thì chỉ với Blueprint cũng có thể đi gần đến mức phát hành game
Xem video làm prototype game kiểu Super Hexagon chỉ trong 10 phút: https://www.youtube.com/watch?app=desktop&v=p8MzsDBI5EI
Yếu tố đặc thù của Unity gần như chỉ là prefab, còn lại đều là khái niệm chung của phát triển game
Từ góc nhìn của một developer Unreal, tôi cũng có thể làm prototype tương tự trong Unity dưới 1 giờ
Giả định “sau khi engine hoàn thành” bản thân nó có thể đã không thực tế
Ngay cả một thao tác đơn giản như
GameObject.Instantiatecũng cần lượng tài nguyên khổng lồ nếu phải tự triển khai trong engineHãy tính đến độ phức tạp của vật lý 2D/3D, shader, hỗ trợ nền tảng, v.v.
Nếu mục tiêu là engine thì hãy làm engine, còn nếu mục tiêu là game thì hãy làm chính game đó
Nếu bạn đã có đủ kiến thức phát triển game để tự làm game engine
Thì chỉ cần một ngày là đủ để học Unreal hay Unity ở mức làm prototype
Để thành thạo hoàn toàn thì mất lâu, nhưng thời gian tạo ra prototype cho game mình muốn là không thể so sánh
Làm game mà không cần engine lớn “làm tất cả mọi thứ” thường dễ hơn, vui hơn, và đôi khi còn hiệu quả hơn
Tuy vậy, khi đào sâu vào những tính năng cụ thể của engine (ví dụ inverse kinematics, animation blending của Unreal), đôi lúc sẽ nghĩ “may mà mình không phải tự vật lộn 2-3 tuần để làm cái này”
Chủ nghĩa tối giản hay chống phình to cũng quan trọng, nhưng những engine đó nổi tiếng vì chúng gánh phần việc nặng thay bạn
Trước đây tôi cũng theo cách này
Khi làm game 3D đầu tiên, tôi tự triển khai input, quản lý object, culling, model loading, thư viện toán, graphics, normal map, SSAA, v.v., và kết quả là tỷ lệ hoàn thành game đúng 0%
Dù vậy, với các project 2D làm vì sở thích, tôi vẫn phát triển không phụ thuộc gì ngoài browser canvas
Về cơ bản browser đóng vai trò như engine
Về ý kiến “may mà không phải tự làm”
Nếu nghĩ dài hạn cho sự nghiệp indie developer, thì dù mất vài tuần, việc hiểu sâu chủ đề + sở hữu 100% source code và giá trị tái sử dụng vẫn lớn hơn
Luận văn tốt nghiệp của tôi là port particle engine dựa trên NeXTSTEP/Objective-C sang Windows 95/Visual C++ (dựa trên OpenGL, có cả mẫu marching cubes)
Những chủ đề như vậy giờ chỉ còn là một phần của một tính năng một dòng trong các engine ngày nay
Dùng engine giúp project tiến nhanh hơn rất nhiều, và không phải tiêu tốn thời gian vào việc xây hạ tầng
Việc phát minh lại bánh xe không phải là niềm vui lớn với đa số mọi người
Những tính năng như inverse kinematics hay animation blending
Nếu là cốt lõi của game thì đáng để tự triển khai, còn nếu không thì chỉ là cái bẫy kỹ thuật không cần thiết
Tôi làm game theo cách của mình với Lua & Love2D
Chính việc tự đặt ra ràng buộc là cốt lõi của niềm vui
Nếu việc phát triển không còn vui nữa thì đó là dấu hiệu có gì đó sai, và nên tìm cách tốt hơn
Game YOYOZO của tôi chỉ nặng 39KB nhưng đã xuất hiện cùng các bom tấn trong danh sách game hay nhất năm 2023 của Ars Technica
https://news.ycombinator.com/item?id=38372936
Sau nhiều năm mua Playdate, tôi mới bắt đầu nghịch SDK và cũng đang học Lua lần đầu
Tôi vẫn thích strong typing và độ an toàn của ngôn ngữ, nhưng Lua là đủ dùng cho hoàn cảnh này
Tôi chỉ mới làm một tech demo nhỏ trong đó văn bản xoay trong không gian 3D giả theo tay quay
https://bsky.app/profile/haydenblai.se/post/3lpgnya4cqk2a
Làm project này khiến tôi nhận ra mình đã quên gần hết lượng giác sau nhiều năm làm CRUD/webapp
Điểm tuyệt nhất của phát triển trên Playdate là sự giải phóng khi có canvas cố định, chỉ cần đặt đúng vị trí pixel là nó chạy y nguyên trên mọi thiết bị
Sau cả chặng đường trước đây chỉ làm responsive UI, trải nghiệm này thật sự rất mới
Mỗi lần thử làm gì đó bằng game engine (Godot, Unity, Unreal, v.v.), tôi đều phải vật lộn với chính engine
Cuối cùng nó giống như đang đặt asset lên một khuôn game đã định sẵn, khiến tôi khó làm ra game mình thực sự muốn
Nếu ví với web development thì nó giống một sản phẩm hoàn thiện kiểu WordPress
Khi cấu hình mặc định không khớp với ý đồ, bạn phải hack và lách đi rất nhiều
“Game template” càng đổ thêm dầu vào lửa cho chuyện này
Bạn có thể mua template khiến game trông như sản phẩm hoàn chỉnh chỉ bằng cách thay màn hình tiêu đề và model
Gần một nửa game mới trên Steam hầu như chỉ là game template Unity/Unreal được đổi skin đôi chút
Một vài ví dụ:
https://assetstore.unity.com/packages/templates/…
https://store.steampowered.com/app/2488370/Cash_Cleaner_Simulator/
https://store.steampowered.com/app/2073910/A_Webbing_Journey/
https://store.steampowered.com/app/3498270/Better_Mart/
https://store.steampowered.com/app/2625420/Drive_Beyond_Horizons/
https://store.steampowered.com/app/3163790/Toy_Shop_Simulator/
https://store.steampowered.com/app/3023600/Horse_Farm_Simulator/
https://store.steampowered.com/app/3124550/Liquor_Store_Simulator/
Trên Google Play, mọi game đều trông giống nhau, lại còn gặp các vấn đề đặc trưng của Unity như tải lâu, lỗi rendering, vỡ chữ, lỗi audio
Nếu là game “idle RPG” chạy quảng cáo trên di động thì có thể chấp nhận, nhưng việc dùng Unity trong VR thật sự rất khó hiểu với tôi
Để đạt yêu cầu hiệu năng của Meta Quest Store, bạn phải mổ xẻ và sửa rất nhiều phần của Unity engine
Rất khó đạt hiệu năng, mà cách làm việc của nó cũng lỗi thời
Nếu muốn tạo phần mềm chất lượng cao thì không thể bắt đầu bằng một engine vốn không đáng tin ngay từ đầu
Tác giả (Noel) là người làm ra game Celeste và đã bán hơn 3 triệu bản
https://en.wikipedia.org/wiki/Celeste_(video_game)
Tôi cũng đồng ý ở mức khá lớn và đang làm một game framework C# thuần code (người kế thừa tinh thần của XNA/Monogame, dùng Sokol thay vì SDL)
https://zinc.graphics/
Điểm mạnh của C# hiện đại: đa nền tảng, biên dịch NativeAOT, native hot reloading, reflection, v.v.
Cá nhân tôi còn thêm cả source generator
Dù hình ảnh tiêu cực trong quá khứ vẫn còn, nhưng sự phát triển của CoreCLR và ngôn ngữ trong 5 năm gần đây thật đáng kinh ngạc
Điều duy nhất tôi mong là Union Types, hiện đã có đề xuất và hy vọng sẽ được thêm vào năm sau
https://github.com/dotnet/csharplang/blob/main/proposals/TypeUnions.md
Tôi mới chỉ dùng C# trong Win32 hoặc Unity, có kiến thức engine cấp thấp bên C/C++, nhưng từng nghĩ C# là không thể cho đa nền tảng như game console
Giờ tôi mới nhận ra là mình đã sai
Với bất kỳ phần mềm nào, tôi thích bắt đầu từ con số 0
Với người đã có kinh nghiệm project lớn thì có thể thấy chậm, nhưng ở giai đoạn startup lại thường nhanh hơn
Chỉ triển khai mức tối thiểu, rồi khi có abstraction, tốc độ thêm tính năng mới sẽ tăng lên
Năng suất giữa phần mềm doanh nghiệp cỡ lớn và mini engine do chính tôi viết là hoàn toàn khác nhau
Code do tự mình viết thì có thể cắt bỏ và refactor ngay, nên nhanh hơn rất nhiều
Đó là lý do tôi thích microservice và team nhỏ
Tự làm mọi thứ thì chắc chắn phải đi qua thử-sai và bãi mìn dễ hỏng vỡ, và cũng mất nhiều năm để hiểu đặc tính thật sự của ngôn ngữ hay nền tảng
Nhưng chính quá trình đó cuối cùng lại tích lũy thành nội lực của developer
Không dùng engine, mà chỉ dùng một framework ở mức như MonoGame thì sao nhỉ, mình khá tò mò~
"Bản thân quá trình đó cuối cùng sẽ trở thành nội lực của chính nhà phát triển" — hoàn toàn đồng ý.