Bối cảnh
Một trò chơi được vận chuyển dưới dạng một ứng dụng web lũy tiến có kết nối bộ hẹn giờ ( setTimeout
, setInterval
) và websocket để có được giao tiếp thời gian thực.
Chuyện gì đang xảy ra
Mọi thứ đều ổn miễn là người dùng ở lại trong ứng dụng. Nhưng khi người dùng chuyển sang một tab khác, hoặc một ứng dụng khác hoặc tắt màn hình (trong trường hợp là điện thoại di động), nó sẽ trở thành một "thế giới vô danh".
- Websockets có thể hoặc không thể "tạm dừng" hoặc "tắt"
- Bộ đếm thời gian trông giống như chúng đang được điều chỉnh hoặc ra mắt.
Hành vi này dường như phụ thuộc vào trình duyệt và nền tảng và, thậm chí, có thể phụ thuộc vào hành vi người dùng cụ thể. Tôi đoán các trình duyệt và HĐH có vòng đời / cơ chế riêng để tiết kiệm pin và / hoặc tính toán.
Khi người dùng quay lại, ứng dụng ở trạng thái không xác định và tôi đang vật lộn để khôi phục trạng thái đúng cách.
Về websockets, tôi có tự động kết nối lại với socket.io và kết nối lại websocket nhưng nó không đủ để giải quyết mọi thứ.
Tìm kiếm câu trả lời
- "Vòng đời" của các trình duyệt khác nhau liên quan đến những trình duyệt này là gì? Đây có phải là tài liệu? Khi nào họ quyết định tắt và ga?
- Họ làm gì chính xác với websockets? Trình duyệt chỉ ngắt kết nối chúng?
- Họ làm gì chính xác để tính giờ? Họ điều tiết chúng hoặc ra mắt chúng hay cái gì khác?
- Điều gì xảy ra với việc thực thi javascript nói chung? Tạm dừng / phá hủy / điều tiết?
- Có cách nào để tham gia vào một số loại sự kiện vòng đời trình duyệt khi nó sẽ tắt mọi thứ không? Điều duy nhất tôi có thể tìm thấy có thể là API khả năng hiển thị
Có cách nào để tái tạo một cách giả tạo hành vi này để có thể thử nghiệm các giải pháp không? Nó đặc biệt khó trên máy tính để bàn. Websockets không thể tắt và các nhà phát triển crom dường như không vội vàng giúp đỡ một vấn đề từ năm 2014 (!): Không bao gồm các socket web khi sử dụng điều tiết kết nối
Bất kể ở trên, có một giải pháp trình duyệt chéo thực dụng để phát hiện / giải quyết vấn đề này? (ví dụ như từ trải nghiệm, Firefox trên máy tính để bàn dường như hoạt động hoàn toàn khác so với Chrome và iPhone sẽ ngắt kết nối thường xuyên hơn nhiều so với Android)
Liên kết liên quan