2011-06-05 42 views
5

Hãy tưởng tượng một bảng nhiều người có thể vẽ cùng một lúc. Để giữ cho nó đơn giản, cho phép nói rằng có một đối tượng duy nhất trên bảng trắng có thể được di chuyển hoặc xóa bởi bất kỳ người dùng nào. Không có khái niệm về các đối tượng thuộc sở hữu của người dùng (nghĩa là mọi người dùng đều được phép thao tác bất kỳ đối tượng nào ... đó là một bảng trắng miễn phí)Điều kiện đua bảng nhiều người chơi

Vấn đề của tôi là ... nếu hai người dùng cố gắng thực hiện một hành động khác nhau trên đối tượng cùng một lúc, tức là một hành động xóa nó sẽ di chuyển nó, điều gì sẽ xảy ra?

Ngay bây giờ, chỉ để cho phép các tin nhắn đi qua, nó hoàn toàn bất ngờ.

Một ý tưởng là có quyền kiểm soát máy chủ để giải quyết ai có quyền kiểm soát đối tượng và không có gì được phép xảy ra cho khách hàng cho đến khi xung đột đó được giải quyết. Giải quyết xung đột có thể dựa trên cơ sở ai đến trước được phục vụ trước.

Mặc dù điều này có thể xảy ra rất nhanh, nhưng độ trễ nhỏ (~ 50-300ms) là không thể chấp nhận được vì chuyển động phải ngay lập tức ở phía máy khách. Ví dụ, thay vì thao tác các đối tượng, hãy nghĩ đến một cây bút. Để có một sự chậm trễ cho đến khi họ đã bắt đầu vẽ ... không tốt!

Một ý tưởng khác là có nút "yêu cầu kiểm soát", yêu cầu phần mở rộng serverside kiểm soát .... giống như trước đây, nhưng giờ đây chúng không bị thất vọng bởi độ trễ ban đầu của bản vẽ bút. Đây cũng không phải là tốt như vậy mặc dù kể từ khi họ phải nhấn nút đó cho đến khi họ có thể làm bất cứ điều gì, và bảng này thực sự có nghĩa là cho trẻ em ...

Bất kỳ giải pháp nào khác? :)

Trả lời

3

Đây là một vấn đề thú vị thường được giải quyết thông qua sự kết hợp giữa độ phân giải bên máy khách và máy chủ. Nếu bạn đã quen thuộc với WoW, đặc biệt là những ngày phát hành đầu tiên, bạn sẽ nhớ một máy chủ bị lỗi và mọi người tiếp tục di chuyển. Điều này được thực hiện bởi các khách hàng quản lý các phong trào dự đoán, và yêu cầu cập nhật định kỳ từ máy chủ cho các vị trí thực tế và các giá trị hành vi.

Một ý tưởng tương tự sẽ được áp dụng cho vấn đề của bạn. Độ phân giải phía máy chủ của bạn trên cơ sở f.c.f.s có vẻ lý tưởng. Vấn đề như bạn đã đề cập là độ trễ làm giảm trải nghiệm người dùng. Để làm điều này, tại sao không cung cấp cho người dùng toàn quyền kiểm soát phía máy khách, và sau đó yêu cầu cập nhật từ máy chủ sau khi hoạt động? Vì vậy, nếu bạn di chuyển một vòng tròn xuống 200px và tôi đổi màu thành màu xanh lá cây, cả hai chúng tôi đều có thể nhìn thấy hành vi của ứng dụng khách ngay lập tức, nhưng khi bạn giải phóng vòng tròn, bạn cũng sẽ thấy nó chuyển sang màu xanh lục.

Vấn đề hiển nhiên đối với điều này trở thành khi cả hai người dùng thay đổi cùng một thuộc tính của đối tượng. Tại thời điểm này, hệ thống f.c.f.s sẽ cần đưa ra quyết định về việc phải làm gì dựa trên việc sử dụng ứng dụng khách. Nó có nên thực hiện đồng bằng lưới trên đối tượng không? Bạn có nên thông báo cho người dùng rằng một người dùng khác đã thay đổi đối tượng theo cách khác không? Đây là câu hỏi về tính năng nhiều hơn so với câu hỏi kỹ thuật.

+0

Tôi thích cách bạn đã chỉ ra rằng xung đột chỉ tồn tại đối với các thay đổi đặc tính cụ thể! tức là màu sắc và vị trí không phải là xung đột, nhưng vị trí và vị trí hoặc xóa là ... – davidkomer

+0

Tôi đoán mức đơn giản nhất, tôi có thể duy trì lịch sử và "nhảy lùi và cấm kiểm soát" nếu máy chủ đưa ra thông điệp của đối tượng -locked ... – davidkomer

+0

một giải pháp xung đột đơn giản với thao tác tương tự thuộc tính sẽ là thời gian tương tác người dùng và duy trì thay đổi mới nhất (hoặc nếu đối tượng bị xóa chỉ giữ nó bị xóa) – dain

0

Câu hỏi thực sự thú vị! Trạng thái của bảng trắng được lưu trữ trên máy chủ (ví dụ: trong DB). Có 3 hành động có thể có trên khách hàng: startEditing, finishEditing, delete. Ngay sau khi một số hành động được thực hiện, bạn nên gửi một tin nhắn đến máy chủ để mô tả một hành động.

Nếu startEditing được gửi, trước hết bạn nên kiểm tra xem đối tượng bạn sắp sửa không có khóa hay không. Nếu nó được mở khóa, bạn nên đặt khóa (khóa nên chứa thông tin về người dùng đã đặt khóa). Sau đó, bạn nên gửi tin nhắn cho tất cả các khách hàng hoạt động để nói rằng đối tượng đó không nên được chỉnh sửa.

Nếu finishEditing (thông tin này có chứa thông tin về thay đổi đối tượng) được gửi, bạn nên thay đổi đối tượng trong DB giải phóng khóa và gửi tin nhắn cho tất cả khách hàng đang hoạt động nói về những thay đổi và khóa phát hành.

Nếu delete được gửi. Nếu đối tượng không bị khóa bởi khách hàng khác với đối tượng gửi tin nhắn, bạn nên xóa đối tượng khỏi DB và gửi tin nhắn tới tất cả khách hàng đang hoạt động yêu cầu xóa đối tượng đó khỏi bảng trắng

+0

Vấn đề là khi startEditing được gửi, "kiểm tra" yêu cầu một máy chủ kiểm tra, giới thiệu độ trễ – davidkomer

+0

Nếu khách hàng đầu tiên gửi 'startEditing' trong cùng thời điểm, một số khách hàng sẽ là người đầu tiên đặt khóa và người thứ hai sẽ thấy khóa và không làm gì cả – Eugeny89

+0

có, nhưng một lần nữa - vấn đề là khách hàng phải ngay lập tức có thể rút ra nếu nó sẽ có khóa. – davidkomer

0

Bạn có thể làm điều gì đó bạn hiển thị các tương tác của các mục địa phương và những gì người khác nhìn thấy. Khi bắt đầu, bạn hiển thị một cái gì đó giống như, đối tượng trong suốt mà bạn đang tương tác hoặc viết với không phải là cuối cùng, mọi người đều nhìn thấy các đối tượng/bản vẽ đục là cuối cùng và những gì từng thấy.

Khi bạn phát hiện 2 người dùng di chuyển một mục cùng một lúc, trên màn hình riêng của họ, cả hai đều trong suốt, trong quá trình cập nhật nhiều người dùng đã được xác định là có quyền kiểm soát vẫn đang di chuyển đối tượng và bạn có thể hiển thị một số loại sự kiện (có thể là một bài thơ chung chung) của người dùng đang di chuyển đối tượng của họ hiện đã được xác định là không thể kiểm soát được.

theo cách này bạn sẽ nhận được phản hồi vẽ ngay lập tức và đôi chút thất vọng theo thời gian khi họ được xác định không phải là người kiểm soát một mục.

+0

Nếu tôi hiểu chính xác bạn, ý tưởng giống như những gì tôi đã nói ở trên- "Tôi đoán chỉ là mức đơn giản nhất, Tôi có thể duy trì lịch sử và "nhảy lùi và cấm kiểm soát" nếu máy chủ đưa ra một thông báo về đối tượng bị khóa ... " NHƯNG bạn đã thêm một gợi ý trực quan ở phía máy khách để họ có thể phân biệt giữa một đối tượng có thực sự di chuyển so với một động thái có thể tạm thời ...? Có đúng không? Tôi thích nó! – davidkomer

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