位置: 编程技术 - 正文

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

编辑:rootadmin
&#;&#;

推荐整理分享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物理引擎)

  • 营业成本包括哪些费用
  • 公司提供午餐的目的
  • 发票红票和退票区别在哪
  • 法人股东分红交什么税
  • 冲减暂估成本的会计分录
  • 资产负债表中应收账款
  • 无偿赠送商品要纳企业所得税吗
  • 企业将资产移送他人的下列情形
  • 应收分保合同准备材料
  • 贷款利息进项税额
  • 多缴纳的附加税怎么退
  • 非营利性企业要交企业所得税吗
  • 城建税如何纳税申报
  • 资产一次性摊销
  • 工程成本哪些可以抵扣
  • 还在讨论“税务金四”上线?税务和银行要联手清查单位和个人账户了!
  • 企业自主招聘有编制吗
  • 公司低价卖房土地增值税计税方法是什么
  • 500万以下固定资产最新政策
  • 如果工程款要不到的话怎么办
  • 二手房产增值税率
  • 研发支出期末列报
  • 不得免征和抵扣的税额
  • 软件产品合同
  • 公司聚餐计入福利费还是招待费
  • 建筑行业会计成本会计工作流程
  • mac怎么调整网页大小
  • macbook右上角
  • 期间费用包括哪几个科目
  • 车间租金计入什么会计科目
  • 购入嵌入式软件能一次性扣除吗
  • Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
  • hypertrm.exe系统错误
  • win11怎么录屏游戏
  • PHP:mb_convert_kana()的用法_mbstring函数
  • avgserv9.exe是什么进程 avgserv9进程的详细介绍
  • 工程改造怎么做账
  • 进料加工与来料加工均为一进一出的两笔交易
  • 建安企业账务处理 工程施工
  • web应用程序的主要组成部分
  • opencv1.0
  • java桥接模式的应用场景
  • 招待费发票怎么做分录
  • 帝国cms栏目自定义字段
  • 免费下载仿iOS主题
  • 看望员工现金属于什么费用
  • 白条怎么收拾
  • 预付费卡开票
  • 任意盈余公积金的用途
  • 独立法人企业关系怎么写
  • 不用交社保的几种情况
  • 现金折扣要扣除什么费用
  • 跨年已付款发票未到会计分录
  • 高速公路过路费怎么算的
  • 购进无偿赠送
  • 结转费用后利润怎么算
  • 现金支票存根联丢失怎么办
  • 4s店收到红字发票怎么开
  • 公司股东的主要几种分类
  • 固定资产有尾款怎么入账
  • 待摊费用属于流动负债吗
  • 在Linux环境下mysql的root密码忘记解决方法(三种)
  • ipad文件使用技巧
  • mac系统崩溃怎么重装系统
  • win10在哪里找
  • linux whoami命令详解
  • 装了linux后windows没有了
  • ,linux
  • linux定时任务详解
  • css display none之后怎么显示回来
  • python num怎么用
  • android4.4.2升级包
  • django pypy
  • js设置页面大小
  • 黑龙江电子税务局app手机
  • 成都高新区办理社保在哪里?
  • 江苏省社科院院士名单
  • 大连市网上税务申报平台
  • 未开票企业怎么做账
  • 常州金坛最新新闻
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设