2012-12-10 34 views
11

Tôi muốn gửi các gói để đồng bộ hóa các thuộc tính của các đối tượng trò chơi thay đổi liên tục trong trò chơi. Tôi đã gửi thông báo khi một thuộc tính thay đổi ở phía máy chủ thành đối tượng EntitySync chịu trách nhiệm gửi các bản cập nhật cho ứng dụng khách.Xác định tên thuộc tính có dấu chân thấp

Ngay bây giờ, tôi đang sửa chữa trước tên chuỗi thuộc tính. Đây là rất nhiều chi phí cho khi bạn đang gửi rất nhiều cập nhật (vị trí, HP, góc). Tôi muốn cho một cách bán độc đáo để idneity các gói tin.

Tôi nghĩ về các thuộc tính (phản ánh ... chậm?), Sử dụng hậu tố ở cuối và gửi ID đó (Position_A, HP_A) nhưng tôi mất một cách rõ ràng để xác định các thuộc tính này một cách nhanh chóng với một bản in chân thấp. Nó nên tiêu thụ càng ít byte càng tốt.

Ý tưởng?

Trả lời

7

Mở rộng trên giải thích của Charlie,

Thư viện protobuf-net do Marc Gravell là chính xác những gì bạn đang tìm kiếm về serialization. Để làm rõ, đây là thư viện của Marc Gravell, chứ không phải Google. Nó sử dụng mã hóa bộ đệm giao thức của Google. Đây là một trong những dấu chân nhỏ nhất được xuất bản ở đó, trên thực tế nó có khả năng tạo ra các gói nhỏ hơn bạn tự tuần tự hóa nó (Làm thế nào mặc định Unity3D xử lý mạng, yuck).

Về tốc độ, Marc sử dụng một số thủ thuật rất thông minh (Cụ thể là HyperDescriptors) http://www.codeproject.com/Articles/18450/HyperDescriptor-Accelerated-dynamic-property-acces cho tất cả nhưng loại bỏ phí trên phản ánh thời gian chạy.

Thực phẩm cho suy nghĩ về trừu tượng mạng; hãy nhìn vào Rx http://msdn.microsoft.com/en-us/data/gg577609.aspx suối tổ chức sự kiện là cách thanh lịch nhất mà tôi đã xử lý với mạng lưới và đa luồng thông tin liên lạc nội bộ hệ thống phụ cho đến nay:

// Sending an object: 
m_eventStream.Push(objectInstance); 

// 'handling' an object when it arrives: 
m_eventStream.Of(typeof(MyClass)) 
.Subscribe (obj => 
{ 
    MyClass thisInstance = (MyClass) obj; 
    // Code here will be run when a packet arrives and is deserialized 
}); 
+0

Tôi đã thấy điều đó và nó thực sự tuyệt vời - nhưng làm cách nào để chọn các thuộc tính được chọn lọc theo thứ tự? –

1

Có vẻ như bạn đang cố gắng sắp xếp các đối tượng của mình để gửi qua mạng. Tôi đồng ý việc gửi tên đầy đủ của tài sản qua dây điện không hiệu quả; điều này tiêu thụ nhiều byte hơn bạn cần.

Tại sao không sử dụng thư viện thực sự tuyệt vời mà Google đã phát minh chỉ vì mục đích này.

Đây là cổng NET: http://code.google.com/p/protobuf-net/

Tóm lại, bạn xác định các thông điệp mà bạn muốn gửi đến nỗi mỗi tài sản có một id duy nhất để thực hiện gửi các thuộc tính hiệu quả hơn:

SomeProperty = 12345 

Sau đó, nó chỉ gửi id của thuộc tính và giá trị của nó. Nó cũng tối ưu hóa cách nó gửi các giá trị, vì vậy nó có thể sử dụng chỉ 1, 2, 3 byte, vv tùy thuộc vào giá trị lớn như thế nào. Rất thông minh, thực sự.

+0

Sẽ không tôi đã thực sự gửi MỌI tài sản trong trường hợp này tuy nhiên? Tôi chỉ quan tâm đến việc gửi các thuộc tính đã thay đổi (không phải toàn bộ đối tượng; Tôi sắp xếp lại toàn bộ đối tượng trò chơi khi một thực thể mới được tạo ra và đó là nó) –

+0

Có thể nếu bạn đặt IsRequired thành false cho mọi thuộc tính, bạn có thể điền vào các thuộc tính mà bạn muốn gửi qua: http://code.google.com/p/protobuf-net/wiki/GettingStarted –

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