最好的对多分辨率支持的方案是不处理分辨率,应用程序按照一个预定义的分辨率进行设计,低阶游戏引擎统一处理分辨率的缩放,这个预设的分辨率就是设计分辨率.
设计分辨率
缩放策略
setDesignResolutionSize
可以设置设计分辨率和缩放策略,目前的缩放策略主要有
EXACT_FIT: 充满屏幕设计分辨率直接缩放为屏幕分辨率,会变形
NO_BORDER: 充满屏幕,较宽的部分被裁切,设计分辨率是等比缩放
SHOW_ALL:等比缩放,以较宽的一边缩放,会出现黑边
FIXED_HEIGHT:固定高度宽度等比缩放,充满屏幕,不会裁切
FIXED_WIDTH:固定宽度高度等比缩放,充满屏幕,不会裁切
建议使用的是FIXED_XXX可以根据游戏类型进行选择,同时在界面编辑的时候使用左边也要做选择,在cocos studio中设置百分比、固定文职或者距离边距多少都有影响需要小心处理
常见变量
- getWinSizeL OpenGl视口在转化到设计分辨率下的尺寸,表示绘制区域
- getVisibleSize OpenGl视口在转化到设计分辨率下的尺寸屏幕可见区域的部分
- getVisibleOrigin 表示可见区域原点在绘制区域中的位置
视口设置
setDesignResolutionSize
的调用导致了 视口、透视矩阵和观察点被重新设置
什么时候缩放
由设计分辨率到实际的屏幕分辨率的缩放是什么时候执行的?其实没有执行这个操作.
cocos2dx使用设计分辨率来设置投影矩阵和观察点,并没有将其缩放到屏幕实际分辨率,而只有视口设置为实际分辨率。透视矩阵定义的长宽比和视口窗宽比是相等的。
程序中每个顶点使用设计分辨率下的坐标来定义坐标值,且被当做顶点属性发送给顶点着色器,顶点着色器使用设计分辨率下的模型视图变换矩阵对顶点进行坐标变化。顶点着色器输出的归一化坐标,图元组装阶段归一化坐标转换为屏幕坐标.
视椎体定义的远近平面和视口的长宽比例相等,归一话的坐标被完全投影到是视口上.
资源分辨率
资源分辨率用来对同一个设计分辨率使用不同的分辨率资源进行缩放,如此针对不同分辨率设备使用接近的分辨率资源
资源分辨率的设置
通过setFactor设置资源分辨率的缩放因子,设置缩放因子后所有的资源很好都会被缩放,cocos2dx使用setSearchPaths设置搜索路径来切换对应不同分辨率的资源使用
缩放时机
sprite的顶点数据依赖contentsize,contentsize依赖于实际纹理大小,缩放时机就是在getContentSize, contextsize是将实际的像素分辨率转化为设计分辨率在进行缩放. 绘制纹理的时候使用的是归一化的uv不需要知道纹理实际大小