Hướng dẫn ban đầu cho những người muốn tạo game MMORPG
Hướng dẫn ban đầu cho những người muốn tạo game MMORPG (bài viết của Radu
Privantu do ROOT dịch):
Bài viết này sẽ tập trung vào bước cơ bản đầu tiên để tạo nên một game Multiplayer
Online Role Playing Games (MMORPG). Đó là bước chuẩn bị để phát triển một
game MMORPG, với kinh nghiệm và tài nguyên hạn chế($$$). Sau khi đọc xong bài
viết này, bạn sẽ biêt bắt đầu như thế nào, sẽ biết cái gì nên làm cái gì ko nên làm. Kỹ
năng và tài nguyên(resources) mà bạn có là điều tối quan trọng. Nếu ko có kỹ năng thì
việc cố gắng xây dựng một game MMORPG chỉ gây lãng phí thời gian của bạn.
Bước I: Quyết định về kỹ năng:
I, Những yêu cầu về kỹ năng cơ bản để tạo 1 game MMORPG(level I):
1. Biết được ít nhất một ngôn ngữ lập trình. C++ là sự lựa chọn tốt nhất đây là ngôn
ngữ thông dụng để làm 1 game. VISUAL BASIC, JAVA hoặc C# cũng có thể làm
việc tốt nhưng còn tuỳ từng trường hợp.
2. Làm quen với một trong những thư viên đồ hoạ. Các thư viện đồ phổ biến hiện nay
là SDL, OpenGL hoặc DirectX/Driect3D(mỗi cái đều có ưu và nhược điểm riêng).
3. Lựa chọn 1 phương thức giao tiếp mạng. Bạn có thể chọn lựa giữa WinSock,
SDL_net hoặc DirectPlay trong bộ DirectX.
4. Bạn phải có kinh nghiệm trong việc lập trình. Ví dụ: Các vòng lặp sự kiên trong
Win(event loop), phân luồng(MultiThreading), lập trình giao diện, v v.
II, Kỹ năng level 2(cái này dịch theo ý tui à ^^):
1. Lập trình theo mô hình Client/Server.
3. Login với nhân vật đó
4. Có thể chat với các nhân vật khác
5. Thiết kế trong mô hình 3D đơn giản(View các góc độ)
Lưu lại một nhân vật(trên server) dường như là đơn giản. Nhưng sự thực thì không
như vậy. Ví dụ, có hai cách để lưu lại nhân vật trên server: Sử dụng database hoặc sử
dụng Flat Text(files). Cả hai đều có những ưu điểm và nhược điểm.
Database
Ưu điểm:
- Dễ dàng thêm mới các trường(fields), hoặc chỉnh sửa.
- Cập nhật thông tin người chơi dễ dàng hơn
- Có thể dễ dàng lây thông tin ra một cách nhanh chóng và hiệu quả, thông qua các
câu lênh truy vấn SQL (SQL Query).
- Không cần tới việc thực hiện các phép đóng mở cơ sở dữ liệu (File thì ngược lại).
- Dễ cập nhật và phục hồi.
Nhược điểm:
- Dễ dàng sinh lỗi. Nếu Query sai.
- Database có thể chậm hơn file trong việc đọc ghi dữ liệu đối với lượng dữ liệu nhỏ.
Nhưng với dữ liệu lớn thì tốc độ so với ban đầu thì thay đổi ko đáng kể.
- Sử dụng Database phức tạp và phải yêu cầu kỹ năng về Database và SQL. Điều này
có thể khắc phục được bằng việc sử dung các thư viện giao tiếp(interface) giữa
chương trình và cơ sở dữ liệu.
Flat Text(tác giả gọi là files thì cũng vậy)
Ưu điểm:
- Truy cập nhanh(ko có nghĩa là tìm dữ liệu nhanh)
có thể chứa một phần dữ liệu mà bạn muốn gửi (đoạn này ko hiểu lắm). Hơn nữa nếu
bạn muốn truyền 20 bytes dữ liệu, và lại truyền 20 bytes dữ liệu khác, Server có thể sẽ
ko nhận 20 bytes dữ liệu này rồi đến 20 bytes dữ liệu kia, thay vào đó nó sẽ nhận cả
40 bytes cùng một lúc, điều này để tránh lãng phí băng thông và các header(phần đầu
của mỗi packet) ko cần thiết. Bạn cũng có thể sẽ gửi một gói 1KB dữ liệu, nhưng
server sẽ tiếp nhận nó bằng hai gói dữ liệu nhỏ hơn. Vì vậy bạn cần phải biết đâu là
khởi đầu đầu là kết thúc của một gói dữ liệu. Trong game Eternal Lands, sử dụng
phương thức sau:
Offset 0: 1 byte, để đinh nghĩa lệnh
Offset 1: 2 bytes, độ dài của dữ liệu truyền
Offset 3: có độ dài được định nghĩa ở Offset 2, thân của thông điệp được truyền.
Phương thức này có nhiều thuận lợi: tất cả dữ liệu được truyền đều theo một chuẩn
nhất định. Nhược điểm gây ra một chút lãng phí cho băng thông.
Điều tiết theo phải nghĩ đến là phiên bản server: "Non-blocking sockets, non
threaded" hay "blocking sockets, threaded". Cả hai cũng đều có những ưu và nhược
điểm.
Threaded(Đa luồng):
1. Đây là cách thức để server chạy trơn tru hơn, nếu một người chơi nào đó cần một
khoảng thời gian để đọc dữ liệu từ CSDL nó sẽ được xử lý trong một luồng riêng và
không làm ảnh hưởng đến người chơi khác.
2. Rất khó debug và khó thực thi đúng: Bạn sẽ cần đến rất nhiều sự đồng bộ, và chỉ
một sơ suất nhỏ có thể dẫn đến tai hoạ với game có thể bị ngừoi chơi khai thác (như
đúp item, server crashing v v).
3. Được thiết kế để sử dụng với hệ thống có nhiều bộ xử lý (Multiprocessors) hoặc
Hyper Threading của INTEL.
cho bạn nhiều khả năng sáng tạo, cho người chơi cảm giác tự do di chuyển quay
camera v v. Nhưng nhược điểm của nó là ko phải ai cũng có thể chơi được (ko có
card đồ họa, một số người không quen với đồ họa 3D có thể chóng mặt khi chơi) và
hình ảnh render quảng cáo thì bao giờ trông cũng đẹp hơn khi chơi trong game.
Tiếp theo: Những vấn đề liên quan đến bảo mật:
Rõ ràng là chúng ta không thể tin tưởng vào người chơi. Liệu bạn có thể chắc chắn
rằng người chơi không thể nào phá được cách thức mã hóa của bạn, hay giao thức của
bạn. Vì thế mọi dữ liệu mà người chơi truyền đến server đều phải được hợp thức hóa.
Trên server của bạn phải chắc chắn rằng nó kiểm tra tràn bộ nhớ đệm (buffer). Ví dụ:
Thông thường có một vùng nhớ đệm nhỏ(có thể là 4K) cho những dữ liệu truyền đến
(từ socket), Một người chơi ác ý hay một hacker có thể gửi những gói dữ liệu dài hơn
vùng nhớ đệm này, nếu dữ liệu đó ko được kiểm tra, sẽ xảy ra tràn bộ nhớ đệm. Kết
quả là server bị sinh lỗi nhẹ thì sẽ phải khởi động lại, nhưng tồi tệ hơn là hacker có
thể hack được server của bạn bằng những đoạn code ác ý có thể điều khiển cả
server(hack tràn bộ đệm thì điều này chắc ai cũng biết). Như vậy mỗi một thông điệp
được gửi đến đều phải được kiểm tra: 1. kiểm tra độ lớn, 2. kiểm tra tính hợp lệ của
dữ liệu(Ví dụ người chơi có thể gửi một thông điệp là “uống một lọ máu” –> đầy
máu, mặc dù trên người nhân vật không hề có một lọ máu nào, hay “giết một con quái
vật”, mặc dù con quái vật đó ở rất xa nhân vật v v). Và tôi xin khẳng đinh một lần
nữa rằng. Dữ liệu hợp lệ là vô cùng quan trọng. Sự vi phạm lúc nào cũng có thể xảy
ra, vì vậy hãy ghi(log) lại username, IP, ngày giờ và những hành động vi phạm của
người chơi. Thường xuyên kiểm tra log. Nếu bạn tìm thấy vài lỗi từ một số người
chơi thì đây thường là lỗi của cllient, hoặc do lỗi của mạng. Tuy nhiên nếu tìm được
rất nhiều lỗi từ cùng một user hay IP, thì đây rất có thể là ai đó đang đùa giỡn với
server của bạn, đang cố hack nó, hay chạy những đoạn macro/script(cái này là bot ư).
Mặc dù chúng ta ko bao giờ lưu dữ liệu trên client. Client nên nhận dữ liệu của nó từ
server. Hay nói cách khác, Nó ko bao giờ giờ gửi những dữ liệu đại loại như: “Ok,
đây đúng là danh sách các item của tôi” hay “Strength của tôi là 10, mana là 200, máu
cẩn thận với khi sử dụng ID với số nguyên ko dấu(unsigned int) và kiểm tra cận trên,
nói tóm lại là kiểm tra [0,max]. Tương tự như vậy hãy kiểm tra tọa độ trên bản đồ.
Nếu bạn có một thuật tóan tìm đường trên server, và client di chuyển bằng cách click
chuột vào một vị trí trên mặt đất thì phải đảm bảo rằng vị trí đó ko ở ngòai bản đồ.
Tiếp theo: Thành lập nhóm phát triển:
Để làm ra một game cần phải bỏ ra rất nhiều công sức (ngoại trừ các game xếp hình,
cờ carô v v). Nhất là đối với một game MMORPG. Bạn ko thể một mình làm hết tất
cả được. Một nhóm phát triển game nên:
- Ít nhất là có 3 người lập trình: 1 cho server, và 2 cho client(một cho lập trình client,
1 sử dụng các công cụ thiết kế, world editor, v v). Nếu như có đến 6 người lập trình
thì càng tốt. Nhưng quá mức này thì có vẻ hơi nhiều. cái chính là còn phụ thuộc vào
ladder của bạn. Số lượng người thiết kế đồ hoạ cũng nên có từ 1 đến 3 người. Nếu
như là game 3D thì bạn cần phải có 1 cho thiết kế 3D, một cho 2D (texture, interface,
v v), một cho animator và một người nữa là ladder.
- Build map cũng là một công việc đòi hỏi rất nhiều thời gian, và nó là chìa khoá dẫn
tới một game thành công, và bạn cũng cần phải có một ladder để điều hành công việc
này. Cần phải có sự phù hợp trong map được xây dựng. Bạn không thể đưa công việc
này cho một ai đó làm mà ko có sự chỉ đạo được.
- 1 Webmaster: cần phải có một webmaster để thiết kế web. Website là nơi để người
chơi có thể đăng kí tài khoản, nhân vật, xem hệ thống ladder v v. vì thế nó cũng rất
quan trọng.
- Sound and musician cũng rất quan trọng để quyết định game có thành công hay
khống nhưng với những người bắt đầu thì điều này cũng chưa thực sự cần thiết.
Chúng ta có thể sự dụng những tài nguyên sẵn có. Những tiếng hét, tiếng bước chân,
tiếng đâm chém có thể tìm thấy rất nhiều trên mạng.
- 1 người thiết kế game play(game's economy). Bạn có thể nghĩ rằng công việc này là
dễ dàng. Nhưng thực sự nó là công việc phức tạp nhất trong tất cả các công việc
để hoàn chỉnh một bản client/server. Nhưng nếu là một team leader bạn cần có nhiều
việc phải làm hơn là ngồi lập trình, Giữ cho đội ngũ của bạn làm việc ăn ý với nhau,
giải quyết những vấn đề tranh cãi, tạo mỗi quan hệ, hỗ trợ kỹ thuật, cài đặt server, sử
dụng trí tuệ tập thể v v. là những việc một ladder phải làm. Và bạn sẽ phải bận túi bụi
trong những công việc đó, Không có ai rời bỏ team của bạn thì đó là một điều may
mắn, nhưng nếu điều này sảy ra thì đó là cả một vấn đề. Thử tưởng tượng rằng có một
Artist rời bỏ công việc giữa chừng. Anh ta sẽ không cho bạn sử dụng những thành quả
làm việc của anh ta. Dĩ nhiên, việc này có thể giải quyết bằng một bản hợp đồng,
nhưng sẽ khá là vất vả để kiếm một artist khác thay thế. Sẽ có hai phong cách vẽ khác
nhau trong game của bạn. Liệu bạn có muốn điều này xảy ra?
2. Cần một khoản tiền lớn (từ 4-6 chữ số tất nhiên là USD) để duy trì một Server
MMORPG?
Điều này thật sự không đúng, một server chuyên dùng cho game, với băng thông
1000GB/tháng bạn sẽ phải chi xấp xỉ 100USD/tháng (và một khoản 2-300 USD cho
phí cài đặt). Trừ khi bạn thiết kể một giao thức truyền tải qua mạng quá tồi tệ,
1000GB/month sẽ đủ cho server với 1000 người chơi(trung bình). Dĩ nhiên bạn cần
một server khác để duy trì website về game và nơi download client(download client
sẽ tốn rất nhiều băng thông một khi game trở nên phổ biến). Nếu Client của chúng ta
khoảng 22MB,và ta có băng thông 400GB/tháng. Và game của chúng ta chưa phổ
biến rộng rãi. Bạn không cần phải lo lắng khi bắt đầu dự án. Một server với đường
truyền DSL có thể làm tốt việc đó, nó có thể duy trì 20-30 người chơi online cùng một
lúc. Khi đó bạn sẽ cần phải tìm một host free hoặc trả phí thấp để làm nơi đặt trang
web và các thứ linh tinh khác.