
cc.view.getDesignResolutionSize();//Returns the designed size for the view. Default resolution size is the same
这个属性我有点疑问方便解答吗…分别在项目设置与当前场景的canvas属性里更改了设计分辨率,但启动当前场景后打印出来的cc.view.getDesignResolutionSize()和我改的设计分辨率不一致。。。
有碰到过这种情况吗?重启过编辑器了,creator1.9.0forMac的
这个就是需要自己都打印一遍就心里有数了,。。。
然后下一次使用再次打印一次。。。
正在被这个问题困扰,并且看了解答还是搞不明白
顶上去
抽空在主流的几个iPhone机器上都打印一遍,方便大家借鉴。
var s1 = cc.director.getVisibleSize(); //获取运行场景的可见大小
console.log(---getVisibleSize=${JSON.stringify(s1)});
let s2 = cc.director.getWinSize();//获取视图的大小,以点为单位
console.log(---getWinSize=${JSON.stringify(s2)});
let s3 = cc.director.getWinSizeInPixels();//获取视图大小,以像素为单位
console.log(---getWinSizeInPixels=${JSON.stringify(s3)});
let s4 = cc.view.getFrameSize();//Returns the frame size of the view.
console.log(---getFrameSize=${JSON.stringify(s4)});
let s5 = cc.view.getViewPortRect();//Returns the view port rectangle.
console.log(---getViewPortRect=${JSON.stringify(s5)});
let s6 = cc.view.getVisibleSize();//Returns the visible area size of the view port.
console.log(---getVisibleSize=${JSON.stringify(s6)});
let s7 = cc.view.getVisibleSizeInPixel();//Returns the visible area size of the view port.
console.log(---getVisibleSizeInPixel=${JSON.stringify(s7)});
let s8 = cc.view.getDesignResolutionSize();//Returns th
console.log(---getDesignResolutionSize=${JSON.stringify(s8)});
/**
- iphone 8 plus
JS: —getVisibleSize={“width”:751,“height”:1334}
JS: —getWinSize={“width”:751,“height”:1334}
JS: —getWinSizeInPixels={“width”:751,“height”:1334}
JS: —getFrameSize={“width”:1242,“height”:2208}
JS: —getViewPortRect={“x”:-0.51727294921875,“y”:0,“width”:1243.0345458984375,“height”:2208}
JS: —getVisibleSize={“width”:751,“height”:1334}
JS: —getVisibleSizeInPixel={“width”:751,“height”:1334}
JS: —getDesignResolutionSize={“width”:751,“height”:1334}
/
/* - iphone 8
JS: —getVisibleSize={“width”:750,“height”:1334}
JS: —getWinSize={“width”:750,“height”:1334}
JS: —getWinSizeInPixels={“width”:750,“height”:1334}
JS: —getFrameSize={“width”:750,“height”:1334}
JS: —getViewPortRect={“x”:0,“y”:0,“width”:750,“height”:1334}
JS: —getVisibleSize={“width”:750,“height”:1334}
JS: —getVisibleSizeInPixel={“width”:750,“height”:1334}
JS: —getDesignResolutionSize={“width”:750,“height”:1334}
/
/* - iphone 11 / xr
JS: —getVisibleSize={“width”:750,“height”:1624}
JS: —getWinSize={“width”:750,“height”:1624}
JS: —getWinSizeInPixels={“width”:750,“height”:1624}
JS: —getFrameSize={“width”:828,“height”:1792}
JS: —getViewPortRect={“x”:0,“y”:-0.447998046875,“width”:828,“height”:1792.89599609375}
JS: —getVisibleSize={“width”:750,“height”:1624}
JS: —getVisibleSizeInPixel={“width”:750,“height”:1624}
JS: —getDesignResolutionSize={“width”:750,“height”:1624}
JS: 适配状态栏,高:88,
/
/* - iphone 11 pro max
JS: —getVisibleSize={“width”:750,“height”:1624}
JS: —getWinSize={“width”:750,“height”:1624}
JS: —getWinSizeInPixels={“width”:750,“height”:1624}
JS: —getFrameSize={“width”:1242,“height”:2688}
JS: —getViewPortRect={“x”:0,“y”:-0.6719970703125,“width”:1242,“height”:2689.343994140625}
JS: —getVisibleSize={“width”:750,“height”:1624}
JS: —getVisibleSizeInPixel={“width”:750,“height”:1624}
JS: —getDesignResolutionSize={“width”:750,“height”:1624}
JS: 适配状态栏,高:132
*/
大哥怎么不骂了呀 
虽然这篇贴子已完结,但对于这么多size的使用还是比较懵懂,后来研究了一番后,把自己的理解补充一下,以后还可以查阅。
先定义一下项目场景:
游戏的设计分辨率:1334 x 750 iPhone 6的屏幕大小 横屏 适配方案:FIT_HEIGHT
再看看几个函数定义:
//视图中canvas尺寸
console.log(“canvas size:”, cc.view.getCanvasSize());
//视图中窗口可见区域尺寸
console.log(“visible Size:”, cc.view.getVisibleSize());
//设计分辨率
console.log(“DesignResolutionSize Size:”, cc.view.getDesignResolutionSize());
console.log("frame size", cc.view.getFrameSize());
在小米8 上的值:
canvas size : 2249 x 1078
visible size : 1564.703 x 750
DesignResolutionSize size: 1334 x 750
frame size: 818 x 392
这些值差异都很大,它们分别都代表什么大小呢?
canvas size :手机厂商用来营销吹牛啤的大小,设备物理像素
visible size: 官方意思是可以在游戏中使用的值,实际上就是游戏中的屏幕大小(这里先忽略安全区域的计算)。那么这个值是代表有多大呢?又是怎么出来的?这个是最关键的尺寸概念!
首先,我们在游戏中经常用到的Vec2 Size Rect各种与距离、长度相关的值其实不是像素值,是一个逻辑单位。但逻辑单位也应该有对应实际长度呀,说到这里就要把设计分辨率和适配方案结合一起说了。
一开始接触设计分辨率时也很懵逼,为啥叫分辨率?1个分辨率是几个像素,还是几厘米?都没找到直接的答案。但做项目都知道,游戏中显示一张图不可能为各种屏幕做多个不同尺寸版本。只能统一一个尺寸加上适配方案,让一张图能在多种不同大小的屏幕上看起来都合适,实际做不到100%精确显示的,合适就可以了。
上面提到适配方案:FIT_HEIGHT,也就是说游戏是在任何屏幕大小下均以设计分辨率的高(750)作屏幕的高度,那么屏幕宽度就是1334了吗?不是,上面已经写了1564.703,既然高已定为750,宽就要按比例缩放,这个数字不难推导:
屏幕像素 2249 x 1078 / 750 = 1564.703。假设在游戏中做一个物件从屏幕坐标最高位(0)走到最低位一个点一个点地走就要走750次,同样从最左(0)走到最右就要走1564.703次。(这里不讨论世界坐标和本地坐标,只谈屏幕坐标),所以,cc.view.getVisibleSize是 cocos的屏幕尺寸, 这个尺寸是由canvas size(设备物理像素)通过设计分辨率结合适配方案所得出来的。注意了,同一个设计分辨率,不同的适配方案就会有不同的cc.view.getVisibleSize大小!
上面强调了cc.view.getVisibleSize是屏幕尺寸, frame size又是什么鬼?很多资料都说是屏幕尺寸。是的,确实是屏幕尺寸,但不是游戏里的屏幕尺寸,而是浏览器里或者JS容器的屏幕尺寸。这个数字也很奇葩818 x 392,怎么来的?
这个问题是由于做H5网页也遇到了和我们做游戏的相同问题,做网页的人在CSS只会指定一个版本的样式大小,不可能为各种不同规格的屏幕指定不同版本的样式。那么就有了逻辑像素的概念,818 x 392就是逻辑像素的大小,网页使用逻辑像素定义CSS就只要做一套样式就行了。浏览器有一个参数cc.view.getDevicePixelRatio(设备或浏览器像素比例),小米8的值:2.75, 算算818 x 2.75和392 x 2.75就一切真相了。
所以,frame size 其实和游戏里的坐标没关系,因为我们游戏里的坐标运算都是直接gl,都用不上浏览器的换算的。另外 cc.view.getScaleX();cc.view.getScaleY();这两个是适配的比例值要注意一下。比如FIT_HEIGHT方案就是 1078/750 = 1.4373333
事情还真没那么简单,实际项目中真和frame size扯上关系了,字节平台bannerAd广告接入的参数style.left和top就是使用浏览器逻辑像素单位!比如在游戏屏幕里指定一个NODE的位置用来显示bannerAd,结果要
node.getPosition -> node.parent.converttoWorldSpaceAR -> cc.Camera.getWorldToScreenPoint -> 乘以 cc.view.getScaleX()得到设备物理像素 -> 除以cc.view.getDevicePixelRatio -> 浏览器逻辑像素值 最终结果
好了,几个Size的概念基本就理解了,如果有错误的请大家指证。
真的太乱了