2013-04-28 17 views
6

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!

+4

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

+1

Đố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

+1

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. –

Trả lời

4

tôi sẽ thay đổi thiết kế hoàn toàn và thực hiện một thiết kế cơ sở sự kiện. Điều này có nhiều ưu điểm, rõ ràng là bạn sẽ chỉ cần cập nhật các đối tượng thực sự được tương tác với. Vì bạn sẽ luôn có một phần lớn các đối tượng trò chơi trong một trò chơi MMO không hoạt động hoặc không hề thấy.

Không có lý do gì khiến bạn nên tính toán các đối tượng không hiển thị trên màn hình trình phát bất kỳ. Đó sẽ là điên rồ và đòi hỏi một trang trại máy chủ mà bạn có nhiều khả năng không thể mua được. Thay vào đó bạn có thể thử dự đoán chuyển động. Hoặc lưu trữ danh sách tất cả các đối tượng hiện không tương tác và cập nhật các đối tượng này ít thường xuyên hơn.

Nếu người chơi không thể nhìn thấy vật thể, bạn có thể dịch chuyển thiết bị trên một khoảng cách lớn thay vì di chuyển dễ dàng. Về cơ bản di chuyển các đơn vị trên một khoảng cách rất lớn trong khu vực giới hạn mà đối tượng được phép di chuyển. Làm cho nó trông giống như đối tượng đang di chuyển tự do ngay cả khi đối tượng không hiển thị với người chơi. Thông thường, điều này sẽ được kích hoạt như một sự kiện khi một người chơi mới vào hoặc rời khỏi một khu vực.

Bạn có thể thực hiện điều này bằng cách tính toán thời gian kể từ lần cập nhật cuối cùng và dự đoán khoảng cách mà đối tượng sẽ di chuyển, như thể người chơi có thể nhìn thấy nó. Điều này đặc biệt hữu ích cho các đối tượng hoặc các NPC có một tuyến đường được thiết lập, vì nó làm cho các phép tính đơn giản hơn nhiều.

+1

Cảm ơn bạn đã trả lời, tôi chắc chắn sẽ suy nghĩ về một cách để thực hiện một lệnh dựa trên sự kiện Logic cùng với việc chia thế giới của tôi trong các vùng/vùng phụ bên trong một lưới. – SlashJ

+0

Yea, bạn chắc chắn sẽ cần phải kết hợp điều này với một hệ thống khu vực. :) – eandersson

0

Looping hơn 55.000 đối tượng không nên quá chậm. Rõ ràng, bạn đang làm quá nhiều thứ quá thường xuyên trên các đối tượng và có lẽ làm công cụ cần phải lúc nào cũng được thực hiện.

Ví dụ, nếu không có người chơi xung quanh một đám đông, nên nó thực sự được tính? (nếu một cây rơi trong một khu rừng và không có ai xung quanh, nó thực sự làm cho một âm thanh?)

Ngoài ra, nhiều đối tượng có thể không cần phải cập nhật ở mọi vòng lặp. Người chơi ví dụ có thể được để lại cho khách hàng để ca lculate và chỉ được "xác minh" sau mỗi 1-2 giây. Dumping tất cả các va chạm của người chơi cho khách hàng sẽ làm cho khối lượng công việc máy chủ của bạn dễ dàng hơn để xử lý. Những thứ tương tự cho viên đạn hoặc raycast của người chơi. Đổi lại, nó cũng làm cho các trò chơi nhiều hơn nữa chất lỏng cho các cầu thủ.

Có phải mobs khi đi theo đường dẫn cần được kiểm tra va chạm hoặc có thể các nút của đường dẫn đủ không?

Kiểm tra mọi đối tượng chống lại mọi đối tượng khác là khủng khiếp. Có phải tất cả mobs đều phải được thử nghiệm với tất cả các mob khác hay chỉ cần kiểm tra loại hoặc phe cụ thể? Bạn có thể chia thế giới của bạn thành khu vực nhỏ hơn mà sẽ chỉ kiểm tra mobs bên trong nó chống lại các đối tượng cũng có trong nó?

Có rất nhiều công việc được thực hiện trong mã máy chủ MMO để làm cho nó hoạt động bình thường. Tối ưu hóa được thực hiện đôi khi mất trí, nhưng miễn là nó hoạt động.

+0

Bạn thông minh, tôi biết ai đó sẽ nói về điều 'Rơi cây trong rừng'. Vấn đề là tôi vẫn đang xem xét nếu mobs, ngay cả khi không Trong phạm vi trực quan của bất kỳ người chơi, vẫn sẽ được di chuyển xung quanh, xây dựng tổ hoặc di cư. Nhưng một lần nữa, tôi có lẽ chỉ cần thực hiện logic một cách khác nhau. – SlashJ

+0

@Armz Được rồi ... Nhưng bạn có thể đơn giản hóa vòng lặp, chuyển động, va chạm của họ nếu họ không ở gần một người chơi không? Nếu họ đi đến một vị trí, bạn chỉ có thể nội suy giữa hai điểm. Không có va chạm, không có hình ảnh động, không có raycast, không có tầm nhìn ... Rất nhiều điều có thể được thực hiện để giảm bớt khối lượng công việc. – LightStriker

+0

Tuyệt đối, tôi sẽ tìm cách thực hiện logic phạm vi ngoài tầm nhìn. Cảm ơn! – SlashJ

2

Mã của bạn chạy chậm, không chỉ vì nó đang kiểm tra tất cả các đối tượng N, mà bởi vì nó kiểm tra tất cả các tương tác có thể có của đối tượng và mất N^2 tính toán = 3 025 000 000 trong mẫu của bạn.

Một cách để giảm số lần kiểm tra này là đặt đối tượng trong thế giới trò chơi của bạn vào lưới, sao cho các đối tượng không ở trong cùng một ô hoặc căn chỉnh không thể tương tác với nhau.

Ngoài ra, mã hiện tại của bạn để kiểm tra mỗi tương tác hai lần, bạn có thể dễ dàng khắc phục điều này bằng cách bắt đầu vòng lặp từ i trong chu kỳ bên trong của bạn:

for(int i = 0; i < gameobjects.Count; i++) 
    for(int j = i; j < gameobjects.Count; j++) 
+0

Tôi sẽ điều tra ý tưởng Lưới khi phân chia thế giới trong các Khu vực và Khu phụ khác nhau. Cảm ơn! – SlashJ

Các vấn đề liên quan