分帧渲染、分片渲染

import { onUnmounted } from "vue"
// 分帧渲染
export function useDefer(maxCount = 100){
    const count = ref(0)
    let raqId = null
    function updateFrame(){
        count.value++
        if(count.value < maxCount){
            raqId = requestAnimationFrame(updateFrame)
        }
    }
    updateFrame()
    onUnmounted(()=>{
        cancelAnimationFrame(raqId)
    })
    return function (n){
        return count.value >= n
    }
}
// 分片渲染(利用浏览器空闲时间执行)
// 第一版
function performChunk(datas){
    if(datas.length === 0)return 
    let i = 0
    function _run(){
        if(i>=datas.length)return 
        requestIdleCallback((idle)=>{
            while(idle.timeRemaining() > 0 && i<datas.length){
                const div = document.createElement('div')
                div.textContent = datas[i]
                document.body.appendChild(div)
                i++
            }
        })
        _run()
    }
    _run()
}
// 第二版
// btn.onclick = ()=>{
//     const taskHandler = (datas,i)=>{
//         const div = document.createElement('div')
//         div.textContent = datas[i]
//         document.body.appendChild(div)
//     }
//     performChunk(100000,taskHandler)
// }
// function performChunk(datas,taskHandler){
//     if(typeof datas === 'number'){
//         datas = {lengths:datas}
//     }
//     if(datas.length === 0)return 
//     let i = 0
//     function _run(){
//         if(i>=datas.length)return 
//         requestIdleCallback((idle)=>{
//             while(idle.timeRemaining() > 0 && i<datas.length){
//                 taskHandler(datas[i],i)
//                 i++
//             }
//         })
//         _run()
//     }
//     _run()
// }


// 第三版
btn.onclick = ()=>{
    const taskHandler = (datas,i)=>{
        const div = document.createElement('div')
        div.textContent = datas[i]
        document.body.appendChild(div)
    }
    const scheduler = (task)=>{
        setTimeout(()=>{
            const start = Data.now()
            task(()=>Date.now() - start<50)
        },100)
    }
    // performChunk(100000,taskHandler,scheduler)
    browserPerformChunk(100000,taskHandler)
}
function performChunk(datas,taskHandler,scheduler){
    if(typeof datas === 'number'){
        datas = {lengths:datas}
    }
    if(datas.length === 0)return 
    let i = 0
    function _run(){
        if(i>=datas.length)return 
        scheduler((isGoOn)=>{
            while(isGoOn() > 0 && i<datas.length){
                taskHandler(datas[i],i)
                i++
            }
        })
        _run()
    }
    _run()
}
function browserPerformChunk(datas,taskHandler){
    const scheduler = (task)=>{
        requestIdleCallback((idle)=>{
            task(()=>idle.timeRemaining() > 0)
        })
    }
    performChunk(datas,taskHandler,scheduler)
}

  

posted @ 2024-12-14 16:56  国服第一李师师  阅读(11)  评论(0编辑  收藏  举报