Web app của bạn chờ user. Game thì không: nó chạy 60 lần một giây dù có ai chạm hay không — và mỗi frame có hạn chót 16,6 ms.
← / → để chuyển slide · chuyển EN/VI bên dưới
Bỏ đồ họa đi, game chỉ là code bạn đã biết: biến, câu if, và một vòng lặp.
Vài biến: vị trí player, điểm, mạng, thứ đang trên màn hình. Game CHÍNH là trạng thái của nó.
Các câu if làm thay đổi trạng thái: player nhảy chưa? Bóng chạm tường chưa? +10 điểm.
Chạy 60 lần mỗi giây: đọc input → cập nhật trạng thái → vẽ. Mãi mãi, hoặc đến khi thoát.
Framework chạy vòng lặp ấy THAY cho bạn, thêm vật lý, âm thanh, asset — pygame, Unity, Godot.
Kỹ năng code giống hệt, nhưng 'hợp đồng' với thời gian thì khác hẳn.
User bấm, server suy nghĩ, trang quay lại. Không gì xảy ra cho đến khi có ai hỏi. Thời gian làm việc cho bạn.
Chậm vài giây cũng được — không ai đứng nhìn màn hình trống cả.
Màn hình làm mới 60 lần một giây dù player có chạm gì hay không. Trượt hạn 16,6 ms một lần là player CẢM được: giật.
Hạn chót mang tính vật lý, không phải lịch sự.
Một while-true. 60 lần mỗi giây. Đó là toàn bộ bộ xương của mọi game từng được làm.
Bốn việc, mỗi frame, đúng thứ tự.
Hỏi bàn phím/màn hình chạm: player vừa làm gì? Phím bấm, tap, chuột.
Áp dụng quy tắc: di chuyển player, lăn bóng, kiểm tra va chạm, cộng điểm. Trạng thái đổi.
Xóa màn hình và vẽ mọi thứ ở vị trí mới. Đây là thứ duy nhất player thấy.
Ngủ đến khi frame kế tiếp đến lượt — cái này khóa vòng lặp ở 60 fps thay vì quay nhanh hết mức.
1 giây / số frame = ngân sách của bạn. Dùng vào input + update + draw.
| 60 fps | 30 fps | 144 fps | |
|---|---|---|---|
| Mili giây mỗi frame | 16.6 ms | 33.3 ms | 6.9 ms |
| Ai chơi ở mức này | Chuẩn — desktop, mobile, mọi thứ | Điện thoại cũ, mobile nhẹ nhàng | Màn hình tần số làm mới cao, esports |
| Nếu trượt hạn | Một frame giật trong 60 | Ít thấy hơn, vẫn nhận ra ở cảnh nhanh | Bạn chỉ có 6,9 ms — game AAA sống ở đây |
Một frame = một bức ảnh đã vẽ. FPS = số frame mỗi giây. 60 fps = một bức ảnh mới 60 lần mỗi giây.
Một vòng của vòng lặp. 'Cập nhật mỗi tick' = mỗi frame.
Một hình nhỏ để game di chuyển khắp nơi: player, bóng, kẻ địch. Bạn không vẽ pixel — bạn đặt sprite.
Lần kiểm tra 'hai vật này có đè nhau frame này không?' — câu if khiến game có cảm giác vật lý.
Toàn bộ biến của game tại một khoảnh khắc. Lưu state là bạn có thể tạm dừng, cuộn lại, hoặc revive.
Frame trước thực sự mất bao lâu. Nhân tốc độ với nó để laptop chậm chơi cùng tốc độ với máy nhanh.
pygame chạy vòng lặp cho bạn; bạn điền vào input, update, draw. Phím mũi tên di chuyển ô vuông.
import pygame, sys
pygame.init()
screen = pygame.display.set_mode((400, 300))
clock = pygame.time.Clock()
x = 200
while True: # THE loop — 60x per second
for e in pygame.event.get(): # 1. poll input
if e.type == pygame.QUIT: sys.exit()
k = pygame.key.get_pressed()
if k[pygame.K_LEFT]: x -= 5 # 2. update state
if k[pygame.K_RIGHT]: x += 5
screen.fill((15, 23, 42)) # 3. draw
pygame.draw.rect(screen, (110, 231, 160), (x, 120, 40, 40))
pygame.display.flip()
clock.tick(60) # 4. sleep — lock to 60 fps
Đủ rồi: đọc input, cập nhật state, vẽ lại, và clock.tick(60) khóa ở 60 fps.
Cài, chạy, di chuyển bằng phím mũi tên, đóng cửa sổ để thoát.
Chọn một là bạn làm được gần như mọi thứ.
Chuẩn mực ngành cho 2D và 3D. C#, kho asset khổng lồ, và phần lớn mobile hit bạn từng chơi. Miễn phí để bắt đầu.
Open-source, miễn phí hoàn toàn. GDScript (hương vị Python), nhẹ, 2D thật sự xuất sắc. Lựa chọn của giới indie.
Gã khổng lồ AAA: C++ kèm Blueprints (lập trình trực quan), đồ họa real-time tốt nhất. Lớn, nặng, quá sức cho game nhỏ.
| Unity | Godot | Unreal | |
|---|---|---|---|
| Ngôn ngữ | C# | GDScript (+ C#) | C++ (+ Blueprints) |
| Chi phí | Miễn phí đến ngưỡng doanh thu, sau đó chia % | Miễn phí 100%, open source (MIT) | Miễn phí, 5% sau $1M doanh thu gộp |
| Trọng lượng | Nặng nhưng đủ đồ | Nhẹ — editor mở trong vài giây | Rất nặng — sinh ra cho AAA |
| Hợp nhất cho | Indie → 2D/3D tầm trung, mobile | 2D, prototype nhanh, kiểm soát toàn bộ | AAA 3D, đồ họa nghiêm túc |
Cùng một vòng lặp, hai kiểu sở hữu.
Bạn tự viết while-true, đọc input, đồng hồ. Bạn hiểu mọi frame xảy ra thế nào; không có gì miễn phí — không vật lý, không editor, không kho asset.
Dùng để học, hoặc cho game siêu nhỏ.
Engine chạy vòng lặp; bạn viết callback: 'khi tick frame, di chuyển player'. Vật lý, animation, editor, asset — có sẵn.
Dùng cho mọi thứ bạn thực sự định ship.
Trọng lực, nảy, khớp nối — engine cho sẵn một bộ vật lý; bạn chỉ định hướng, nó giải toán.
Sprite sheet, animation khung xương, shader — lý do game trông như game.
Kênh, trộn, âm thanh không gian.
Netcode, độ trễ, đồng bộ hóa — một khóa học riêng.
Tilemap, trình soạn thảo level, world streaming.
Store, review, kiếm tiền — nửa shipper của game dev.
Gọt game đến trơ xương thì nó là biến, câu if, và một vòng lặp — đúng kỹ năng bạn đang xây trong khóa học này. Mọi engine, từ pygame đến Unreal, chỉ là một câu trả lời khác cho cùng một câu hỏi: ai chạy vòng lặp?
Tiếp theo: cùng thói quen ship-it, nhưng trên điện thoại — mobile dev.