网站建设需要ui吗,关键词排名优化网站建设公司哪家好,wordpress版 影视站,科技制作网站前言 Sprite是游戏内容的一个基本组成元素#xff0c;包括ui、道具、立绘等各种地方都会用到。大部分情况下美术会帮我们调好图片颜色#xff0c;我们只要把图片直接放到游戏里就行了。Sprite默认的渲染顶点数据中包含了颜色数据#xff0c;由于我们并不需要去修改颜色…前言 Sprite是游戏内容的一个基本组成元素包括ui、道具、立绘等各种地方都会用到。大部分情况下美术会帮我们调好图片颜色我们只要把图片直接放到游戏里就行了。Sprite默认的渲染顶点数据中包含了颜色数据由于我们并不需要去修改颜色某些情况下这似乎是一个不必要的东西。 去年底的时候由于希望在性能优化方面做一些研究在论坛找到了江南百景图研发负责人的技术分享文章其中提到
优化 Shader 的输入数据
由于《江南百景图》的图片资源中不会用到 Color 这个属性因此在材质中我们将原有的 Color 数据去除掉。
将原有的 Color 数据去除掉。用来存放项目中所需要的其它信息这样做可以减少 CPU 与 GPU 互相传输的数据量。
本文参照文章中的思路实现了这个优化。
开发环境
浏览器Chrome
开发语言JavaScript
引擎版本CocosCreator 2.4.3
词语缩写对照
顶点格式顶点数据格式。
研究过程
按照思路需要改动Sprite渲染相关代码以及修改对应的材质。 翻源码找出Sprite对应的assembler是SimpleSpriteAssembler渲染模式为simple时。
源码位于cocos2d\core\renderer\webgl\assemblers\sprite\2d\simple.js
其继承关系为cc.Assembler-cc.Assembler2D-SimpleSpriteAssembler。 缕清关系后我们要找出顶点数据格式是在哪定义的。assembler用于填充顶点数据所以我们到Assembler.js中找找。
import { vfmtPosUvColor } from ./webgl/vertex-format;
export default class Assembler {getVfmt () {return vfmtPosUvColor;}
}
找到了默认顶点格式就是这个vfmtPosUvColor。
var vfmtPosUvColor new gfx.VertexFormat([{ name: gfx.ATTR_POSITION, type: gfx.ATTR_TYPE_FLOAT32, num: 2 },{ name: gfx.ATTR_UV0, type: gfx.ATTR_TYPE_FLOAT32, num: 2 },{ name: gfx.ATTR_COLOR, type: gfx.ATTR_TYPE_UINT8, num: 4, normalize: true },
]);
从vfmtPosUvColor的定义可以看出顶点数据中含有三个数据括号里的英文对应材质中的输入变量名
ATTR_POSITIONa_position 位置ATTR_UV0a_uv0 uvATTR_COLORa_color 颜色
很明显ATTR_COLOR就是我们今天的目标 弄清楚顶点格式后下一步是找到填充这些数据的地方。
顶点数据保存于RenderData这三个数据是分开填充的避免有些时候只需要更新其中一个如只是移动了位置却要全部跑一遍。顶点数据填充时是按定义好的顺序填充的此处引用论坛文章的图 由于我们只是去除最后的color所以位置和uv的填充函数是不需要修改的在一个顶点数据中的相对位置没有发生改变。 找出颜色填充函数updateColor函数声明于assembler-2d.js。
updateColor (comp, color) {let uintVerts this._renderData.uintVDatas[0];if (!uintVerts) return;color color ! null ? color : comp.node.color._val;let floatsPerVert this.floatsPerVert;let colorOffset this.colorOffset;for (let i colorOffset, l uintVerts.length; i l; i floatsPerVert) {uintVerts[i] color;}
}
函数中将颜色值填充在每个顶点数据的末尾position和uv之后。我们需要修改updateColor函数因为不再需要填充颜色值了。
实现思路
看完又是要改源码了。不过还是可以通过继承相关类实现。继承方案相对来说会比较麻烦但在实验阶段需要频繁修改时会更方便快速。 我们需要自定义Sprite、Assembler、Material、Effect。分别命名为NoColorSprite、NoColorSpriteAssembler、noColorMaterial、noColorEffect。 需求可拆分为如下实现步骤
新建noColorEffect及noColorMaterial在内置的代码基础上去除颜色相关内容。新建NoColorSpriteAssembler新建顶点格式并重写/实现渲染数据填充的相关函数。新建NoColorSprite将默认的assembler改为我们自己的NoColorSpriteAssembler。
代码
第一步是effect和material主要工作是删代码颜色相关的... 新建的material只要将effect引用改为noColorEffect即可。
// 删除颜色相关输入输出处理
CCProgram vs %{precision highp float;#include cc-global#include cc-localin vec3 a_position;#if USE_TEXTUREin vec2 a_uv0;out vec2 v_uv0;#endifvoid main () {vec4 pos vec4(a_position, 1);#if CC_USE_MODELpos cc_matViewProj * cc_matWorld * pos;#elsepos cc_matViewProj * pos;#endif#if USE_TEXTUREv_uv0 a_uv0;#endifgl_Position pos;}
}%// 删除颜色相关输入处理 输出颜色直接取像素颜色
CCProgram fs %{precision highp float;#include alpha-test#include texture#if USE_TEXTUREin vec2 v_uv0;uniform sampler2D texture;#endifvoid main () {vec4 o vec4(1, 1, 1, 1);#if USE_TEXTURECCTexture(texture, v_uv0, o);#endifALPHA_TEST(o);gl_FragColor o;}
}%
接着创建NoColorSpriteAssembler.js自定义顶点格式去掉默认的颜色字段。
let gfx cc.gfx;
let vfmtNoColor new gfx.VertexFormat([{ name: gfx.ATTR_POSITION, type: gfx.ATTR_TYPE_FLOAT32, num: 2 },{ name: gfx.ATTR_UV0, type: gfx.ATTR_TYPE_FLOAT32, num: 2 }, // texture纹理uv
]);
我们只是想去除颜色可以通过继承cc.Assembler实现noColorMaterial其他渲染相关代码则可以从Assembler2D及SimpleSpriteAssembler中复制。这里贴出主要的代码。 因为我们修改了顶点格式需要同步修改相关值。这里重写构造函数进行修改。
floatsPerVert是顶点格式数据长度用浮点数计算原本是5个浮点数这里去掉了颜色所以改为4。其他数据照抄Assembler2D中的值即可。
export default class NoColorAssembler extends cc.Assembler {constructor () {super();// uv在顶点数据中的偏移位置(前面有两个float的值表示position)this.uvOffset 2;// 每个顶点的浮点数数量(position 2浮点数uv 2浮点数)this.floatsPerVert 4;// 顶点数量 (可以用4个点来表示两个三角形)this.verticesCount 4;// 顶点索引数量 (两个三角形共6个顶点索引) 这个部分可以看链接中的文章有说明。this.indicesCount 6;this.initData();this.initLocal();}
}
修改顶点数据格式后我们需要一个不一样的RenderData来存储这些数据模仿Assembler2D实现initData函数在里面按我们定义的格式创建RenderData。
/**
* 初始化this._renderData 仿照Assembler2D.initData 创建自定义格式的renderData
*/
initData () {let data this._renderData new cc.RenderData();this._renderData.init(this);// 按我们自己的格式创建RenderDatadata.createFlexData(0, this.verticesCount, this.indicesCount, this.getVfmt());// createFlexData不会填充顶点索引信息手动补充一下 仿照cc.RenderData.initQuadIndiceslet indices data.iDatas[0];let count indices.length / 6;for (let i 0, idx 0; i count; i) {let vertextID i * 4;indices[idx] vertextID;indices[idx] vertextID1;indices[idx] vertextID2;indices[idx] vertextID1;indices[idx] vertextID3;indices[idx] vertextID2;}
}
再之后是本文的重点把颜色的填充功能去掉
/**
* 更新颜色 啥也不干
*/
updateColor () {
}
最后改动顶点数据格式后还有一些需要同步修改的地方。
/**
* 获得存放自定义顶点数据的buffer
* returns {cc.MeshBuffer}
*/
getBuffer() {return cc.renderer._handle.getBuffer(mesh, this.getVfmt());
}
/**
* 获得顶点数据格式
* 重写 返回自定义的顶点数据格式
* returns {cc.gfx.VertexFormat}
*/
getVfmt () {return vfmtNoColor;
}
代码有点长没有全部贴出来。可以在后面的源码附件中查看其他函数基本是从Assembler2D及SimpleSpriteAssembler复制出来的。 最最最后如果产生一些如继承、函数为空之类的报错可以在creator.d.ts文件中增加以下声明。
declare namespace cc {export class Assembler {public _renderComp: cc.RenderComponent;public init(comp: cc.RenderComponent);public getVfmt();static public register(renderCompCtor, assembler);}export class RenderData {init(assembler: cc.Assembler);createQuadData(index, verticesFloats, indicesCount);createFlexData(index, verticesFloats, indicesCount, vfmt): cc.FlexBuffer;initQuadIndices(idata);vDatas;uintVDatas;iDatas;meshCount: number;_infos;_flexBuffer;}
}
效果对比
测试案例 一个sprite复制200次。分别使用默认的cc.Sprite和我们实现的NoColorSprite。
使用console.time函数结合cc.Director中的EVENT_BEFORE_UPDATE、EVENT_AFTER_UPDATE、EVENT_AFTER_DRAW事件统计前两百帧的游戏逻辑耗时及渲染耗时。 耗时对比如下 绿色线为优化前蓝色线为优化后。可以看出均有一定程度的减少。 render耗时由于前几帧较高图表看起来比较奇怪再贴一张去掉前三帧的对比图。 总结
简单来说少了1/5的数据传输量material中也不需要计算颜色优化效果是可想而知的。 本优化并不适用于所有项目由于颜色数据被去除了透明度作为颜色值的其中一项也不再生效了。图片本身的透明度会被保留但无法再通过修改节点的透明度进行动态修改。 文章转载自: http://www.morning.jzkqg.cn.gov.cn.jzkqg.cn http://www.morning.hjjkz.cn.gov.cn.hjjkz.cn http://www.morning.mytmn.cn.gov.cn.mytmn.cn http://www.morning.ffbl.cn.gov.cn.ffbl.cn http://www.morning.qnftc.cn.gov.cn.qnftc.cn http://www.morning.lftpl.cn.gov.cn.lftpl.cn http://www.morning.kxnnh.cn.gov.cn.kxnnh.cn http://www.morning.nwjd.cn.gov.cn.nwjd.cn http://www.morning.mcmpq.cn.gov.cn.mcmpq.cn http://www.morning.gwwky.cn.gov.cn.gwwky.cn http://www.morning.fthcq.cn.gov.cn.fthcq.cn http://www.morning.nbmyg.cn.gov.cn.nbmyg.cn http://www.morning.dgsx.cn.gov.cn.dgsx.cn http://www.morning.drspc.cn.gov.cn.drspc.cn http://www.morning.fqljq.cn.gov.cn.fqljq.cn http://www.morning.gynls.cn.gov.cn.gynls.cn http://www.morning.bpmnh.cn.gov.cn.bpmnh.cn http://www.morning.tgqzp.cn.gov.cn.tgqzp.cn http://www.morning.tfrmx.cn.gov.cn.tfrmx.cn http://www.morning.grqlc.cn.gov.cn.grqlc.cn http://www.morning.seoqun.com.gov.cn.seoqun.com http://www.morning.pznqt.cn.gov.cn.pznqt.cn http://www.morning.qfgwx.cn.gov.cn.qfgwx.cn http://www.morning.ftsmg.com.gov.cn.ftsmg.com http://www.morning.jypsm.cn.gov.cn.jypsm.cn http://www.morning.mfsxd.cn.gov.cn.mfsxd.cn http://www.morning.hxbjt.cn.gov.cn.hxbjt.cn http://www.morning.qwrb.cn.gov.cn.qwrb.cn http://www.morning.sgfpn.cn.gov.cn.sgfpn.cn http://www.morning.prkdl.cn.gov.cn.prkdl.cn http://www.morning.jqkjr.cn.gov.cn.jqkjr.cn http://www.morning.clpkp.cn.gov.cn.clpkp.cn http://www.morning.zkbxx.cn.gov.cn.zkbxx.cn http://www.morning.twfdm.cn.gov.cn.twfdm.cn http://www.morning.ltcnd.cn.gov.cn.ltcnd.cn http://www.morning.pwlxy.cn.gov.cn.pwlxy.cn http://www.morning.lgrkr.cn.gov.cn.lgrkr.cn http://www.morning.ykrck.cn.gov.cn.ykrck.cn http://www.morning.fqzz3.cn.gov.cn.fqzz3.cn http://www.morning.hbxnb.cn.gov.cn.hbxnb.cn http://www.morning.sfdsn.cn.gov.cn.sfdsn.cn http://www.morning.rmxk.cn.gov.cn.rmxk.cn http://www.morning.kxnnh.cn.gov.cn.kxnnh.cn http://www.morning.sgqw.cn.gov.cn.sgqw.cn http://www.morning.mwqbp.cn.gov.cn.mwqbp.cn http://www.morning.wxfgg.cn.gov.cn.wxfgg.cn http://www.morning.kynf.cn.gov.cn.kynf.cn http://www.morning.fkgcd.cn.gov.cn.fkgcd.cn http://www.morning.qgghr.cn.gov.cn.qgghr.cn http://www.morning.xrlwr.cn.gov.cn.xrlwr.cn http://www.morning.kfwqd.cn.gov.cn.kfwqd.cn http://www.morning.wztnh.cn.gov.cn.wztnh.cn http://www.morning.gcspr.cn.gov.cn.gcspr.cn http://www.morning.rsdm.cn.gov.cn.rsdm.cn http://www.morning.rnmdp.cn.gov.cn.rnmdp.cn http://www.morning.ghyfm.cn.gov.cn.ghyfm.cn http://www.morning.wddmr.cn.gov.cn.wddmr.cn http://www.morning.lzrpy.cn.gov.cn.lzrpy.cn http://www.morning.lslin.com.gov.cn.lslin.com http://www.morning.bhrkx.cn.gov.cn.bhrkx.cn http://www.morning.slpcl.cn.gov.cn.slpcl.cn http://www.morning.ygpdm.cn.gov.cn.ygpdm.cn http://www.morning.gsjfn.cn.gov.cn.gsjfn.cn http://www.morning.lflnb.cn.gov.cn.lflnb.cn http://www.morning.pqktp.cn.gov.cn.pqktp.cn http://www.morning.xqjz.cn.gov.cn.xqjz.cn http://www.morning.ydxg.cn.gov.cn.ydxg.cn http://www.morning.kycwt.cn.gov.cn.kycwt.cn http://www.morning.bpmtl.cn.gov.cn.bpmtl.cn http://www.morning.byxs.cn.gov.cn.byxs.cn http://www.morning.pqfbk.cn.gov.cn.pqfbk.cn http://www.morning.hxlch.cn.gov.cn.hxlch.cn http://www.morning.hmhdn.cn.gov.cn.hmhdn.cn http://www.morning.trzmb.cn.gov.cn.trzmb.cn http://www.morning.rtsx.cn.gov.cn.rtsx.cn http://www.morning.stsnf.cn.gov.cn.stsnf.cn http://www.morning.kjnfs.cn.gov.cn.kjnfs.cn http://www.morning.wcjk.cn.gov.cn.wcjk.cn http://www.morning.rbmm.cn.gov.cn.rbmm.cn http://www.morning.fndfn.cn.gov.cn.fndfn.cn