Tôi đã thiết kế Trò chơi nhiều người chơi trước đây, nhưng giờ tôi muốn tạo một Kiến trúc MMORPG cho mục đích học tập/thách thức. Tôi muốn đi xa như mô phỏng hàng trăm (hoặc một vài nghìn) người chơi đồng thời trên một máy chủ duy nhất.Phát triển MMORPG và logic bên máy chủ, cập nhật tất cả các đối tượng trò chơi?
Cho đến giờ rất tốt, ngoại trừ việc hiện tại tôi đang gặp sự cố để tìm ra cách tốt để cập nhật tất cả các đối tượng trò chơi trên Máy chủ thường xuyên và nhanh nhất có thể.
Bởi đối tượng trò chơi Tôi có nghĩa là tất cả Người chơi, Mob, Bullets.
Vấn đề là tất cả Người chơi, Mob, Bullets được lưu trữ trong Bộ sưu tập trên bộ nhớ phía máy chủ để xử lý nhanh hơn và lặp lại tất cả chúng để kiểm tra va chạm, cập nhật tình trạng, cập nhật chuyển động, v.v ... mất quá nhiều thời gian.
Cho phép nói rằng tôi có 1000 người chơi và có 10000 mob trên toàn thế giới và tất cả người chơi và sinh vật đều chịu trách nhiệm tạo 5 đối tượng trò chơi khác (không ít hơn) như đạn.
Điều đó sẽ cung cấp cho (1000 + 10000) * 5 = 55000 đối tượng trò chơi trong bộ sưu tập.
Lặp lại tất cả các đối tượng, cập nhật chúng, mất vĩnh viễn (một cặp vợ chồng phút) trên Dual-Core HT i5 với RAM 4gb. Cái này sai.
Khi lặp lại, các mã nhìn như thế này (giả):
for(int i = 0; i < gameobjects.Count; i++) {
for(int j = 0; j < gameobjects.Count; j++) {
// logic to verify if gameobjects[i] is in range of
// gameobjects[j]
}
}
Là một tối ưu hóa, Tôi đang nghĩ về chia đối tượng trò chơi của tôi trong các khu khác nhau và các bộ sưu tập nhưng điều đó sẽ không giải quyết được các vấn đề mà tôi cần phải cập nhật tất cả các đối tượng vài lần mỗi giây.
Tôi nên tiến hành cập nhật tất cả các đối tượng trò chơi ở phía máy chủ như thế nào? Tôi đã tìm kiếm nặng để tìm các mẫu thiết kế trò chơi thú vị nhưng không có kết quả cho đến nay. :(
Cảm ơn trước!
Tôi sẽ sử dụng thiết kế dựa trên sự kiện chỉ yêu cầu đối tượng được cập nhật khi cần. – eandersson
Đối với trường hợp mã kiểm tra phạm vi, bạn nên sử dụng cấu trúc Quad Tree (http://en.wikipedia.org/wiki/Quad_tree) (hoặc tương tự). Điều đó sẽ ngăn chặn nó luôn luôn là N^2. – Kitsune
Lưu ý rằng ngay cả khi cách tiếp cận không đúng, tôi muốn đề cập rằng bạn không sử dụng 2 lõi trong vòng lặp đó, không có đa luồng liên quan, bạn đang lãng phí 50% công suất bộ xử lý của mình. –