iArt.ai
AI motion graphics software — the After Effects alternative anyone can use. Create animations and explainer videos from a text prompt in minutes.
Trải nghiệm không gian ảo với âm nhạc lofi và các tùy chỉnh môi trường
Translation pending
AI summary · website content
MediaGitHub @24540300825-labOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Web tĩnh (ES modules + importmap, không cần build) + Supabase (Auth ẩn danh, Postgres, Realtime) + WebRTC voice. Người vào đầu = BIN, người thứ hai = VY, người thứ ba bị chặn ("phòng đã đủ").
supabase/migrations/001_init.sql → Run. (Tạo bảng, RLS, RPC, publication, policy cho Realtime private channel.)Project URL và anon/publishable key.config.js, điền supabaseUrl + supabaseAnonKey. Đây là khoá CÔNG KHAI. Không dán service_role vào đâu cả.npx vercel --prod trong thư mục này.vercel.json đã có cache header (assets immutable, hash theo ?v=) và Permissions-Policy cho micro. Vercel cấp HTTPS (bắt buộc cho voice).STUN Google có sẵn (đủ cho đa số mạng nhà). Mạng chặt (4G, wifi công ty, NAT đối xứng) cần TURN. Game dùng thông tin TURN ngắn hạn (1 giờ) do backend cấp: trình duyệt gọi /api/turn (file api/turn.js), hàm này kiểm tra đăng nhập + đang ở trong phòng rồi mới trả thông tin. Khóa bí mật nằm trong biến môi trường Vercel, KHÔNG nằm trong trình duyệt/repo.
CF_TURN_KEY_ID, CF_TURN_API_TOKEN.METERED_APP, METERED_API_KEY.turn: tĩnh trong config.js vẫn dùng được như phương án dự phòng (công khai, không khuyến khích).Mở URL ở 2 trình duyệt/thiết bị: máy 1 = BIN, máy 2 = VY; thử di chuyển, ngủ giường, chat, bấm nút Voice. Mở máy thứ 3 → phải thấy "Phòng đã đủ 2 người". ?perf hoặc F3 hiện overlay FPS.
WASD + Shift (chạy) + E (tương tác) + click để đi; chuột phải/kéo xoay camera. Camera luôn bám nhân vật của mình. T mở chat, M tắt/mở tiếng. Nút 🎙️ Voice = vào cuộc gọi (chỉ tiếng); nút 📹 Video = mở khung video, bật camera trong khung đó.
src/main.js boot: cổng → Session → nạp asset (map + nhân vật của mình) → game.src/net/session.js slot nguyên tử (RPC claim_slot), heartbeat 25s, stale 90s, phát hiện tab trùng (tab mới thắng), Broadcast + Presence.src/net/sync.js đồng bộ: lệnh (move/sleep/sit/…) + input + snapshot 6Hz (1Hz khi đứng yên), nội suy/ngoại suy, snap nếu lệch >3m. Không ghi DB cho dữ liệu tần suất cao.src/net/chat.js chat lưu DB (RLS, trigger điền slot/user phía server), dedupe, unread, bù tin khi mất kết nối.src/net/voice.js WebRTC 2 chiều; tín hiệu qua kênh Realtime; lỗi voice không ảnh hưởng game.src/assets.js + src/manifest.js registry asset: nạp theo yêu cầu, đếm tham chiếu, dispose.src/maps.js danh sách map, chuyển map (fade + reload, đồng bộ qua rooms.map_id).src/perf.js đo fps/p95/hitch/draw calls/tris.Mở rộng về sau: đọc
docs/EXTENDING.md(thêm minigame/tính năng bằng 1 file + 1 dòng, thêm map = 1 khối dữ liệusrc/map-configs.js, giao thức có số phiên bản). PHÒNG VY — Workroom (không gian làm việc của Vy, mở từ bàn phòng Vy): đọcdocs/WORKROOM_ARCHITECTURE.md, hướng dẫn dùng ởdocs/WORKROOM_USER_GUIDE.md.
.glb → chạy python3 tools/optimize_glb.py in.glb assets/map-xxx.glb (nén texture, không đụng mesh/animation).python3 tools/build_manifest.py (sinh lại src/manifest.js kèm hash cache).src/assets.js (def('map-xxx',{owner:'xxx'})), src/maps.js (MAP_LIST), và cấu hình trong src/map-configs.js (giống MC.house).Phát qua api.emit(kind, data) (game.js) và xử lý trong bindSync (sync.js). Dữ liệu nhỏ/hiếm → broadcast; dữ liệu cần lưu → bảng + RLS mới trong migration 002_*.sql.
| Map | Tam giác trước | sau | Draw calls | CPU/khung (ms, headless) |
|---|---|---|---|---|
| house | 2.33M | 0.94M | 306 → 376 | 22.7 → 7.8 |
| studio | — | 0.63M | 438 | 10.0 |
| Biện pháp: gộp mesh, InstancedMesh theo ô 8m + frustum culling + LOD mật độ theo khoảng cách, bóng chỉ gần camera và cập nhật 1/2 khung, nén texture, pixel ratio thích ứng, warm-up shader. FPS thật trên thiết bị phải đo bằng F3 trên máy bạn. |
Chạy với backend giả lập (2 tab Playwright, dev/mock-supabase.js) — mô phỏng, không phải Supabase thật:
PASS: gán slot BIN/VY, nhìn thấy nhau, đồng bộ click-move/WASD/giường, chat 2 chiều không trùng + unread, voice kết nối + có byte audio (mic giả), mute, rời/vào lại voice, F5 giữ slot, người thứ 3 bị chặn, đổi map đồng bộ.
CHƯA kiểm chứng: Supabase thật (RLS, policy realtime.messages, anonymous auth), Vercel thật, TURN/khác mạng, FPS trên GPU thật, ổn định phiên dài, thiết bị di động.
Chạy bằng Chromium thật (Playwright) với camera/mic giả, 2 cửa sổ cùng máy, mạng loopback (host→host), tín hiệu qua kênh giả lập (không phải Supabase thật):
supabaseJs.Chỉ anon key ở frontend. Mọi ghi DB đi qua RPC SECURITY DEFINER hoặc RLS is_room_member(); slot/user của tin nhắn do trigger điền; kênh Realtime private có policy. Không có service_role trong repo.