2011-01-28 37 views
5

Tôi đang cố tạo một công cụ trò chơi đơn giản bằng JavaScript với WebGl, nhưng tôi gặp phải một số vấn đề không mong muốn với JavaScript nói chung, mà tôi hy vọng có thể tránh được. Bên cạnh việc thiếu hiệu suất tổng thể với JavaScript, tôi đang có một số tạm dừng lạ khi kết xuất với WebGl, diễn ra định kỳ, cứ sau một giây hoặc lâu hơn. Tôi cho rằng điều này phải xảy ra với GC trong JavaScript. Có anyway để giảm thiểu những "stutters"? Có bất kỳ thực hành phổ biến nào mà tôi nên biết, một cách để ép buộc, ít nhất là một phần của việc thu gom rác, xảy ra tại một thời điểm mà tôi có thể kiểm soát?Bộ sưu tập Rác Javascript tạm dừng

Tôi biết đây là những câu hỏi đơn giản, nhưng tôi khá mới với JavaScript và tìm kiếm trên internet không cung cấp cho tôi nhiều thông tin hữu ích.

+2

Tất nhiên nó * có thể * là GC, nhưng theo kinh nghiệm của tôi, luôn luôn khi chúng tôi đổ lỗi cho GC cho một cái gì đó, hóa ra chúng tôi đã có một sai lầm bình thường ở đâu đó trong mã. – Boldewyn

+0

Sử dụng các công cụ lược tả của trình duyệt của bạn! Như @Boldewyn đã đề xuất, vấn đề có thể không thực sự là GC. Tối ưu hóa sớm có thể dẫn đến mã không cần thiết phức tạp, nhưng tối ưu hóa mà không có bất kỳ số liệu lược tả nào có thể dẫn đến mã phức tạp * và * thậm chí không thực sự cải thiện hiệu suất. – namuol

Trả lời

2

Tái sử dụng các đối tượng càng thường xuyên càng tốt. Nếu bạn đang tạo ra hàng chục đối tượng (như vectơ và ma trận) cho mỗi khung được hiển thị thì chắc chắn bạn sẽ nhận được sự nói lắp liên quan đến GC. Vì vậy, khi bạn đang sử dụng phương pháp tiếp cận dựa trên đồ thị cảnh để kết xuất trò chơi của bạn, bạn có thể muốn lưu vào bộ nhớ cache đối tượng trong các nút đồ thị cảnh chẳng hạn. Hoặc bạn có thể sử dụng Object Pool Pattern. Trong các ngôn ngữ khác như Java, kỹ thuật này không được chấp nhận vì việc tạo đối tượng và GC nhanh đến mức ngày nay một nhóm đối tượng không còn trợ giúp nữa. Nhưng trong JavaScript nó vẫn có thể giúp đỡ.

Tôi gặp trục trặc trong trò chơi JavaScript tôi đã viết vào năm ngoái và tôi đã giải quyết nó bằng cách viết lại công cụ vector 2D của mình để hoàn toàn không có đối tượng mới nào được tạo trong khi hiển thị khung. Các đối tượng chỉ được tạo một lần khi cảnh được dựng lên hoặc các nút cảnh mới được thêm vào nó. Nhưng việc hiển thị và tạo hiệu ứng động cảnh sẽ tạo ra hoàn toàn không có đối tượng mới.

Bạn có thể muốn xem xét động cơ 2D của tôi:

http://www.ailis.de/~k/hg/javascript/twodee/file/tip/src/main/javascript/twodee

Bạn sẽ nhận thấy rằng tôi bộ nhớ cache vectơ tạm thời cần thiết và ma trận trong các lĩnh vực tĩnh và rằng tôi đã sử dụng các lớp vector và ma trận có thể thay đổi thay của các vectơ/ma trận không thay đổi nên các biến đổi/ma trận được thay đổi thay vì tạo các vectơ/ma trận kết quả mới khi thực hiện toán học với chúng.