2010-05-06 30 views
7

Tôi bắt đầu với một MMORPG javascript thực sự hoạt động trơn tru. Hiện tại, tôi đã tạo một bản demo để chứng minh rằng tôi có thể di chuyển các nhân vật xung quanh và yêu cầu họ trò chuyện với nhau, cũng như xem từng bước di chuyển xung quanh trực tiếp.Tìm hiểu về các vấn đề về chuỗi thời gian JavaScript

http://set.rentfox.net/

giờ Bây giờ Javascript là điều mà tôi đã không được sử dụng rộng rãi, nhưng từ những gì tôi biết, chính xác cho tôi nếu tôi là sai, là có nhiều setIntervals xảy ra tại cùng một thời gian không thực sự làm việc tốt b/c đó là tất cả trên một chủ đề duy nhất.

Cho phép nói rằng tôi muốn có 10 người khác nhau nuking quả cầu lửa tại một con quái vật bằng cách sử dụng định vị nền sprite với setInterval - hoạt ảnh đó sẽ yêu cầu 10 setIntervals vẽ lại DOM cho các thay đổi vị trí nền sprite. Đó không phải là một lỗi lớn sao? Tôi đã tự hỏi nếu có một cách nào đó xung quanh tất cả điều này, có lẽ bằng cách sử dụng Canvas, để tất cả các hình ảnh động có thể xảy ra đồng thời mà không tạo hàng đợi sự kiện và tôi không phải lo lắng về bộ hẹn giờ.

Hy vọng điều đó có ý nghĩa và vui lòng cho tôi biết nếu tôi cần làm rõ thêm.

+2

Tôi muốn đề xuất chỉ sử dụng một setInterval/setTimeout-Loop và xử lý mọi thứ trong đó. – RoToRa

Trả lời

11

Sự cố với nhiều số setInterval s gấp hai lần. Đầu tiên là khi bạn chỉ ra, vì tất cả Javascript trên các trình duyệt là (hiện tại) là một luồng đơn, việc thực thi một bộ đếm thời gian có thể giữ lại việc thực thi của bộ đếm thời gian tiếp theo. (Worker threads đang đến, mặc dù; Firefox already has them, cũng như Safari 4 [và có thể những người khác].) Thứ hai là bộ đếm thời gian xảy ra tại một khoảng thời gian, nhưng nếu trình xử lý của bạn vẫn chạy khi khoảng thời gian đó hết hạn, khoảng thứ hai là hoàn toàn bỏ qua. Ví dụ: bộ hẹn giờ có thể can thiệp vào chính nó.

Phần cuối cùng cần giải thích thêm: Giả sử bạn có setInterval ở 10ms (nhanh nhất bạn có thể mong đợi bất kỳ triển khai nào để thực hiện; có thể được kẹp để chúng không chạy nhanh hơn). Nếu xử lý của bạn mất 13ms, khoảng thời gian đáng lẽ phải xảy ra 10ms sau khi nó bắt đầu sẽ bị bỏ qua hoàn toàn.

Tôi thường sử dụng setTimeout cho loại điều này. Khi xử lý của tôi được kích hoạt, tôi làm công việc của tôi và sau đó lên lịch sự kiện tiếp theo ở cuối trình xử lý. Sau đó (trong giới hạn của những gì bạn có thể chắc chắn), tôi biết sự kiện tiếp theo sẽ xảy ra vào khoảng thời gian đó.

Đối với những gì bạn đang làm, có vẻ như bộ hẹn giờ "xung" đơn sẽ là tốt nhất, làm việc thông qua bất cứ điều gì cần làm trên xung. Cho dù bộ đếm thời gian xung đó sử dụng setInterval hoặc setTimeout là một cuộc gọi phán đoán dựa trên những gì bạn đang nhìn thấy với mã thực của bạn.

+0

Bạn có ý nghĩa gì với bộ hẹn giờ "xung", có bất kỳ đọc nào tôi có thể thực hiện trên kỹ thuật này không? – resopollution

+1

@resopollution: Tôi chỉ có nghĩa là một bộ hẹn giờ duy nhất mà bạn sử dụng để cung cấp cho ứng dụng của mình một xung (ví dụ: nhịp tim). Vì vậy, một bộ đếm thời gian duy nhất làm việc cho nhiều ký tự (cho dù bộ đếm thời gian đó sử dụng 'setInterval' hoặc' setTimeout'). –

+0

cảm ơn vì đã làm rõ – resopollution

3

+1 cho T. J. Crowder, câu trả lời là hoàn hảo. Tôi khuyên bạn nên học cách sử dụng Canvas trên các nút DOM cho hoạt ảnh trò chơi; cái thứ hai chậm và lỗi, và sẽ treo trình duyệt trong bất kỳ tình huống không tầm thường nào. OTOH, Canvas nhanh hơn nhiều và có thể được tăng tốc phần cứng và thậm chí có ngữ cảnh 3D nếu bạn cần.

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