2011-01-25 38 views
5

Câu hỏi: Có thể cập nhật hơn 100 đối tượng trong Trình phát Flash qua kết nối Socket không? Thêm chi tiết và thử của riêng tôi dưới đây!Có thể thực hiện các trò chơi mạng thời gian thực trong Actionscript 3.0

Chi tiết

Đối với thực tập của tôi, tôi có thời gian để tạo ra một trò chơi vật lý nhiều người. Tôi đã làm việc ổn định trong ba tháng. Việc thực tập của tôi sắp kết thúc và tôi không thể hoàn thành trò chơi của mình.

Vấn đề của tôi là khó có thể gửi nhiều gói mỗi lần đến máy chủ và ngược lại. Các gói tôi gửi là cập nhật vị trí của các đối tượng và chuột của các ứng dụng khách khác.

Tôi sẽ cố gắng giải thích luồng mạng/trò chơi.

  1. Khách hàng kết nối đến máy chủ bằng cách sử dụng lớp Socket nhị phân trong AS3
  2. máy chủ yêu cầu xác minh và Client gửi tên và hình thu nhỏ.
  3. server chờ đợi cho đến 4 khách hàng được kết nối (Một số mai mối vv)
  4. server chọn 4 khách hàng và làm cho họ chạy trên một chủ đề riêng biệt (kết hợp như một Team)
  5. Khách hàng gửi số hiệu suất của mình để phạm vi máy chủ 1- 100.
  6. Máy chủ giúp khách hàng tốt nhất máy chủ cho vật lý và 3 máy nô lệ khác
  7. Trò chơi trên máy chủ thiết lập cấp độ và tạo ra khoảng 1-100 hình dạng ở mức (hình dạng chính và hình dạng phức tạp như cầu, động cơ, lò xo)
  8. Mỗi lần bước chủ nhà được tất cả tài sản được cập nhật của các hình dạng và gửi chúng cho khách hàng (x, y, luân chuyển, ngủ)
  9. client applys tất cả các hình dạng bất động sản để các hình dạng đúng

Tôi đã thử các bước thời gian khác nhau và nhận thấy rằng cho đến khoảng thời gian 1/15 giây client (slave) sẽ không nhận thấy bất kỳ sự chậm trễ nào trong game. Tôi cũng cố gắng chọn một bước thời gian thấp hơn và tween chuyển động của các hình dạng nhưng điều đó đã cho một số chuyển động lạ ở phía khách hàng (nô lệ).

Tôi sẽ đưa ra ví dụ về gói cập nhật đối tượng duy nhất.

<O|t=s:u|x=201|y=202|f=automaticoo</O 
<O|t=m:p|x=100|y=345|f=automaticoo</O 

Tôi nhận thấy rằng Flash Player có thể xếp chồng nhiều gói trong bộ đệm trước khi gửi. Ví dụ nếu tôi gửi rất nhiều gói dữ liệu cùng một lúc, nó sẽ chồng chúng lên và gửi chúng lại với nhau đến máy chủ. Với các bước thời gian nhanh hơn, bạn không nhận được nhiều cập nhật hơn ở phía máy khách (slave) nhưng có nhiều cập nhật hơn trong cùng một hàng gói.

Thử

  1. Sử dụng RTMFP mới (udp & p2p) giao thức để cập nhật.(tốt hơn một chút về hiệu suất nhưng ít tin cậy hơn)
  2. Mã toàn bộ máy chủ socket của tôi bằng C++ thay vì Air (với ServerSocket) (hoạt động tốt hơn nhưng nhận thấy phần chậm không phải là máy chủ mà là Trình phát Flash)
  3. Sử dụng phương pháp nén ByteArray và định dạng tuần tự AMF (hiệu suất giống nhau ngoại trừ máy chủ C++ không thể unserialize các tin nhắn)

Bạn có nghĩ rằng có thể trong Flash Player xử lý quá nhiều yêu cầu cập nhật mỗi bước thời gian.

Khám phá

Có một thanh trường trò chơi mà là nhiều người trong ActionScript 3.0. Họ đã sử dụng rất nhiều lừa đảo và thậm chí sau đó tôi nhận được một ping khoảng 300ms và nó chỉ cập nhật các cầu thủ liên tục (4 cầu thủ trong một hành lang).

Xin lỗi vì bài đăng dài.

+0

Máy chủ có gửi dữ liệu đến các máy khách khác qua máy chủ không? Sau đó, khách hàng đang nhận được thời gian chuyến đi đôi vòng so với nếu máy chủ tính toán vật lý. – alxx

+0

Sự khác biệt duy nhất từ ​​1client-> server-> 3client đến server-> 4clients là có một máy khách gửi gói thay vì nhận chúng. Tôi đã đưa ra quyết định một lần để tính toán vật lý ở phía máy khách bởi vì nó giảm tải máy chủ rất nhiều khi có rất nhiều trò chơi đang diễn ra. Có lẽ bạn là đúng và tôi có thể làm tốt hơn các vật lý trong c + + ở phía máy chủ. – automaticoo

+0

Tôi tự hỏi nếu khách hàng có thể gửi dữ liệu trực tiếp cho người khác (và với phát sóng). AIR đã có một số khả năng p2p, không chắc chắn về Flash trong trình duyệt. – alxx

Trả lời

7

Tôi tin rằng vấn đề của bạn là loại trò chơi và dữ liệu.

này lại được chia thành:

  • tốc độ máy chủ (tính toán cần trong CPU + RAM yêu cầu cho thế giới/máy nghe nhạc dữ liệu)
  • tốc độ kết nối (băng thông trên máy chủ)
  • kích thước dữ liệu (như thế nào cần nhiều thông tin và mức độ thường xuyên)
  • biểu mẫu tương tác của người chơi (sự kiện hoặc FPS)
  • khoảng cách từ máy khách đến máy chủ (ping)

MMORG

Ví dụ. World Of Warcraft, là kiến ​​thức của tôi về thế giới không có PVP bằng cách sử dụng "client là viewport" và "client gửi keystrokes", "server xác thực và thực hiện, và cho client biết điều gì xảy ra" trên cơ sở CLIENT-SERVER.

Điều này mang lại cho trò chơi nhiều thời gian chờ chấp nhận được vì bạn chỉ cần chuyển lệnh từ ứng dụng khách và sau đó là kết quả cho khách hàng. Phần còn lại được vẽ trên máy khách.

Sự kiện rất được điều khiển và từ bạn nhấp vào biểu tượng hoặc nhấn phím, không sao khi "lỗi chính tả" của bạn cần thời gian để kích hoạt trên máy chủ. Thứ hai là không có va chạm người chơi cần thiết.Điều này cho phép máy chủ xử lý ít dữ liệu hơn và giữ các yêu cầu đối với CPU máy chủ nhỏ hơn.


Counter-Strike/Battlefield, vv

FPS, hành động nhịp độ nhanh, với phản ứng nhanh chóng nhu cầu để có được thông tin về tất cả các chi tiết tất cả các thời gian. Điều này làm cho nhu cầu về độ chính xác cao hơn. Va chạm là phải cho cả người chơi và vũ khí.

Loại trò chơi này thường không xử lý hơn 32 người chơi trên một bản đồ, vì tất cả chúng đều cần chia sẻ vị trí, đạn, vụ nổ, v.v ... và tất cả dữ liệu này phải đi qua máy chủ- xác nhận lại là một nút cổ chai cho bất kỳ loại trò chơi trực tuyến nào.


Độ trễ mạng

Trong một thế giới hoàn hảo này sẽ là 0 ms, nhưng như chúng ta đều biết. Tất cả phần cứng từ máy khách đến máy chủ và ngược lại cần có thời gian. Cả hai đi qua các ngăn xếp mạng và thông qua kết nối internet (switch, router, modem, trung tâm cáp vv) vì vậy cách nhiều trò chơi thời gian thực hiện đại sửa lỗi này là do "dự đoán". Hãy để máy chủ nhìn vào hướng và tốc độ của bạn. Sau đó, họ cố gắng dự đoán (giống như GPS trong đường hầm) mà bạn được nhìn thấy lần cuối cùng với tốc độ +4 vì vậy khung thời gian bạn đã di chuyển (khung thời gian x 4) - nhưng nếu bạn đã làm chậm hoặc tăng tốc lên? sau đó họ ngay lập tức "hyperjump" bạn từ A đến B trong một giây và bạn cảm thấy như một trò chơi tụt hậu hoặc họ dễ dàng đến vị trí thực sự để "anh hùng" của bạn trượt nhanh hơn hoặc chậm hơn vào đúng sở hữu.

Kỹ thuật này được giải thích nhiều nơi trên mạng, vì vậy không cần chi tiết ở đây, nhưng phải mất thời gian và tinh chỉnh để có được hiệu suất tốt - nhưng nó hoạt động và tiết kiệm rất nhiều đau đầu cho người lập trình.


Cần có dữ liệu mạng nào?

Tôi đọc câu hỏi và suy nghĩ của bạn: có thể được nén khá nhiều. Thứ hai, tôi đã thực hiện một cuộc trò chuyện Flash socket với ByteStream thuần túy và nó hoạt động rất tốt. Thật khó để chạy cho một sự khởi đầu, nhưng một khi tôi đã nhận nó và chạy nó đã được nhanh chóng.

Trình khách flash/trình phát chính nó không phải là ứng dụng khách mạng lớn nhất, vì vậy, mong đợi rất nhiều tốc độ bị mất ở đó. Tôi sẽ đi 10-15 fps cho phần mạng và sau đó sử dụng phương pháp tiếp cận RAW nhiều hơn cho dữ liệu được gửi qua lại.

Cuối cùng, hãy cố gắng giữ dữ liệu càng đơn giản càng tốt.

Ví dụ: sử dụng COMMANDS/SHORTCUTS cho dữ liệu/sự kiện nhất định. Giống như một dữ liệu máy chủ bytestring có thể là: 0x99, 0x45,0x75,0x14,0x04,0x06

đâu 0x99 có nghĩa là: NỔ LỚN tại COORDS sau: (0x45,0x75) Sau đó 0x14 có nghĩa là: PLAYER 0x14 (máy nghe nhạc 20 theo số thập phân) đã chuyển sang (0x04, 0x06)

Vì vậy, mã vạch nhìn chằm chằm cho trình xử lý giao thức mạng trong máy khách và máy chủ của bạn những gì sẽ xảy ra tiếp theo. (Cách CPU biết cách đọc bộ nhớ btw.)

Đối với cuộc trò chuyện của mình, tôi có các lệnh cho từng loại dữ liệu được phân tích cú pháp. Một cho đăng nhập, một cho phát sóng, cho biết tên của một người sử dụng vvVì vậy, khi khách hàng đã đăng nhập, khách hàng đã nhận được lệnh + một nhóm người dùng trực tuyến. Điều này chỉ được chuyển một lần cho khách hàng. Sau đó, mỗi khách hàng được đính kèm cũng nhận được lệnh "người dùng mới trực tuyến" với tên của người dùng mới. Mỗi khách hàng duy trì danh sách riêng của mình với người dùng hiện tại và ID để tôi chỉ cần cho biết số khách hàng nào nói văn bản. Điều này giữ lưu lượng truy cập ở mức tối thiểu. Tương tự như vậy sẽ đi cho tọa độ hoặc lệnh của những gì để làm. "Player # 20 đi về phía bắc" vv có thể được 0x14, 0x41, 0xF0 (0x41 có thể là MOVE, 0xF0 có thể NORTH, EAST 0xf1, vv)


này khoảng cách vật lý vào trò chơi

Điều này bạn không thể thay đổi, nhưng bạn có thể đặt trong một số hạn chế hoặc làm cho các máy chủ chạy ở nhiều địa điểm trên toàn thế giới, tùy thuộc vào loại trò chơi bạn muốn thực hiện. Amazon EC2 là một nền tảng tuyệt vời cho các dự án như họ có trung tâm dữ liệu trên toàn thế giới và sau đó bạn có thể đánh giá mạng người dùng dựa trên các mạng này và sau đó chuyển hướng người dùng đến trung tâm dữ liệu gần nhất nơi bạn đang chạy máy chủ.


Hacking/gian lận

Cũng nên nhớ, nếu một cái gì đó trở nên phổ biến và bạn bắt đầu kiếm tiền trên đó, sớm hay muộn ai đó sẽ cố gắng phá vỡ các giao thức hoặc phá vỡ các tài khoản để truy cập vào máy chủ, thông tin hoặc gian lận để nhận thêm các mục/điểm trong trò chơi. Bạn cũng có thể bị tấn công bởi DDOS, nơi họ đánh bom mạng của bạn với dữ liệu sai chỉ để làm hỏng mọi thứ và khiến trò chơi không sử dụng được.

Đừng bận tâm quá nhiều khi bắt đầu, chỉ cần nhớ rằng khi bạn lên mạng, bạn KHÔNG BAO GIỜ biết ai trên thế giới hoặc ở đâu trên thế giới. Tôi không cố gắng làm cho bạn hoang tưởng, nhưng có những người bệnh sẽ cố gắng kiếm tiền bằng cách gian lận người khác.

Vì vậy, hãy nghĩ điều này vào cấu trúc của bạn, không hiển thị dữ liệu trong các gói mạng không cần thiết. Không tin dữ liệu từ khách hàng luôn đúng. Xác thực dữ liệu ở phía máy chủ.

Điều này cũng cần thời gian nếu bạn có 100 người chơi đang hoạt động cùng một lúc.

Nhưng một khi bạn làm điều đó, bạn có thể ngủ ngon hơn nhiều nếu nó trở thành một thành công lớn cho bạn, điều mà tôi thực sự hy vọng.


Đó là suy nghĩ của tôi từ kinh nghiệm. Hy vọng một số của nó có thể là hữu ích eventhough tôi didnt khá trả lời nếu 100 người chơi có thể.

Infact Tôi sẽ nói: CÓ 100 người chơi là có thể, nhưng nó phụ thuộc nếu tất cả họ di chuyển cùng một lúc và có thử nghiệm thu nhỏ liên quan và nếu bạn chấp nhận trễ hay không.

+0

+1 cho câu trả lời rất đầy đủ này, luôn luôn là một niềm vui đọc câu trả lời chi tiết. :) – Xeo

+0

Cảm ơn bạn được chào đón, nhưng như là một "nhà phát triển trò chơi cũ" công cụ này là gần gũi với trái tim tôi. : o) – BerggreenDK

+0

Tôi là một tham vọng, và đặc biệt là những thứ opcode là tốt đẹp để biết để sử dụng sau này. :) – Xeo

1

Câu hỏi: Có thể cập nhật hơn 100 đối tượng trong Trình phát Flash qua kết nối Socket không?

Phosphor 2 seems to pull it off.

+1

Điều đó dường như sử dụng plugin Shockwave Player thay vì plugin Flash Player. – Metal

+0

Tôi luôn ấn tượng về những gì Shockwave Player có thể quản lý. Quá xấu 3D trong Flash Player vẫn không có gì so với điều đó (hy vọng nó thay đổi với MoleHill). Nhưng Phosphor vẫn chỉ cập nhật tọa độ của người chơi chứ không phải bản đồ lỗ. Nó sẽ gửi bản đồ một lần và khách hàng cần hiển thị mọi thứ. Tôi đã đọc rất nhiều tài liệu mạng bằng van về cách quản lý các chuyển động của người chơi trong các trò chơi nhiều người chơi (tất cả là về việc lừa người chơi). Tôi không tìm thấy bất kỳ tài liệu hướng dẫn làm thế nào để quản lý một kết nối thời gian thực với rất nhiều gói tcp mỗi timestep trong Flash Player. – automaticoo

+0

Nếu bạn sẵn sàng chuyển nền tảng thành ví dụ. Shockwave player, sau đó hãy xem Unity3D. Nó làm cho trò chơi 3D thực sự và giống như Flash nhưng động cơ 3D thuần túy. – BerggreenDK

1

Có lẽ lựa chọn tốt nhất là thực hiện vật lý trên máy chủ và trên mỗi khách hàng, với đồng bộ hóa (vị trí đối tượng máy chủ được ghi đè của khách hàng). Bằng cách này, tất cả các khách hàng có được độ trễ bằng nhau. Cho đến khi sự khác biệt là thấp (như nó phải là) sửa chữa sẽ không được chú ý. Nếu bạn sử dụng Box2D, bạn có cả phiên bản AS3 và C++ đã sẵn sàng. Nhưng đây là kiến ​​trúc hoàn toàn khác nhau, đáng giá 3 tháng để tự thực hiện. Độ trễ nào bạn nhận được trên đấu trường trống/đơn giản? Trong thời gian giới hạn, việc đơn giản hóa có thể là lựa chọn duy nhất của bạn.

+0

Độ trễ ping của tôi giống như 100ms khi kết nối internet khá nhanh. Đề xuất khá hay. Để mô phỏng vật lý trên mỗi máy khách và cố gắng đồng bộ hóa nó với máy chủ sau mỗi 2 giây. Bạn có biết nếu không có vấn đề gì với phao và số khác biệt chính xác trong AS3 và C++. Giá trị của nó để có một cái nhìn. – automaticoo

+0

Theo tài liệu, số AS3 là gấp đôi C++. – alxx

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