NPAPI插件在Mac Safari中具有很高的CPU使用率

时间:2012-11-23 05:54:25

标签: npapi

我用NPAPI进行视频流播放。

但是在Mac Safari(Mt.Lion,v6.0.2)中,加载时它的CPU使用率很高(7~80%)。 Chrome或FireFox是正常的。

我猜是在调用NPNFuncs.invalidaterect函数时。

int16_t PLUGINAPI::handleEvent(void* event)
{
    NPCocoaEvent* cocoaEvent = (NPCocoaEvent*)event;
    ScriptablePluginObject* pObject = (ScriptablePluginObject*)m_pScriptableObject;


    if(cocoaEvent->type == NPCocoaEventDrawRect) {
        CGContextRef cgContext = cocoaEvent->data.draw.context;

        if(!cgContext)
            return true;

        //Add rect and translate the video
        CGContextAddRect(cgContext, CGRectMake (0, 0, m_Window->width, m_Window->height));
        CGContextTranslateCTM(cgContext, 0, m_Window->height);
        CGContextScaleCTM(cgContext, 1.0, -1.0);

        //Display the video here
        if(pObject && pObject->m_pNpapiPlugin) 
            pObject->m_pNpapiPlugin->WEBVIEWER_DisplayFrame(cgContext, m_Window->width, m_Window->height);

        //Fulsh cgcontextref
        CGContextFlush(cgContext);

        //Generate DrawRect event
        NPRect rect = {0, 0, m_Window->height, m_Window->width};
        NPNFuncs.invalidaterect(m_pNPInstance, &rect);
        NPNFuncs.forceredraw(m_pNPInstance);

    } else {

        if(pObject && pObject->m_pNpapiPlugin)
            pObject->m_pNpapiPlugin->WEBVIEWER_SendEvent(cocoaEvent);
    }

    return true;
}

插件绘制还有其他方法吗?或者我想解决这个问题。

1 个答案:

答案 0 :(得分:1)

你告诉它尽可能快地重绘!

NPNFuncs.invalidaterect(m_pNPInstance, &rect);
NPNFuncs.forceredraw(m_pNPInstance);

当你调用它时会触发另一个绘图事件。 Safari可能比其他浏览器重绘得更快,这可能就是你使用这么多CPU的原因。基本上你所说的是“每次画画,立即画画!”。

不是从你的绘制处理程序(你永远不应该做的!)中调用invalidateRect和forceRedraw,而是设置一个计时器。请记住,如果您每秒绘制的帧数超过60帧,则可能会浪费CPU周期,因为大多数显示器只会快速刷新。我通常建议大多数情况下使用30fps作为最大值,但这是在你和视频卡之间。