Ghi Chú Phát Triển (9): Tổng Kết Công Việc Gần Đây
Dạo này chủ yếu đụng đến mấy việc vụn vặt, không có nhiều tiến triển đáng kể trong công việc chính.
Khung mô phỏng môi trường mạng skynet đã hoàn thiện từ tận cuối tuần trước rồi. Nhưng vẫn đang ngóng chờ nhóm “Ốc Sên” xây xong khung framework thật sự. Hình như hôm qua họ mới hoàn tất, nhưng cần hai ngày điều chỉnh chi tiết thêm. Mong rằng trước Tết có thể tích hợp client và server framework lại với nhau, để đón một cái Tết an lành.
Theo tôi nghĩ, về mặt lý tưởng thì tiến độ có thể nhanh hơn vài ngày. Tuy nhiên hiện tại vẫn nằm trong ngưỡng chấp nhận được. Công việc tích hợp mấy thứ do nhiều người viết khác nhau vốn dĩ đã vất vả. Ví dụ như phần mạng của client công ty quái vật cũng phải tốn thêm vài ngày sửa chữa do thay đổi phương án thiết kế.
Quan điểm của tôi là cố gắng tách biệt thiết kế chi tiết giữa client và server. Giảm sự phụ thuộc chặt chẽ về mặt kiến thức. Nói cách khác, chỉ quy định một vài giao thức cơ bản cho việc truyền thông, rồi để mỗi người tự thiết kế khung code riêng. Cuối cùng mới phối hợp lại. Cách này giúp đảm bảo tính độc lập, phục vụ cho sự phân công công việc và mở rộng về sau.
Bản thân thiết kế rồi tự implement luôn là cách an toàn ít rủi ro nhất. Đặc biệt với những lập trình viên có nhiều năm kinh nghiệm như tôi. Vai trò của tôi hiện tại là cố gắng làm sao để các phần code của mọi người hợp lại với nhau một cách ít lỗi nhất có thể.
Về phía client, hiện tại đã điều khiển được nhân vật 3D di chuyển, chạy và nhảy trong cảnh quan. Nếu lấy chuẩn World of Warcraft làm mốc thì thao tác hiện tại gần như không khác biệt. Đây là cột mốc đầu tiên của chúng ta. Tôi hiểu rõ để đạt được điều này không hề dễ dàng. Thành viên Xiao V đã bỏ rất nhiều công sức, ngày nào cũng thấy anh ấy rời văn phòng sau 22 giờ. Buổi tối toàn dành cho việc tinh chỉnh hệ thống điều khiển hoạt ảnh và camera.
Ngôn ngữ DSL thiết kế cho bộ phận thiết kế kịch bản trước đó cũng đã được bổ sung nhiều tính năng qua quá trình sử dụng tuần này. Code của tôi sửa đi sửa lại nhiều lần, đến mức cuối cùng đã truyền đạt thành công một phần tư tưởng lập trình hàm (functional programming) cho mấy anh em không biết lập trình. Các anh ấy còn khen là viết đã tay, có thể test kết quả chiến đấu ngay trong cái sandbox tôi xây. Đây cũng được xem là bước nhỏ thành công trong việc tách biệt logic chiến đấu. Vấn đề hiệu năng có thể để giai đoạn sau xử lý. Một trong những mục tiêu thiết kế DSL cũng chính là để lại không gian tối ưu hiệu năng về sau. Nếu dùng ngôn ngữ phổ thông, có lẽ tôi phải nhờ đến mấy thứ kiểu LuaJIT mới được.
Về mặt logic server, sau Tết tôi dự định tích hợp suôn sẻ các phần đã nghĩ đến trước đó. Vẫn sẽ tự làm prototype trước để thăm dò độ sâu. Phương án là dùng mô hình agent như ý tưởng ban đầu: tập trung code phục vụ từng client vào service agent, rồi để agent giao tiếp với các service nội bộ khác. Dữ liệu tải lên sử dụng phương pháp shared memory, agent sẽ gửi tín hiệu tới module bền vĩnh (persistent module) để thực hiện tải hoặc lưu trữ, từ đó nhận về block dữ liệu có cấu trúc.
Với vấn đề trạng thái chia sẻ trong quá trình xử lý logic, tôi áp dụng mô hình sản xuất - tiêu thụ đơn giản. Mọi thao tác sửa đổi dữ liệu người chơi đều được xử lý trong agent. Các service khác, đặc biệt là service cảnh quan chỉ đọc dữ liệu từ shared memory theo chế độ chỉ đọc (read-only). Sau Tết (hoặc nếu có thời gian trong kỳ nghỉ Tết), tôi dự tính dành khoảng 10 tiếng để viết nhanh một server cảnh quan game đơn giản, kiểm tra những vấn đề bất ngờ có thể phát sinh, đồng thời tích hợp module công thức chiến đấu do bộ phận thiết kế kịch bản phát triển. Tất nhiên, trước khi bắt tay vào làm, cần phải có tài liệu thiết kế chi tiết trước.
Hôm nay đi leo núi ở phòng tập mệt bã người, tay mềm nhũn ra. Chỉ còn lại đầu óc vẫn còn tỉnh táo, tinh thần hơi phấn khích, tiện thể dành chút thời gian ghi lại bản ghi chú công việc này.