→ From Coder to Shipper
From Coder to Shipper · Rapid-fire

Game dev — 16 ms mỗi lần

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

Nền tảng

Game thực sự là gì

Bỏ đồ họa đi, game chỉ là code bạn đã biết: biến, câu if, và một vòng lặp.

Một trạng thái

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ó.

Quy tắc

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.

Vòng lặp

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.

Một engine

Framework chạy vòng lặp ấy THAY cho bạn, thêm vật lý, âm thanh, asset — pygame, Unity, Godot.

Điểm tương phản

Game không chờ ai

Kỹ năng code giống hệt, nhưng 'hợp đồng' với thời gian thì khác hẳn.

Web app của bạ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ột game

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ự.

01
Vòng lặp

Vòng lặp game

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.

Một frame

Trong 16,6 ms diễn ra chuyện gì

Bốn việc, mỗi frame, đúng thứ tự.

  1. 1

    Input

    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.

  2. 2

    Cập nhậ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.

  3. 3

    Vẽ

    Xóa màn hình và vẽ mọi thứ ở vị trí mới. Đây là thứ duy nhất player thấy.

  4. 4

    Chờ

    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.

Toán học

Ngân sách mỗi frame

1 giây / số frame = ngân sách của bạn. Dùng vào input + update + draw.

60 fps30 fps144 fps
Mili giây mỗi frame16.6 ms33.3 ms6.9 ms
Ai chơi ở mức nàyChuẩn — desktop, mobile, mọi thứĐiện thoại cũ, mobile nhẹ nhàngMàn hình tần số làm mới cao, esports
Nếu trượt hạnMột frame giật trong 60Ít thấy hơn, vẫn nhận ra ở cảnh nhanhBạn chỉ có 6,9 ms — game AAA sống ở đây
Thuật ngữ

Sáu từ cho 90%

Frame / FPS

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.

Tick

Một vòng của vòng lặp. 'Cập nhật mỗi tick' = mỗi frame.

Sprite

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.

Va chạm

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ý.

Trạng thái

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.

Delta time

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.

Tự chạy thử

Một game trọn vẹn trong 16 dòng

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.

mini_game.py
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.

Trong terminal

Chạy nó

Cài, chạy, di chuyển bằng phím mũi tên, đóng cửa sổ để thoát.

ops@vps — zsh
$ pip install pygame
Collecting pygame
Successfully installed pygame-2.6.1
$ python mini_game.py
← arrow keys move the square · close the window to quit
← that was a real game: loop, input, state, draw
Bức tranh

Ba ông lớn

Chọn một là bạn làm được gần như mọi thứ.

Unity

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.

Godot

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.

Unreal

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ỏ.

Song song

Unity vs Godot vs Unreal

UnityGodotUnreal
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ượngNặng nhưng đủ đồNhẹ — editor mở trong vài giâyRất nặng — sinh ra cho AAA
Hợp nhất choIndie → 2D/3D tầm trung, mobile2D, prototype nhanh, kiểm soát toàn bộAAA 3D, đồ họa nghiêm túc
Lựa chọn

pygame trần vs engine

Cùng một vòng lặp, hai kiểu sở hữu.

pygame trần — bạn sở hữu vòng lặp

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 — nó sở hữu vòng lặp

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.

Ranh giới

Những gì chủ động bỏ qua

Vật lý

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.

Animation & đồ họa

Sprite sheet, animation khung xương, shader — lý do game trông như game.

Âm thanh & nhạc

Kênh, trộn, âm thanh không gian.

Đa người chơi

Netcode, độ trễ, đồng bộ hóa — một khóa học riêng.

Level & thế giới

Tilemap, trình soạn thảo level, world streaming.

Ship game

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?
toàn cảnh

Sáu mươi frame. Mỗi frame mười sáu mili giây.

Tiếp theo: cùng thói quen ship-it, nhưng trên điện thoại — mobile dev.