2013-02-21 34 views
5

Có thể đo khoảng cách thời gian dưới 1 mili giây được hỗ trợ trong tất cả các trình duyệt mà tôi biết chỉ có một cách trong Chrome.tính FPS trong Javascript dưới 1 mili giây

Phương pháp chrome: window.performance.now()

Hiện nay tôi làm các phép đo FPS trong không gian thời gian mili giây, nhưng nếu nhỏ hơn 1ms đèo tôi nhận được vô cực vì hai con số được làm tròn đến phần nghìn giây gần nhất để họ là những giá trị như nhau.

Có ai biết chức năng trình duyệt chéo không tính khoảng cách nhỏ hơn 1 mili giây trong javascript?

+1

JavaScript (hiện tại) thiếu bộ tính giờ phụ giây. –

+0

Tôi sẽ tuyên bố không, vì đối tượng Date hoạt động với mili giây ở mức thấp nhất, nhưng hãy cho tôi biết nếu không. – philipp

+0

có thể trùng lặp của [JavaScript có cung cấp bộ hẹn giờ có độ phân giải cao không?] (Http: // stackoverflow.com/questions/6875625/does-javascript-cung cấp-a-độ phân giải cao-timer) – Bergi

Trả lời

3

Dưới đây là cách bạn có được phép đo chính xác mà không có bộ hẹn giờ chính xác, miễn là thời gian bạn thường xuyên xảy ra.

Trung bình/tổng hợp các số đo không chính xác về thời lượng sự kiện của bạn. Đoạn trích của một trong các dự án của tôi:

 var start = Date.now(); 
     ... (stuff to be timed) 
     var now = Date.now(); 

     if (DEBUG.enabled) { 
      var profile_this_iter = now - start; 
      profile += (profile_this_iter - profile) * 0.02; 
     } 

Mỗi phép đo giá trị mới đưa giá trị đọc của bạn gần với hệ số 0,02. Rõ ràng bạn sẽ muốn tinh chỉnh một chút. Điều này sẽ cho phép bạn đọc trung bình mà dao động xung quanh 0,5ms nếu bạn đọc một thời gian 1ms một nửa thời gian và 0ms một nửa thời gian (với một bộ đếm thời gian độ phân giải 1ms).

Điều này rõ ràng không phải là sự thay thế cho bộ hẹn giờ có độ phân giải cao hơn phù hợp. Nhưng tôi sử dụng thuật toán đơn giản này để cung cấp cho các dự án javascript của tôi một FPS không crappy đọc. Bạn có được một yếu tố giảm xóc mà bạn có thể tinh chỉnh tùy thuộc vào nếu bạn muốn chính xác hơn hoặc phản ứng ngay lập tức hơn để thay đổi. Xem xét sự đơn giản của một trong những điều này, bạn sẽ khó ép để tìm một thuật toán thanh lịch hơn để cung cấp cho bạn một đại diện tốt mà không có bất kỳ dữ liệu đầu vào được cải thiện. Một trong những cách để tăng cường nó là điều chỉnh hệ số tiếp cận (hằng số 0,02) dựa trên tần suất lấy mẫu (nếu thay đổi), theo cách này, tốc độ đo chậm hơn có thể được thực hiện để hội tụ nhanh hơn so với giá trị cố định .

0

High resolution time is available in Chrome 20, nhưng bạn cần lưu ý rằng time resolution in JS depends on the browser, device and circumstances. Nó có thể khác nhau giữa 4ms và 1000 + ms

+0

Bạn có nghĩ câu lệnh thứ hai vẫn hợp lệ không? Bài viết đó đã được viết blog vào năm 2008. – Bergi

+0

@Bergi tốt về bài viết là từ năm 2008, tôi đã thực hiện tìm kiếm nhanh và có vài bài báo từ năm 2010 và 2011 cũng về cùng một vấn đề, vì vậy tôi nghĩ rằng câu lệnh vẫn hợp lệ. – valentinas

+1

Ví dụ: bài viết này: http://www.headlondon.com/our-thoughts/technology/posts/the-accuracy-of-javascript-timing – valentinas

1

Có một cách khác để tính fps, trong đó có thể là một cách để giải quyết vấn đề này. Đó là để đếm số lượng khung hình thực tế trong một giây thứ hai, trong đó nên là khá chính xác, tôi nghĩ vậy.

var fpsStart = new Date().getTime(); 
var fpsCounting = 0; 
var fps = 0; 
start_the_first_frame(); 

// Loop 
function update(){ 
    do_time_consuming_stuff(); 
    fpsCounting++; 
    var thisFrame = new Date().getTime(); 
    if(thisFrame - fpsStart >= 1000){ 
     fpsStart += 1000; 
     fps = fpsCounting; 
     fpsCounting = 0; 
    } 
    request_next_animation_frame(); 
} 

P.S. chỉ cần gõ ngay tại đây, không được kiểm tra, có thể yêu cầu thay đổi nhỏ.

Tôi nhớ nhìn thấy một cách như thế này trong hướng dẫn LWJGL ...

Cũng như ghi nhận của @StevenLu, bạn có thể sửa đổi nó để đếm số lượng khung hình trong 0,5 giây và nhân "fps" bởi hai, hoặc thậm chí thời gian ngắn hơn (ví dụ 0,25 giây) để cập nhật giá trị fps sẽ thường xuyên hơn.

+0

Đây cũng là một giải pháp vững chắc cho vấn đề này. Điều này làm nhiều tính toán FPS trực tiếp hơn bằng cách ghi lại số đếm trên thực tế một giây để nó sẽ cung cấp một giá trị số nguyên cho bạn mà có thể hữu ích hơn kết quả dấu chấm động trừu tượng. Điểm yếu của phương pháp này là tính chính xác của việc đo tốc độ thấp (đọc 0,5 fps sử dụng phương pháp này sẽ cho bạn đọc đọc xen kẽ giữa đọc 1fps và 0fps khi phương pháp của tôi hiển thị cho bạn 0,5, nhưng tôi sẽ mất nhiều thời gian để hội tụ!) –

+0

Tôi cũng đề cập đến thuật toán này cũng có thông số có thể điều chỉnh thuận tiện, tỷ lệ lấy mẫu, vì vậy bạn có thể đếm số khung hình trên 0,5 giây và nhân đôi số đó để tạo ra một lần đọc FPS. Điều này sẽ có một nửa độ chính xác nhưng gấp đôi khả năng đáp ứng. –

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