http://blog.csdn.net/kyo7552/article/details/17163487

多种分辨率的适配一直都是一个蛋疼的问题,各家公司可能都有自己的一套方案。今天我为大家介绍的是我们在多款游戏里实践后的解决方案,相对来说成本和实现难度都较低,效果也很不错。

多种分辨率适配的原理

因为横屏和竖屏的原理完全相同,所以本文先以竖屏为例,后文再说明横屏的处理。

制作一张 640×960 像素的图片,并传入设备查看:

  1. 查看时将图片缩放到合适大小,确保图片左右两边正好填满整个屏幕。
  2. 在不同分辨率的设备上,这张图片的显示效果差异体现在图片上下是否能够填满屏幕。

例如在 480×800 的设备上,这张 640×960 图片会被缩小为 480×720 像素来显示,左右填满屏幕,上下出现黑边。

在一些常见分辨率中,图片的显示效果:

缩放比例 = 屏幕像素宽度 / 图片像素宽度
  • 屏幕尺寸 _640x960 像素,缩放比例 100%,正好填满整个屏幕
  • 屏幕尺寸 640×1136 像素,缩放比例 100%,上下有黑边
  • 屏幕尺寸 _480x800 像素,缩放比例 _75%,图片缩放后尺寸 _480x720 像素,上下有黑边
  • 屏幕尺寸 _480x854 像素,缩放比例 _75%,图片缩放后尺寸 _480x720 像素,上下有黑边
  • 屏幕尺寸 768×1024 像素,缩放比例 120%,图片缩放后尺寸 768×1152 像素,无黑边,但图像上下有裁剪(超出屏幕无法显示)

上下有黑边是肯定不好看的。那要保证填满屏幕,我们只需要将图片做得更大一点就可以了。图片高度的计算:

图片高度 = 屏幕像素高度 / (屏幕像素宽度 / 图片像素宽度)

按照这个公式,上述分辨率,图片的高度应该是:

  • 屏幕尺寸 _640x960 像素,图像高度 960 像素
  • 屏幕尺寸 640×1136 像素,图像高度 1136 像素
  • 屏幕尺寸 _480x800 像素,图像高度 1066.67 像素
  • 屏幕尺寸 _480x854 像素,图像高度 1138.67 像素
  • 屏幕尺寸 768×1024 像素,图像高度 853.3 像素

其中最大值是 1138.67,考虑制作方便,高度取值 1140。也就是说 640×1140 的图片可以完全填满上述各种分辨率的屏幕。

在游戏里我们也可以借鉴这种方式。不管屏幕多大,反正我把游戏场景的宽度都给定死,就是 640。那么在不同设备上,要处理的问题就是场景高度的变化。以此为基础,适配多种分辨率的原理就很简单了:

  1. 游戏场景的宽度固定。
  2. 根据屏幕分辨率计算出游戏场景的高度。
  3. 使用较大的背景图,确保任何分辨率下都可以填满屏幕。
  4. 根据场景高度来定位显示内容。

美术素材的准备

在理解原理后,最后一个难点就是美术素材的制作了。

美术素材主要有两类:背景图、场景元素。

对于背景图,设计师按照 1536×2280 来制作,原因是:

  1. 640×960 的参考虚拟分辨率,背景图最大尺寸是 640×1140,翻倍后是 1280×2280。
  2. 考虑到可能会为 iPad 单独做优化,所以图片宽度放大到 1536。因为 Retina iPad 的屏幕分辨率是 1536×2048。

背景图制作时,也要考虑到最小可视区域问题,确保背景的主要内容在不同分辨率下都能够被看到。如果是比较复杂的背景,也可以分为多层叠加。

例如一张背景是由远景和近处的人物构成。那么可以将远景和人物分为两张图。远景屏幕居中显示,人物则以程序进行定位,确保任何分辨率下,人物的头部都能完整显示的。这样可以取得很好的显示效果。

场景元素的制作要麻烦一些。首先,确保最小可视区域中,能够容纳一个场景的所有内容。其次,在更大屏幕上,一些场景元素(主要是 UI)要可以拉伸。基本原则是按照 640×960 翻倍,也就是 1280×1920 的尺寸来制作。一些需要拉伸的元素则做成九宫格,或者多张图的拼接。

设计师按照 1280×1920 的分辨率制作出效果图,开发人员再根据实际情况,对部分元素进行相对定位。

设计师的图像按照 100% 尺寸导出后,还需要用 Texture Packer 等工具做进一步处理。这里的处理除了打包,最主要的就是将图像缩小为 50%。这样 1536×2280 的背景图就变成了 768×1140;1280×1920 的场景就变成了 640×960。

最终,我们仅用一套素材,就适应了所有设备。并且为 Retina iPad 和其他超高分辨率设备留下了优化的空间。

针对 iPad 的优化

由于 iPad 的屏幕宽度超过了 640,所以整个场景都会被放大一点。这样带来了两个问题:

  1. 有一些轻微的模糊。
  2. 场景上下的内容被裁剪较多。

要解决这个问题有两种方案:

  1. 以 768×1024 为参考虚拟分辨率。
  2. 单独为 iPad 设置虚拟分辨率。

第一种方法最简单。只要按照前文所述,重新计算出新的图片尺寸,并以此为基础让美术制作就可以了。不过缺点也很突出:

  1. 图片的尺寸大大增加。背景图需要制作为 1536×2728,场景元素的参考分辨率是 1536×2048。这直接导致最终生成的图片尺寸变大,占用的内存增多。光是背景图,就要增加 20%。
  2. 只有在 iPad 上才是不缩放显示,在其他所有设备上,场景都会缩小后显示。这对于一些文字内容,在手机上阅读起来就比较困难。虽然可以放大字体,但因为缩放的存在,字体也无法做到特别清晰。

考虑到手机用户远远多过 iPad 用户,我们的游戏还是以手机用户的体验为优先考虑。所以我们采用第二种方式来优化 iPad 体验。

在游戏启动时,检测到如果是 iPad,则使用 768×1024 的虚拟分辨率。这样做比较麻烦的地方就是程序要做不少调整,确保场景元素在 640x???? 和 768×1024 两种虚拟分辨率下都可以正常显示。

从实践看,熟练的开发人员一周左右就可以做好一款休闲游戏(大概就是天天爱消除那种复杂度)的 iPad 优化。美术素材方面,除了极少数 UI 元素要做一些调整或为 iPad 单独制作一份外,其他素材都可以继续沿用。对开发成本的影响极小。

针对超高分辨率设备的优化

Retina 显示屏幕的 iPad 和一些高端 Android 手机或平板,都提供了极高的分辨率。在这些设备上要获得最好的显示效果,就必须使用超高分辨率的素材。这也是本文前面提到美术素材制作时,为什么要求极高的分辨率。

不过因为超高分辨率的素材,游戏体积几乎是翻倍增加,这非常不利于游戏的传播。所以比较实际的做法还是单独出一个版本供用户下载,或者游戏启动后检测到超高分辨率设备,再提醒用户下载资源。

这些设备的优化对程序没什么影响,因为虚拟分辨率仍然是 640×960 为基准。只需要在程序启动时,用以下代码通知引擎使用了超高分辨率的素材:

总结

这一套方案,我们已经用在好几个游戏里面了。不管是从成本、最终效果上看,都很不错。

对于时间、预算都很紧张的小团队来说,连 iPad 优化那一步都可以放到后续版本来做。首先把大量手机用户的需求满足后,再来优化 iPad 体验。

最后,本文所述方案也完全可以用在原版 cocos2d-x 中。因为原版 cocos2d-x 也具有 FIXED_WIDTH 和 FIXED_HEIGHT 两种屏幕适配策略。

cocos2d-x 多分辨率适配详解(转载),以前北京团队设计的游戏,也是用这套方案的更多相关文章

  1. [转]quick-cocos2d-x 多分辨率适配详解

    http://cn.quick-x.com/?p=1436 多种分辨率的适配一直都是一个蛋疼的问题,各家公司可能都有自己的一套方案.今天我为大家介绍的是我们在多款游戏里实践后的解决方案,相对来说成本和 ...

  2. malloc 与 free函数详解<转载>

    malloc和free函数详解   本文介绍malloc和free函数的内容. 在C中,对内存的管理是相当重要.下面开始介绍这两个函数: 一.malloc()和free()的基本概念以及基本用法: 1 ...

  3. jQuery的deferred对象详解(转载)

    本文转载自: jQuery的deferred对象详解(转载)

  4. android屏幕适配详解

    android屏幕适配详解 官方地址:http://developer.android.com/guide/practices/screens_support.html 一.关于布局适配建议 1.不要 ...

  5. Java 反射 设计模式 动态代理机制详解 [ 转载 ]

    Java 反射 设计模式 动态代理机制详解 [ 转载 ] @author 亦山 原文链接:http://blog.csdn.net/luanlouis/article/details/24589193 ...

  6. GridView内容详解(转载)

    GridView内容详解(转载) GridView是ASP.NET界面开发中的一个重要的控件,对GridView使用的熟练程度直接影响软件开发的进度及功能的实现.(车延禄)GridView的主要新特性 ...

  7. 如约而至,Java 10 正式发布! Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十四)Redis缓存正确的使用姿势 努力的孩子运气不会太差,跌宕的人生定当更加精彩 优先队列详解(转载)

    如约而至,Java 10 正式发布!   3 月 20 日,Oracle 宣布 Java 10 正式发布. 官方已提供下载:http://www.oracle.com/technetwork/java ...

  8. Linux下的I/O复用与epoll详解(转载)

    Linux下的I/O复用与epoll详解 转载自:https://www.cnblogs.com/lojunren/p/3856290.html  前言 I/O多路复用有很多种实现.在linux上,2 ...

  9. Java-异常机制详解以及开发时异常设计的原则要求

    Java-异常机制详解以及开发时异常设计的原则要求 http://blog.csdn.net/Jack__Frost/article/details/52760930?locationNum=6

随机推荐

  1. iOS 9 之后更改状态栏字体颜色

    设置statusBar的[前景部分] 简单来说,就是设置显示电池电量.时间.网络部分标示的颜色, 这里只能设置两种颜色: 默认的黑色(UIStatusBarStyleDefault) 白色(UISta ...

  2. JavaScript的语法规则

    JavaScript的语法规则 JavaScript区分大小写 JavaScript脚本程序须嵌入在HTML文件中 JavaScript脚本程序中不能包含HTML标记代码 每行写一条脚本语句 语句末尾 ...

  3. 对整站的a链接进行监控,对匹配规则进行指定页面的跳转

    项目中有个需求,就是将非本站的链接跳转到过渡页(提示即将离开本站的那种页面).这个时候想起了腾讯邮箱,不安全链接会有新的页面提示,如下图: 本以为ASP.NET中有全局的方法获取到点击或者跳转的链接, ...

  4. 利用TCP 客户端---->服务端 传送文件到指定路径,并返回一个友好的回馈

    首先盲写的一个传输文件的方法,但测试发现了一个非常不容易发现的问题,这里先说明一下. 错误的代码如下: package com.TCP.java; import java.io.File; impor ...

  5. [CSS]浮动的那点事儿

    元素是怎样浮动 元素的水平方向浮动,意味着元素只能左右移动而不能上下移动. 一个浮动元素会尽量向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止. 浮动元素之后的元素将围绕它. 浮动元素 ...

  6. C#编写记事本(高仿)

    近一周写的关于记事本的代码,高仿记事本.本人C#入门不久,其中存在代码冗余,但懒得修改了. 经测试运行正常. 一.主窗体设计及代码 namespace BestEditor { public part ...

  7. memcached 使用积累

    1.memcahed在windows上的安装 . 下载memcache的windows稳定版,解压放某个盘下面,比如在c:\memcached . 在终端(也即cmd命令界面)下输入 ‘c:\memc ...

  8. 类似FirePhp的Chrome.php 调试php

    之前一直用firephp来调试php,主要受限Firefox启动太慢,研究了下chromephp; 写了个简单的判断模版: <?php /** * @Author: Klaus * @Date: ...

  9. corsproxy

    安装完 node.js运行 npm install -g corsproxy安装完成 corsproxy

  10. 开博第一篇:DHT 爬虫的学习记录

    经过一段时间的研究和学习,大致了解了DHT网络的一些信息,大部分还是参会别人的相关代码,一方面主要对DHT爬虫原理感兴趣,最主要的是为了学习python,大部分是别人的东西原理还是引用别人的吧 DHT ...