cocos图片的选择以及压缩

  我们在使用cocos在windows平台下,运行速度很快很流畅,很强大,可是当我们打包成apk文件,在手机上运行的时候,流畅度很可能降低,甚至还有间歇性内存彪高。

游戏内存优化我们一般可以从这么3个方面入手:引擎自身提供的优化选项,引擎底层框架,语言上层(内存泄漏)。事实上,代码运行占用的内存是很低的,图片等资源的加载和使用占80%你所使用的的内存资源。在这里我们着重分析一下如何由图片减少内存的使用。

  •   首先,图片的格式!各个类型(png8,png32,jpg......)我们区分一下。jpg最大的缺点是不透明,所以只能作为一些不动的背景,在最底层使用。与jpg很像的png8格式都是减少包体的好选择,因为他们的压缩比都是最好的,当然要适用,否则适得其反。
  •   其次,图片是有颜色深度RGBA4444和RGBA8888,即使是采用同样的色深(24bit or 32bit)保存,RGBA4444比RGBA8888的图像质量会差一些,而且在cocos中,最终都会使用RGBA8888,RGBA4444尽量使用颜色深度为16bit的图片,在TexturePacker中开启抖动算法,cc.Texture2D.setDefaultAlphaPixelFormat(cc.Texture2D.PIXEL_FORMAT_RGBA4444)改变默认像素格式,如何单个加载可以在加载需要将颜色深度设为RGBA4444的文件的前后,分别设置PixelFormat;图片保存格式: 8bit 、 24bit 和 24bit(with alpha channel)=32bit 三种格式;
setFormat(RGBA4444);
loadTexture("SpriteSheet.png");
setFormat(RGBA8888);

  •   接下来,看一下纹理加载过程中的内存变化, 先以一张1024*1024 本身大小500k的jpg/png图片为例:

  1. 读取图片文件(500k)
  2. 把jpg/png数据最终都是按RGBA8888(默认)格式解析(4mb)
  3. 释放500k的图片内存
  4. 上传给OpenGL纹理数据(4mb)
  5. 释放4mb内存

  计算图片纹理大小:

  1. 图片的像素点个数(分辨率)

  2. 单位像素占用的字节数(像素格式)。

即纹理内存大小 = 纹理长度 * 纹理宽度 * 单位像素占用的字节数,如:一张1136x640的RGBA8888的png图片占用的内存为 1136x640x4 = 2.8M左右

  • 知道了以上信息,我们可以选择对不同的设备优化:

iOS用什么?当然是用PVR格式。
pvr是iOS设备的图形芯片 PowerVR 图形 支持的专用压缩纹理格式。它在PowerVR图形芯片中效率极高,占用显存也小。

Android设备上,因为硬件不统一,每个厂商GPU使用的不同的纹理压缩,目前可以采用ETC1或者PNG/JPEG格式。

  • 如何使用将图片打包压缩,较少包体,较少内存花销呢?

1.首先使用TexturePacker打包,如果颜色深度不是很高,可以选择抖动算法,打包成大图

2.将压缩后的图片使用https://tinypng.com/这个网站再压缩一次,显著减少包体

此外,在浏览各个大佬博客的时候,看到以下的cocos图片的技巧,(转博客地址http://imgtec.eetrend.com/d6-imgtec/blog/2018-07/16921.html):

1、一帧一帧载入游戏资源
2、减少绘制调用,打包大图
3、载入纹理时按照从大到小的顺序
4、避免高峰内存使用
5、使用载入屏幕预载入游戏资源
6、需要时释放空闲资源
7、收到内存警告后释放缓存资源
8、使用纹理打包器优化纹理大小、格式、颜色深度等
9、使用JPG格式要谨慎!
10、请使用RGB4444颜色深度16位纹理
11、请使用NPOT纹理,不要使用POT纹理
12、避免载入超大纹理
13、推荐1024*1024 NPOT pvr.ccz纹理集,而不要采用RAW PNG纹理

1. 场景、背景、全屏图片
2D手机游戏中,多半都有这样的图片,以作为背景,特别在一些SLG,横版过关游戏中。这种图片对ALPHA没有要求,并且,在同一时间,只会出现一张(如果是多张拼接,也不会超过屏幕尺寸太多),内存不会成为关键点。所以,在这种情况下,我们大胆选择JPG就可以了。

2. 场景的前景,装饰物,可移动对象(npc,moster,…)
这种要看规模,如果规模较小,类型不多。 或者类型虽然多,但同一时间出现在场景中的类型不多,那我们可以选择压缩PNG8的方式,它支持ALPHA通道,文件又小。如果同屏可能出现多种这种,则需要考虑在IOS上使用PVRTC,在ANDROID上使用ETC1+ALPHA_MASK。实际上,为了好维护,一般都是统一用pvr.ccz打包。

3. UI
UI的背景图,可以优先考虑使用压缩PNG8,如果达不到精度要求,则使用PNG32。而对于UI的小元素,可以考虑使用压缩PNG8.

对于UI的图标,一般是不带ALPHA的PVRTC/ETC + 一张公共的ALPHA掩码图,通过双层混合来实现圆边效果。 因为图标同屏出现可能较大。 如果图标能够控制在一定范围内,由于图标是48X48等大小,一张1024x1024的大图,可以放400个图标。 换用JPG,也有4MB的开销,如果这个是可以接受的,也可以使用JPG+ALPHA_MASK的方式。

写到这里才发现,其实只需要下面一句话就可以搞定。

这类图片会不会同时出现多个,同时出现时,内存开销是否无法接受, 如果确实无法接受,则使用GPU纹理,否则,优先考虑JPG,JPG+ALPHA,或者PNG8。就是说,首先要减小安装包大小,如果内存有无法接受的情况,才需要用GPU纹理进行优化。

原文地址:https://www.cnblogs.com/zhangthree/p/10575689.html

时间: 2024-08-28 01:56:32

cocos图片的选择以及压缩的相关文章

网页设计你应该知道的图片格式选择技巧

网页设计中,切图输出是指设计师将手边绘制完成的原始图稿转换成网页用的图片格式.并交由下一位人员网页排版的重要步骤.选择适合的图片格式不但可以将让界面设计得到合理的显示效果.甚至还可以有效的控制图档的档案大小,节省下载时间.有效的减少服务器的负担. 以UI设计师最常用的 Photoshop 以及 Illustrator 为例,都提供了「储存为网页用-」的功能.与默认的存盘模式不同,在这个模式中,软件提供了仿真图文件输出的质量调整.档案大小控制等针对网页图文件需求的选项: 相信许多人都知道网页设计中

H5图片预览、压缩、上传

目标实现: 1.选择图片, 前端预览效果 2.图片大于1.2M的时候, 对图片进行压缩 3.以表单的形式上传图片 4.图片删除 预览效果图: 代码说明: 1.input:file选择图片 <!-- html部分 --> <ul id="preview" class="clear"> <li class="fl"> <img src="/images/audition/icon_upload.pn

libgdx学习记录23——图片移动选择

模拟移动选择图片,采用相机实现. 1 package com.fxb.newtest; 2 3 import com.badlogic.gdx.ApplicationAdapter; 4 import com.badlogic.gdx.Gdx; 5 import com.badlogic.gdx.graphics.Color; 6 import com.badlogic.gdx.graphics.GL10; 7 import com.badlogic.gdx.graphics.Texture;

html5 图片上传,支持图片预览、压缩、及进度显示,兼容IE6+及标准浏览器

原文:html5 图片上传,支持图片预览.压缩.及进度显示,兼容IE6+及标准浏览器 以前写过上传组件,见 打造 html5 文件上传组件,实现进度显示及拖拽上传,兼容IE6+及其它标准浏览器,对付一般的上传没有问题,不过如果是上传图片,且需要预览的话,就力有不逮了,趁着闲暇时间,给上传组件添加了单独的图片上传UI,支持图片预览和缩放(通过调整图片的大小以实现图片压缩). 上传组件特点 轻量级,不依赖任何JS库,核心代码(Q.Uploader.js)仅约700行,min版本加起来不到12KB 纯

php图片水印添加,压缩,剪切类的封装

php对图片文件的操作主要是利用GD库扩展.当我们频繁利用php对图片进行操作时,会自然封装很多函数,否则会写太多重复的代码.当有很多对图片的相关函数的时候,我们可以考虑将这些函数也整理一下,因而就有了封装成类的想法. 操作图片主要历经四个步骤: 打开图片 操作图片 输出图片 销毁图片 1,3,4三个步骤每次都要写,每次又都差不多.真正需要变通的只有操作图片的这一步骤了.操作图片又往往通过1或多个主要的GD函数来完成. 本文封装类里面的四种方法,文字水印(imagettftext()),图片水印

最新javascript自动按比例显示图片,按比例压缩图片显示

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Typ

浓缩的才是精华:浅析GIF格式图片的存储和压缩

GIF(Graphics Interchange Format)原义是"图像互换格式",是CompuServe公司在1987年开发出的图像文件格式,可以说是互联网界的老古董了. GIF格式可以存储多幅彩色图像,如果将这些图像连续播放出来,就能够组成最简单的动画.所以常被用来存储"动态图片",通常时间短,体积小,内容简单,成像相对清晰,适于在早起的慢速互联网上传播. 本来,随着网络带宽的拓展和视频技术的进步,这种图像已经渐渐失去了市场.可是,近年来流行的表情包文化,让

iOS图片上传及压缩

提到从摄像头/相册获取图片是面向终端用户的,由用户去浏览并选择图片为程序使用.在这里,我们需要过UIImagePickerController类来和用户交互. 使用UIImagePickerController和用户交互,我们需要实现2个协议<UIImagePickerControllerDelegate,UINavigationControllerDelegate>. ? 代码如下 复制代码 #pragma mark 从用户相册获取活动图片 - (void)pickImageFromAlbu

b/s 读取多个FTP文件(图片,视频)压缩到服务器 下载到客户端

其实需求是这样, 要做一键导出, 有图片,有照片,youhtml,存在不同的文件夹,每次下载都必须下载最新数据,因为FTP是随时更新的. 1.这要是一直下载下载,浏览器一直跳窗口,蛋疼的我都看不下去.所以,只能选择别的办法 2.要是放在WEB下载,我觉得肯定会崩溃的呀,所以想选择客户端直接下载,但是必须得装插件,类型ActionX之类的.头给否认了.我凑,只能想别的办法 3.只能先用WEB把流读下来,压缩,然后传给用户,很蛋疼,这要是谁点了,多考验服务器内存CPU,但是头说了,这样也比插件好,好