getVisiblesize()和getVisibleOrigin可视分辨率的算法!

        当知道了getWinSize是自己的设计分辨率 ,getFrameSize是设备分辨率后,还有知道资源的分辨率一般是参考设计分辨率,如果是设备分辨率宽高比等于设计分辨率宽高比,那么不管哪种适配方式资源图片都能正常缩放铺满屏幕,只是分辨率效果不同而已,此时visibleSize也等于屏幕分辨率SIZE,但如果是设备分辨率的宽高比和设计分辨率宽高比不一致时,这时候visibleSize就差别大了,但这时候我们也对visibleSize大小产生疑问很混淆了,不知道结果是如何计算出来的,,,,针对此疑惑,专门去看了cocos里的代码,如下:

     getVisibleSize和getVisibleOrigin的算法,而里面用到了_scaleX 和 _scaleY的值,看后面继续跟踪代码

​
Size GLView::getVisibleSize() const
{
    if (_resolutionPolicy == ResolutionPolicy::NO_BORDER)
    {
        return Size(_screenSize.width/_scaleX, _screenSize.height/_scaleY);
    }
    else 
    {
        return _designResolutionSize;
    }
}

Vec2 GLView::getVisibleOrigin() const
{
    if (_resolutionPolicy == ResolutionPolicy::NO_BORDER)
    {
        return Vec2((_designResolutionSize.width - _screenSize.width/_scaleX)/2, 
                           (_designResolutionSize.height - _screenSize.height/_scaleY)/2);
    }
    else 
    {
        return Vec2::ZERO;
    }
}

​

看下面代码,不要担心,在整个类里除了初始化的1.0f外,就只有下面这里在改变_scaleX和_scaleY的值了,但问题又来了,

这两个值是什么时候改变呢,好,继续跟踪代码。。。去找这个update....接口的引用;

​
void GLView::updateDesignResolutionSize()
{
    if (_screenSize.width > 0 && _screenSize.height > 0
        && _designResolutionSize.width > 0 && _designResolutionSize.height > 0)
    {
        _scaleX = (float)_screenSize.width / _designResolutionSize.width;
        _scaleY = (float)_screenSize.height / _designResolutionSize.height;
        
        if (_resolutionPolicy == ResolutionPolicy::NO_BORDER)
        {
            _scaleX = _scaleY = MAX(_scaleX, _scaleY);
        }
        
        else if (_resolutionPolicy == ResolutionPolicy::SHOW_ALL)
        {
            _scaleX = _scaleY = MIN(_scaleX, _scaleY);
        }
        
        else if ( _resolutionPolicy == ResolutionPolicy::FIXED_HEIGHT) {
            _scaleX = _scaleY;
            _designResolutionSize.width = ceilf(_screenSize.width/_scaleX);
        }
        
        else if ( _resolutionPolicy == ResolutionPolicy::FIXED_WIDTH) {
            _scaleY = _scaleX;
            _designResolutionSize.height = ceilf(_screenSize.height/_scaleY);
        }
        
        // calculate the rect of viewport
        float viewPortW = _designResolutionSize.width * _scaleX;
        float viewPortH = _designResolutionSize.height * _scaleY;
        
        _viewPortRect.setRect((_screenSize.width - viewPortW) / 2, (_screenSize.height - viewPortH) / 2, viewPortW, viewPortH);


        // reset director's member variables to fit visible rect
        auto director = Director::getInstance();
        director->_winSizeInPoints = getDesignResolutionSize();
        director->_isStatusLabelUpdated = true;
        director->setProjection(director->getProjection());

        // Github issue #16139
        // A default viewport is needed in order to display the FPS,
        // since the FPS are rendered in the Director, and there is no viewport there.
        // Everything, including the FPS should renderer in the Scene.
        glViewport(0, 0, _screenSize.width, _screenSize.height);
    }
}

​

接着看下面代码,,,找到了接口的调用,也就只有这一个地方,而且setDesignResolutionSize这个接口一般都是在初始化窗口的时候就会调用,也就是说上面代码里的_scaleX和Y是正确有效的;

void GLView::setDesignResolutionSize(float width, float height, ResolutionPolicy resolutionPolicy)
{
    CCASSERT(resolutionPolicy != ResolutionPolicy::UNKNOWN, "should set resolutionPolicy");
    
    if (width == 0.0f || height == 0.0f)
    {
        return;
    }

    _designResolutionSize.setSize(width, height);
    _resolutionPolicy = resolutionPolicy;
    //搜索了引用,也就只有这里有调用了
    updateDesignResolutionSize();
 }

从以上代码跟踪,,最终确定了最开始贴出来的getVisibleSize接口里的计算方式正是我们需要可以参考的计算方式,除非cocos官方的计算方式有误。

猜你喜欢

转载自blog.csdn.net/ylwdi/article/details/81779613
今日推荐