2009-07-30 28 views
5

Tôi đã tạo một tập lệnh làm mờ màu nền của phần tử. Tôi sử dụng setTimeout() để thực hiện một sự thay đổi gia tăng cho màu mỗi 5 ms. Kịch bản hoạt động tốt nếu tôi chỉ làm mờ màu nền của một thứ tại một thời điểm, nhưng nếu tôi có, nói rằng, 50 yếu tố tôi đang mờ dần cùng một lúc, tốc độ chậm hơn nhiều so với 5 ms vì tất cả đồng thời setTimeout() s chạy cùng một lúc. Một phai mà bình thường nên thực hiện trong 1 giây, ví dụ, có thể mất 30 giây nếu tôi đang mờ dần 50 phần tử cùng một lúc.JavaScript setTimeout() chậm lại dưới tải nặng

Bất kỳ ý tưởng nào về cách tôi có thể khắc phục vấn đề này?

Dưới đây là kịch bản trong trường hợp bất cứ ai có một ý tưởng:

function fadeBackground(elementId, start, end, time) { 
    var iterations = Math.round(time/5); 

    var step = new Array(3); 

    step[0] = (end[0] - start[0])/iterations; 
    step[1] = (end[1] - start[1])/iterations; 
    step[2] = (end[2] - start[2])/iterations; 

    stepFade(elementId, start, step, end, iterations); 
} 

function stepFade(elementId, cur, step, end, iterationsLeft) { 
    iterationsLeft--; 

    document.getElementById(elementId).style.backgroundColor 
     = "rgb(" + cur[0] + "," + cur[1] + "," + cur[2] + ")"; 

    cur[0] = Math.round(end[0] - step[0] * iterationsLeft); 
    cur[1] = Math.round(end[1] - step[1] * iterationsLeft); 
    cur[2] = Math.round(end[2] - step[2] * iterationsLeft); 

    if (iterationsLeft > 1) { 
     setTimeout(function() { 
      stepFade(elementId, cur, step, end, iterationsLeft); 
     }, 5); 
    } 
    else { 
     document.getElementById(elementId).style.backgroundColor 
      = "rgb(" + end[0] + "," + end[1] + "," + end[2] + ")"; 
    } 
} 

Nó được sử dụng như thế này:

fadeBackground("myList", [98,180,232], [255,255,255], 1000); 

Trả lời

11

Dưới đây là một article từ Google, nơi tác giả thảo luận về công việc của họ trên giờ cho Gmail. Họ phát hiện ra rằng có một bộ định thời tần số cao đơn nhanh hơn sử dụng nhiều bộ hẹn giờ nếu họ sử dụng bộ đếm thời gian nặng và nhanh.

Bạn có thể có một bộ hẹn giờ kích hoạt mỗi 5ms và thêm tất cả các phần tử cần được chuyển sang cấu trúc dữ liệu theo dõi vị trí của chúng trong quá trình mờ dần. Sau đó, một bộ đếm thời gian của bạn có thể xem qua danh sách đó và thực hiện các phai tiếp theo cho mỗi phần tử mỗi khi nó được kích hoạt.

Mặt khác, bạn đã thử sử dụng thư viện như Mootools hoặc JQuery thay vì cuộn khung hoạt ảnh của riêng mình? Các nhà phát triển của họ đã đặt rất nhiều công sức vào việc tối ưu hóa các loại hoạt động này.

+0

Tôi đã suy nghĩ rằng một bộ đếm thời gian có thể là cách để đi, nhưng tôi sợ phải thực hiện sự thay đổi. :) Tôi thực sự quyết định cuộn của riêng tôi bởi vì tôi đã sử dụng jQuery để animate() và nó không thực sự mờ dần khoảng 10% thời gian. Thật không may, đó là một tỷ lệ lỗi không thể chấp nhận. Tôi sẽ xem bài viết. Cảm ơn nhiều! – core

+0

Heh. Stackoverflow có "không animate" vấn đề quá. – Nosredna

4

Trước hết tập lệnh của bạn không tính đến thời gian chờ tối thiểu thường là 10-15ms tùy thuộc vào trình duyệt. Bạn có thể xem my post on this topic. Bên trong, bạn sẽ tìm thấy một bảng cho các trình duyệt phổ biến và một liên kết đến chương trình đo lường nó, vì vậy bạn có thể xác minh bản thân yêu cầu đó. Tôi xin lỗi để nói nhưng lặp lại mỗi 5ms là một suy nghĩ mơ ước.

Thứ hai, bộ tính giờ không bị gián đoạn. Không có phép thuật trong chúng — chúng không thể làm gián đoạn bất cứ điều gì đang chạy trong trình duyệt và thực hiện tải trọng của chúng. Thay vào đó, chúng sẽ được hoãn lại cho đến khi mã chạy kết thúc và trình duyệt sẽ lấy lại quyền kiểm soát và khả năng chạy bộ hẹn giờ. Làm mờ 50 phần tử mất thời gian và tôi đặt cược nó lớn hơn 5ms, đặc biệt nếu bạn tính đến toàn bộ mô hình trì hoãn của trình duyệt: bạn cập nhật DOM và trình duyệt sẽ cập nhật trình bày trực quan & hellip; tại một thời điểm nào đó.

Tôi muốn kết thúc trên một lưu ý tích cực:

  • Thay vì phai ra 50 yếu tố cá nhân, cố gắng để nhóm chúng lại và mờ dần cha mẹ — nó có thể được nhanh hơn.
  • Sáng tạo hơn tại giao diện người dùng. Cố gắng đưa ra một giải pháp, không đòi hỏi phải làm mờ dần nhiều yếu tố độc lập cùng một lúc.
  • Luôn xác minh rằng giả định nền của bạn là chính xác trước khi thiết kế xung quanh.
  • Nếu có thể, hãy cố gắng nhắm mục tiêu các trình duyệt hiện đại. Từ trải nghiệm cá nhân của tôi, Google Chrome rất tốt với bộ tính giờ và công cụ JavaScript của nó (V8) cực kỳ nhanh.
Các vấn đề liên quan