Ghi Chú Phát Triển (1) - nói dối e blog

Ghi Chú Phát Triển (1)

Sau bao nhiêu ngày tháng vật lộn, cuối cùng chúng tôi cũng chính thức bắt tay vào dự án. Những ngày qua, nhóm đã chìm đắm trong vô số cuộc tranh luận về cách phân chia cổ phần công ty, phân vân giữa việc phải đủ bao nhiêu người mới khởi động được dự án. Rồi lại cãi vã không ngừng về việc nên làm game gì. Dù vậy, với sự hào hứng của các thành viên đã sẵn sàng, Đinh Đương quyết định tự mình cầm trịch.

Chúng tôi hiện chỉ có hơn chục người, văn phòng rộng thênh thang không như hình dung ban đầu - lại còn thiếu cả trưởng nhóm thiết kế. Tôi phải nói với Đinh Đương: “Anh dù sao cũng là game thủ kỳ cựu, dẫn dắt bộ phận game nhiều năm, trải qua bao dự án thành công. Dù chưa từng nấu thịt heo thì cũng đã xem heo chạy cả trăm lần rồi. Tôi không tin anh làm sẽ kém ai. Nếu không phải tôi phải tập trung giám sát phần lập trình, tôi đã tự đảm nhiệm vị trí trưởng nhóm thiết kế rồi. Nhưng có anh đảm nhận, tôi hoàn toàn yên tâm.”

Chúng tôi quyết định để trống vị trí trưởng nhóm thiết kế trong giai đoạn đầu. Trong startup, việc để trưởng nhóm sản phẩm tạm thời kiêm luôn vai trò này là điều hoàn toàn hợp lý. Cũng giống như tôi, dù mang danh CTO nhưng ngoài việc xây dựng kiến trúc hệ thống còn phải trực tiếp code nữa.

Sau hai ngày tranh luận về bảng kế hoạch, hôm nay chúng tôi chính thức khởi công. Về game? Tạm thời chỉ tiết lộ một phần để tránh bị chỉ trích dữ dội. Hơn nữa, ý tưởng lúc này nói ra rồi một hai năm nữa cũng thay đổi, nói nhiều cũng vô ích. Nói ngắn gọn, đây là MMORPG có hệ thống chiến đấu kiểu World of Warcraft nhưng hệ thống cốt lõi hoàn toàn khác biệt - nhẹ nhàng hơn, tập trung vào PvP. Tại sao lại chọn hướng này? Không cần giải thích đâu, đây không phải ý tưởng bốc đồng.

Vì là ghi chú phát triển nên tôi sẽ viết về những việc đang làm và kế hoạch triển khai. Trước tiên, cả nhóm cùng chơi World of Warcraft một tuần. Dù đa phần đều là game thủ cừ, nhưng vẫn có vài người mới tiếp xúc. Mọi người vừa làm quen với hệ thống chiến đấu, vừa cảm nhận phong cách nghệ thuật. Mục tiêu là tạo hứng khởi và định hình cảm quan cho sản phẩm tương lai.

Không đi sâu vào kế hoạch thiết kế mỹ thuật và thiết kế trò chơi, tôi sẽ tập trung vào phần lập trình. Trước giai đoạn Closed Beta có 8 mốc quan trọng, đến giai đoạn một sẽ có bản chạy nội bộ. Lần này chúng tôi hoàn toàn không dùng lại bất cứ thành quả nào tích lũy trước đây ở NetEase, bắt đầu từ con số không tròn trĩnh. Dù vậy, với những lập trình viên có kinh nghiệm, việc xây dựng lại từ đầu thực ra không quá phức tạp. Đây là cơ hội mà bao lập trình viên ao ước.

Chúng tôi đã mua một engine 3D (không tiết lộ chi tiết), giúp nâng tầm điểm khởi đầu. Về server, sẽ tận dụng các thư viện mã nguồn mở đã chứng minh hiệu quả.

Mục tiêu giai đoạn một là hoàn thiện hệ thống đăng nhập, di chuyển trong cảnh, thực hiện các hành động: chạy, nhảy, đi bộ, cưỡi thú…

Ba lập trình viên giai đoạn này:

  • Vân Phong: Định hướng tổng thể, thiết kế giao thức và xây dựng một số module server
  • Công ty Quái vật: Thiết kế và triển khai client
  • Ốc Sên: Phụ trách chi tiết và triển khai server

Tranh luận gay gắt đã trở thành truyền thống, ngay từ hôm nay đã bắt đầu. Theo惯例, ý kiến tôi không thể thuyết phục toàn bộ nhóm. Nhưng chúng tôi đã thỏa hiệp: làm theo ý tôi trước, hoàn thiện bản mẫu vào cuối tuần sau. Dựa trên các vấn đề phát sinh, chúng tôi sẽ điều chỉnh hoặc tái thiết kế hoàn toàn. Một tuần rưỡi là khoảng thời gian chấp nhận được.

P/s: Lập trình viên là giống loài kỳ lạ. Những coder giỏi luôn có tư duy độc lập, trân trọng dòng code mình viết ra. Việc triển khai ý tưởng của người khác là điều cực hình, cảm giác như đang lãng phí sinh mạng. Vì vậy, hầu hết dự án thành công đều do một người khởi xướng. Trong công ty lớn, nhiều senior engineer thích tuyển những tân binh “tiềm năng”, vì họ như tờ giấy trắng dễ uốn nắn. Nhưng kết quả thường là: hoặc tạo ra một người tầm thường không đảm đương được vai trò, hoặc cuối cùng lại mâu thuẫn về lựa chọn kỹ thuật. Tôi luôn khuyên họ: Hãy tự hỏi có muốn suốt ngày nghe theo ý kiến người khác không? Nếu không, đừng bắt người khác nghe theo bạn.

Gợi ý thiết kế của tôi như sau:

Hệ thống game (giai đoạn một) bao gồm các thành phần chính:

  • Client: Chạy trên thiết bị người dùng, kết nối server gateway qua TCP
  • Gateway: Tổng hợp tất cả client, thiết kế dựa trên ý tưởng từ nhiều năm trước với vài điều chỉnh nhỏ
  • Agent: Chạy phía sau gateway, mỗi client có một agent chuyên dịch thuật và xử lý yêu cầu. Các agent có thể chia sẻ cùng tiến trình hoặc tách biệt, chạy dưới dạng máy ảo script hoặc hình thức khác. Lần này có thể dùng các state Lua độc lập cho từng agent
  • Dịch vụ dữ liệu: Lưu trữ dữ liệu người chơi và cảnh. Frontend dùng code và giao thức riêng để giao tiếp, backend dùng Redis
  • Quản lý cảnh: Quản lý cảnh tĩnh và bản sao động
  • Các server cảnh: Nơi diễn ra hoạt động di chuyển của người chơi

Các dịch vụ sau gateway tin cậy lẫn nhau, kết nối thành mạng ảo. Dùng ZeroMQ làm tầng truyền dẫn, giao thức Google Protobuf. Giao thức giữa client-agent và giữa các thành phần server sẽ tách biệt, không nhất thiết dùng cùng chuẩn kỹ thuật hay phong cách thiết kế.

Chìa khóa thiết kế nằm ở Agent. Phần lớn công việc sẽ tập trung vào module này. Quy trình một agent đại diện cho giai đoạn một như sau:

  1. Chờ xác thực người dùng
  2. Gửi xác thực đến server xác thực, thất bại quay lại bước 1
  3. Lấy dữ liệu người dùng từ DB (giai đoạn một chỉ có username và hình tượng mặc định) gửi về client
  4. Xác định cảnh người dùng đang ở, yêu cầu manager tìm server cảnh và đăng ký vào
  5. Đồng bộ môi trường từ server cảnh
  6. Chuyển tiếp yêu cầu di chuyển, đồng bộ dữ liệu cảnh thời gian thực
  7. Khi client gặp lỗi hoặc đăng xuất, thông báo server cảnh người dùng rời đi

Khác biệt nhỏ so với thiết kế server game truyền thống: tôi cho rằng vị trí, trạng thái hành động, thậm chí các giá trị chiến đấu trong tương lai nên thuộc về dữ liệu cảnh, chứ

0%