Vietnam

    Nodejs.vn

    • Register
    • Login
    • Search
    • Categories
    • Recent
    • Popular
    • Tags
    • Groups
    • Search

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

    Hỏi Đáp
    0
    62
    17022
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • B
      bacvv last edited by bacvv

      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.

      1 Reply Last reply Reply Quote 1
      • P
        phuc nguyen last edited by

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

        1 Reply Last reply Reply Quote 0
        • B
          bacvv last edited by

          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 Reply Last reply Reply Quote 0
          • B
            bacvv last edited by bacvv

            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.

            Nguyen Hien 1 Reply Last reply Reply Quote 0
            • B
              bacvv last edited by

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

              1 Reply Last reply Reply Quote 0
              • Nguyen Hien
                Nguyen Hien @bacvv last edited by

                @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 ^^.

                Sent from Rodgers Zone!!!

                1 Reply Last reply Reply Quote 0
                • Nguyen Hien
                  Nguyen Hien last edited by

                  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à.

                  Sent from Rodgers Zone!!!

                  B 2 Replies Last reply Reply Quote 0
                  • B
                    bacvv @Nguyen Hien last edited by

                    @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.

                    1 Reply Last reply Reply Quote 0
                    • B
                      bacvv @Nguyen Hien last edited by bacvv

                      @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 😞

                      Nguyen Hien 2 Replies Last reply Reply Quote 0
                      • Nguyen Hien
                        Nguyen Hien @bacvv last edited by

                        @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.

                        Sent from Rodgers Zone!!!

                        1 Reply Last reply Reply Quote 0
                        • Nguyen Hien
                          Nguyen Hien @bacvv last edited by

                          @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. ^^

                          Sent from Rodgers Zone!!!

                          1 Reply Last reply Reply Quote 0
                          • B
                            bacvv last edited by

                            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.io và wormax.io làm kiểu già chạy nhanh thế?

                            Nguyen Hien 1 Reply Last reply Reply Quote 0
                            • Nguyen Hien
                              Nguyen Hien @bacvv last edited by

                              @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 đó :))

                              Sent from Rodgers Zone!!!

                              1 Reply Last reply Reply Quote 1
                              • Nguyen Hien
                                Nguyen Hien last edited by

                                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á.

                                Sent from Rodgers Zone!!!

                                1 Reply Last reply Reply Quote 1
                                • B
                                  bacvv last edited by bacvv

                                  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

                                  Nguyen Hien 2 Replies Last reply Reply Quote 0
                                  • Nguyen Hien
                                    Nguyen Hien @bacvv last edited by

                                    @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 :)))

                                    Sent from Rodgers Zone!!!

                                    1 Reply Last reply Reply Quote 1
                                    • Nguyen Hien
                                      Nguyen Hien @bacvv last edited by

                                      @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.

                                      Sent from Rodgers Zone!!!

                                      1 Reply Last reply Reply Quote 1
                                      • B
                                        bacvv last edited by

                                        E làm đc rồi, thank you very much 🙂

                                        Nguyen Hien 1 Reply Last reply Reply Quote 0
                                        • Nguyen Hien
                                          Nguyen Hien @bacvv last edited by

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

                                          Sent from Rodgers Zone!!!

                                          1 Reply Last reply Reply Quote 0
                                          • B
                                            bacvv last edited by

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

                                            Nguyen Hien 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post
                                            $(document).ready(function () { app.coldLoad(); }); }