位置: 编程技术 - 正文

Cocos2d-X的纹理(2)(cocos3d-x)

发布时间:2024-02-27
&#;&#;

推荐整理分享Cocos2d-X的纹理(2)(cocos3d-x),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:cocos2dx怎么用啊,cocos2dx scrollview,cocos2dx scrollview,cocos3d-x,cocos2dx怎么用,cocos 2d x,cocos 2d x,cocos 2d x,内容如对您有帮助,希望把文章链接给更多的朋友!

原文章地址: 纹理影响着应用程序包的大小、内存占用量、内存带宽,从而影响游戏性能、用户体验以及电耗等,本节将介绍如何对纹理已经优化。

课程笔记压缩纹理

在(Cocos2d-X的纹理(1))一节中,我们讲到了将png、jpg、bmp图片生成Image,将图片的data和type等存入Image,再由Image生成texture,其中jpg等也算是压缩图片。但是这些压缩图片通过GL命令glTexImage2D传入GPU的时候,也需要转换成GPU所认识的format和type,然后传输到GPU,在GPU内存中存为对应的GPU&#;式。所以这些压缩图片不算压缩纹理,这些图片仅减小了应用程序包,并没有对GPU内存优化带来帮助。

压缩纹理是指在CPU端已经压缩好,并且被GL命令所能识别,传输到GPU端可以直接可以从压缩纹理中进行采样渲染。这样要求压缩纹理具备4个特点:1、解压速度快:使得渲染系统可以直接从压缩纹理中读取数据;2、随机读取:采样的时候是根据纹理坐标去纹理中进行采样,传统压缩技术是使用可变压缩比例,读取某个像素点需要解压很大一部分相关像素,压缩纹理采用固定压缩比例,访问像素是可以根据索引读取一小块内容,精准定位;3、不用太在意压缩质量,使用很高的压缩率,因为以大局为重;4、不用在意编码速度,因为将普通纹理压缩成压缩纹理是在游戏开发中进行。压缩纹理的传输使用GL命令glCompressTexImage2D。

压缩纹理的随机读取的原理是:按照压缩比例将纹理分成多个像素块,对每个像素块进行压缩,每个像素块的像素信息存储在一个像素集合中,对这个像素集合制作一个索引图。采样的时候,将纹理坐标转换为块索引&#;,以及该像素点在像素块中的偏移,根据块索引&#;定位到像素块,再在像素块中根据偏移抓取到像素点的信息。像素块的信息还可以根据实际情况进行缓存。

不同的GPU支持不同的压缩纹理&#;式,Apple公司因为使用PowerVR的GPU,所以对pvr压缩纹理&#;式百分之百支持,Android手机则对khronos支持的ETC&#;式比较支持。具体支持的压缩纹理&#;式,可以通过Cocos2d-X提供的API进行check(底层也是调用了OpenGL ES的API进行GL Extension检查)。在OpenGL ES3.0之后,提供了压缩纹理标准。

PVRTC2开始支持NPOT的纹理,支持2bpp和4bpp和压缩比例,支持Alpha通道。

ETC是一种有损压缩纹理&#;式,支持4bpp的压缩比例,不支持Alpha通道,针对Alpha通道,可以通过以下2个方式解决:1、将Alpha通道转化为灰度图,关联到原始纹理,使得纹理高度扩大一倍,在fragment shader中多做一次alpha采样即可(在Cocos2d-X需要实现一个自定义的shader),但是有限制,因为纹理高度是有最大&#;,针对高度在最大&#;一半以上的纹理不可使用这个办法;2、单独生成一张纹理,利用多重纹理的原理,将两个纹理同时绑定到GL。

纹理缓存管理Cocos2d-X的纹理(2)(cocos3d-x)

虽然压缩纹理已经对游戏进行了优化,但是在游戏过程中使用了大量的纹理,所以我们还需要从纹理的生命周期进行进一步优化。在Cocos2d-X中提出了纹理缓存的概念。纹理缓存的目的是使在当前场景需要使用的纹理保存在内存中,且同一个纹理只需要加载一次(在场景开始的时候进行加载,在(Cocos2d-X的渲染系统(5))一节中,我们介绍了glTexImage2D用来加载图片,可以采取每帧加载一张的方式,调用的就是TextureCache的addImageAsync函数)。TextureCache是单例。

在通过sprite的create方法(传入参数为一个图片)创建sprite的时候,调用TextureCache的addImage方法,如果该图片已经在TextureCache存在,那么就直接返回对应的texture,如果不存在,就实例化一个Image,再实例化一个TexImage(引用计数为1),将TexImage和图片名称(也可以用自定义&#;)存储在TextureCache的一个unordered_map成员变量中。然后通过sprite的initWithTexture方法将texture赋&#;给sprite的成员变量,引用计数为2。如果没有TextureCache,当创建texture的那一帧结束的时候,引用计数减1,在sprite消失的时候,texture引用计数减1,当创建texture的那一帧结束,且所有相关的sprite都消失,texture就消失了。且texture不容易被其他类使用。如果使用TextureCache,那么创建的时候引用计数为1,被元素使用加1,元素消失减1。引用计数为1的时候,说明没有被使用,可以通过removeUnusedTextures的方法删除不用的texture,减少内存。如果确定不用,可以使用removeTexture方法release。removeAllTextures对所有texture进行release。sprite的createWithTexture不会将texture 加入TextureCache

纹理缓存只是提供了这些方法,还需要是开发者在上层通过引用计数来对纹理进行控制。缓存机制用于处理资源的创建、缓存、删除、共享,上层的引用计数机制用来管理多个场景之间资源过度和共享。

比如:在一个场景中,使用TextureCache控制该场景中所有的texture(1、2、3),在场景结束的时候,所有的元素都消失,所有的texture引用计数都为1,如果使用removeAllTextures,那么所有的texture都被删除,假如下一个场景,还会用到(2、3、4)的texture,那么就造成浪费。可以引入了上层引用计数机制。在进入一个场景的时候,对这个场景中所用到的资源引用计数加1,对上一个场景用到的资源引用计数减1,删除引用计数为0的资源,将引用计数为1的资源进行加载。大的游戏不可能在场景开始的时候加载所有资源,那么就要根据游戏的进度进行逐步加载。

纹理恢复机制

VolatileTextureMgr记录应用程序正在使用的纹理信息,包括路径、数据等纹理信息,如果游戏重启等,OpenGL ES context被重新创建,可以通过VolatileTextureMgr进行纹理恢复。VolatileTextureMgr会占用一些内存。

纹理所占内存大小

比如*的图片,&#;式为RGBA,那么占得内存大小为**/8=4W byte。需要考虑多级纹理。

更好的优化纹理,需要硬件层面进行提升(加载、内存、特殊压缩纹理&#;式的支持),软件方面(提前加载纹理、减少不用纹理的内存占用、将小纹理合并成大纹理以减少绘制次数、使用多级纹理、使用多重纹理减少绘制次数、使用alpha预乘),资源方面(使用适当的纹理&#;式、使用压缩纹理、设置正确的defalutAlphaPixelFormat)

cocos2dx物理引擎使用 创建碰撞物体--bodylocalbody=cc.PhysicsBody:createBox(self:getContentSize())--,cc.PhysicsMaterial(1,0,1))body:setMass(1)body:setRotationEnable(false)--body:setDynamic(false)body:setContactTestBit

-----CCAction详解(欠了大家好几天了) 前几天就是懒了,白天上课,然后晚上回来几乎也弄不了什么就睡了,所以就没发什么,今天总算打起精神继续学习了。我们今天说CCAction包括,CCAction,

Cocos2dx技术(三)——cocos2dx基本概念(三)精灵 1、什么是精灵精灵是一个2D图像,通过改变它的旋转、角度、位置、尺寸、颜色等属性可以使其运动或者变换。2、创建精灵可以通过不同式的图片(png

标签: cocos3d-x

本文链接地址:https://www.jiuchutong.com/biancheng/368838.html 转载请保留说明!

上一篇:Cocos2dx创建项目脚本(cocos2d怎么创建项目)

下一篇:cocos2dx物理引擎使用(cocos3d物理引擎)

  • 增值税发票勾选平台
  • 业务招待费可以进项抵扣吗
  • 消费税征税范围是什么口诀
  • 主营业务收入没收到钱怎么做账
  • 如何证明自己是低保户
  • 收入纳税明细里的收入是税前还是税后
  • 当前企业不存在是怎么回事
  • 土地政策补贴
  • 微企怎么申请补贴
  • 小规模纳税人交印花税吗
  • 一般劳务报酬和税收区别
  • 事业单位代扣社保公积金分录怎么写的
  • 捐款怎样抵扣个税
  • 劳动局仲裁支付的补偿怎么做账?
  • 废品材料回收价格
  • 银行直接扣的手续费怎么记账
  • 企业2015年申报抵扣的增值税,2016年检查有11000元不得抵扣,需要补交增值税11000元并收滞纳金及罚款1200元,请问老师具体该怎么做账,谢谢
  • 所得税亏损财务处理办法
  • 法人实名认证需要带什么
  • 资产负债表日后调整事项会计处理
  • 应交税费的明细账怎么手工登记
  • 我们无法创建新的分区,也找不到现有的分区 贴吧
  • 结转采购材料的实际成本会计分录怎么写
  • 贸易公司出口是什么意思
  • 糖尿病患者在什么情况下无需
  • 企业接到银行收账通知
  • html前端技术
  • 劳务公司怎么做进项
  • vue2.0解决跨域问题
  • PHP:ftp_delete()的用法_FTP函数
  • 无偿转让股权如何做账
  • 圣帕特里克的传说
  • 前端项目中遇到的问题,如何解决
  • wordpress功能介绍
  • 把ChatGPT接入我的个人网站
  • 前端向后端传递对象数组
  • 如何将tomcat卸载干净
  • 基于Java+SpringBoot+vue+elementui药品商城采购系统详细设计实现
  • xch 未来
  • pytorch创建模型
  • Code For Better 谷歌开发者之声——使用谷歌浏览器 Chrome 更好地调试
  • php socketio
  • 怎么修改手机的地理位置
  • 三方债权债务抵销
  • 公司开的餐费专票可以抵扣吗
  • 关税完税价格计算增值税
  • 增值税专票三联都丢了写情况说明可以吗
  • 租赁公司一般都有什么税
  • phpcms怎么样
  • sql merge语句
  • 经典帝国cms生成器下载
  • 个人所得税年底退税 可以退多少
  • 未发货先开票是否违法
  • 所有小规模都能开专票吗
  • 抵扣是什么意思大白话...举例
  • 完税证明可以去税务局补打吗
  • 金税盘维护费发票
  • 个人出租房屋需要缴纳个税吗
  • 购买的固定资产退货怎么做账
  • 社会保险费结算表怎么打印
  • 收到工程款怎么记账
  • 赔偿金是营业外收入吗
  • 参展企业收到展览费用
  • 房地产销售折让怎么开票
  • 年初要新建帐套吗
  • win19截屏快捷键
  • window10快捷键不能用
  • win7防火墙打不开错误代码6801
  • 怎么用win7兼容模式运行
  • linux中内存是2GB,虚拟内存应该是多少
  • linux小技巧
  • cocos做游戏
  • linux复制文件命令mv
  • 请找到以下
  • node.js app
  • android 自定义dialog
  • 不用税控盘可以勾选发票吗
  • 国家税务总局惠州仲恺高新技术产业开发区税务局
  • 如何在电子税务局看本月应申报的税
  • 争议问题
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号