Xin giải pháp cho thời gian thực cho game nhiều ng chơi!



  • Mình nghiên cứu mấy tháng này về nodejs và đang làm 1 trang game xxx. Nhưng đang gặp phải vấn đề cực kỳ khó chịu đó là giật đùng đùng.
    Các thông số của game:
    Bản đồ rộng: 100K, thức ăn 100K và 6K quả mìn(bom).
    setTimeout = 1e3/60

    Bác nào pro cho e giải pháp với? Vì mình sử dụng chuyên sâu ở máy chủ, để tính va chạm giữa các người chơi với nhau, với thức ăn, với bon. Nên cức ký mất thời gian ở đoạn này.



  • server mấy core , cấu hình bao nhiêu, nếu dc thì đưa code xem thử



  • Mình đã test thử VPS 1 Core, 1G RAN và cả VPS 46G RAM, 20 Core nhưng không có tiến triển gì.
    Hiện giờ mình đang dùng VPS 46G RAM, 20 Core.

    Code mình dùng socket.io và express chưa biết dùng Cluster, Redis. Bên dưới mình sẽ mô tả thuật toán của mình.



    1. Vì lượng player, foods và mines rất lớn nên mình không thể forEach hết để tính va chạm giữa chúng đc. Mình đã groups nó lại theo vị trí của các đối tượng ấy. Ví dụ player có vị trí x=0 đến x = 1000 là thuộc groups 1 và 1001 dến 2000 là group 2. Lúc tính các đổi tượng cùng groups với nhau thôi. Foods và Mines cũng vậy!

    2. Di chuyển
      Khi máy khách thay đổi hướng của Game, nó sẽ được emit đến server và server sẽ có nhiệm vụ tính toán tọa độ tiếp theo và cập nhật vào mảng players.

    3. Event loop mình dùng setTimeout = 1e3/60. Tầm 60 khung hình, trong 60 khung hình đó vừa tính va chạm vừa phải gửi foods, mines và players đến mỗi máy khách.
      Mà chỉ gửi số lượng players, foods và mines theo độ rộng màn hình của máy khách nhé.

    Mình đã thử tất cả mọi cách dưới đấy:

    1. Gửi toàn bộ foods và mines đến máy khách và tính va chạm ở đó cho nhẹ server.
    2. Tình va chạm players, foods và mines ở máy khách hết. Và gửi cmd xóa foods, mines và players đến các máy khách khác.

    Nhưng đều không đc, trên local thì k bị giật tý nào.

    Bạn xem có vấn đề gì không ổn ở thuật toán mình k?
    thanks.



  • Thông tin thêm. VPS chạy NGINX.



  • @bacvv E thấy Local và server thật khác nhau cái thời gian kết nối từ client đến server thôi. Bác xem bác config con Nginx hợp lí chưa, có lỗi ở đâu không. E nghĩ nằm ở config server với kết nói. Vì bác nói local chạy bth. Với bác tính độ phức tạp O của thuâtj mình chưa. Cho e hỏi nữa là bác chạy server đặt ở đâu ^^.

    Nguyễn Hiển - Rodgers
    Fullstack Developer JavaScript.

    My Github: https://github.com/cptrodgers

    0


  • Em vừa chơi thử và Ping server bác thì nó trả IP về. Em check Ip thì tít ở bên Mỹ. =.= Công ty thì e không biết. Nhưng với khoảng cách tầm từ Mỹ về VN thì nahnh lắm cũng mất 1s 2s. Rồi còn tư server về các client khác nữa. Nếu bác dùng cho nhiều người nên phân server ở nhiều nơi. Rồi sắp xếp mọi người vào cùng server phù hợp sao cho req, res kết nối thấp nhất. Vì bác làm realtime nên thời gian connect cũng rất quan trọng mà.

    Nguyễn Hiển - Rodgers
    Fullstack Developer JavaScript.

    My Github: https://github.com/cptrodgers

    0


  • @Nguyen-Hien Thank bác. Chắc lại phải nghiên cứu thêm, e mới nhẩy vào nodejs nên chưa có kinh nghiệm.



  • @Nguyen-Hien Cho e hỏi là liệu có dùng cloud đc không nhỉ. ở Code mình k phải phân ra theo từng quốc gia nữa :(



  • @bacvv vấn đề e thấy khồn phải cloudm với socket.io thì có mấy lệnh bác chắc cũng nắm hết rồi. Bây h bác xác định xem là khu vực chơi là ở đâu thì đặt vps ở đó thôi. Như vn thì thuê gdata fpt idc gì đó. Nội địa nó nhanh. Còn nếu sea thì singapore. Khi rộng hơn bác nên kiếm ng về server giỏi để phân bố tốt. Bác có thể dùng location check xem người dùng ở đâu rồi connect đến sv hợp lí nhất. Làm sai độ trễ thấp nhất là đc.

    Nguyễn Hiển - Rodgers
    Fullstack Developer JavaScript.

    My Github: https://github.com/cptrodgers

    0


  • @bacvv nên xác định thị trường muốn nhắm tới khu vực chơi muốn nhắm tới rồi thuê vps sv tại đó cho hợp lí bác. ^^

    Nguyễn Hiển - Rodgers
    Fullstack Developer JavaScript.

    My Github: https://github.com/cptrodgers

    0


  • E đang có tham vọng toàn cầu :D. Nhưng chưa tìm đc giải pháp cho nó, cũng chẳng biết mấy thằng slither.iowormax.io làm kiểu già chạy nhanh thế?



  • @bacvv Nó không ép vào chung 1 sv như Bác. Vì như vậy làm toàn cầu sẽ fail. Đầu tiên nó phân tiền ra mua server ở khắp nơi. Như Brazil 1 con, Mỹ 1 con, Đông âu 1 con, Tây Âu 1 con, Trung Quốc 1 con, Sea 1 con, NHật Hàn gì đó 1 con. Nhớ là những con có kết nối quốc tế cao. Sau đó nó phân user vào từng server phù hợp vì có nhiều room. Có thể nó lây location rồi chọn server, hoặc nó check ip để xếp vào sv gần nhất cho thời gian trễ khi connect thấp nhất. Không nhất thiết quá mạnh. Đáp ứng phù hợp user và thời gian connect thấp nhất có thể. :)). Em biết bac tham vọng toàn câu nhưng phải tính toán hợp lí ^^. Ví dụ cho VN chơi thì sv nội địa. ĐNA thì Sing đó :))

    Nguyễn Hiển - Rodgers
    Fullstack Developer JavaScript.

    My Github: https://github.com/cptrodgers

    1


  • Cái phân bố server có thể dùng JS để tính toán connect vào IP cổng nào mà :)). Bác thử kiếm về cái check location và connect server realtime socket xem. Biết đâu có giải pháp. Ở Sea thì mua Sing hoặc tụi đài loan có connect quốc tế mạnh là ngon. Chúc bác thành công nhá.

    Nguyễn Hiển - Rodgers
    Fullstack Developer JavaScript.

    My Github: https://github.com/cptrodgers

    1


  • Thank bác nhé! Tiếng anh e không biết nên tiện hỏi luôn là e mua 4 VPS ở bốn nơi rồi. Mỹ, Bắc Âu, Singapore, VN. Tại nodejs e cũng lấy đc continentCode của người chơi rồi. Làm sao để connect đến các vps mình muốn bằng socket.io

    bacvv



  • @bacvv Theo em là từng bước vầy.

    1. Đầu tiên người chơi load page home bác về. Có cái chỗ điền tên rồi nhấn play ấy. Chỗ đó bác dùng gì đó không biết. Lấy được vị trí người chơi rồi đúng không.
    2. Kiểm tra xem khu vực bác mong muốn nó vào. Bác nhóm hẳn mấy đám vào như Location VN thì connect SV VN, Location Mỹ thì Sv Mỹ. Sea thì Sv Sing, Còn lại quất hết vào Châu âu chẳng hạn.
    3. Cái hàm e dùng connect server socket ở client là vầy :
      var socket = io.connect("IP server : cổng bác quy định cho thằng socket");
      Ví dụ: var socket = io.connect("31.26.184.23:3004")
      hoặc sub domain cũng được.
      var socket = io.connect("http://vn.pacman.io:3004"). Bác dùng if mà connect thôi. Nhớ để default ở khu vực nào đó tránh lỗi nó đếch check được location ở đâu :)))

    Nguyễn Hiển - Rodgers
    Fullstack Developer JavaScript.

    My Github: https://github.com/cptrodgers

    1


  • @bacvv À em khuyên bác mua VPS ổn định với trả phí theo lượng sử dụng như thằng AWS của amazon ấy. Cho nó chi phí. Lỡ nhiều trả nhiều lỡ ít trả ít. :)). Còn Vn thì rẻ vl rồi. Cứ bung lụa thôi.

    Nguyễn Hiển - Rodgers
    Fullstack Developer JavaScript.

    My Github: https://github.com/cptrodgers

    1


  • E làm đc rồi, thank you very much :)



  • @bacvv Chúc mừng bác nhé. Để vào chơi ủng hộ ^^

    Nguyễn Hiển - Rodgers
    Fullstack Developer JavaScript.

    My Github: https://github.com/cptrodgers

    0


  • E mới cài đc 3 nơi thôi. Mỹ, Anh và Sing :)



  • @bacvv Nãy vô chơi thấy đỡ hơn trc. Vậy chắc bác bên US à. :)). Test thử xem có giựt quá không

    Nguyễn Hiển - Rodgers
    Fullstack Developer JavaScript.

    My Github: https://github.com/cptrodgers

    0

Log in to reply