uniform
uniform确实是一种从CPU中的应用向GPU中的着色器发送数据的方式。在OpenGL等图形处理库中,uniform变量用于在CPU和GPU之间传递数据,尤其是在进行渲染时。
一般来说,当CPU中的数据(例如顶点数据、变换矩阵等)需要被GPU中的着色器使用时,这些数据会被设置到uniform变量中,然后通过渲染流程传送到GPU。在GPU中,这些uniform变量会被着色器读取并用于计算渲染结果。
对于顶点着色器和片段着色器,它们都可以访问这些uniform变量,但访问的是同一份数据,保证在全局范围内数据的统一性。而且,一旦这些数据被送入uniform变量,它们就会一直保存这些数据,直到被重置或更新。
cocos web项目在移动端的调试方案可以借助以下几种方式:
使用桌面端模拟器:移动端的浏览器都有开发者工具,通过USB连接到电脑后,可以开启开发者模式,启用桌面端模拟器进行调试。这种方式需要连接移动设备,所以不太适合远程调试。
使用浏览器插件:有许多浏览器插件可以帮助我们在移动端调试web项目,比如Chrome的Remote Devices、Firefox的WebIDE等。这些插件可以让我们在桌面端浏览器中看到移动设备上的页面,并进行调试。
使用远程调试工具:现在有很多远程调试工具,比如Chrome的Remote Debugging、Firefox的Remote Debugging等。这些工具可以在移动端和桌面端之间建立通信,让我们在桌面端进行移动端的调试。这种方式的优点是可以实时查看移动端页面,缺点是需要移动设备和桌面设备在同一网络下。
使用微信开发者工具:如果是开发微信小程序,可以使用微信开发者工具进行调试。微信开发者工具提供了模拟器,可以模拟小程序在移动端的效果。同时也可以在桌面端进行代码的编写和调试。
以上是常见的几种cocos web项目在移动端的调试方案,可以根据实际项目情况选择合适的方式进行调试。
在Cocos Creator中,Label组件的缓存模式主要有三种:
CacheMode.NONE:这是默认模式,先用网页canvas渲染文字,然后用Texture2D.initWithElement(canvas)获取纹理。每个label都占一个drawcall,即使内容相同也不例外。此时内存中三个label纹理+一个sprite纹理+FPS label纹理。
CacheMode.BITMAP:与CacheMode.NONE类似,但会有所改进。在这个模式下,会将实时获取到的纹理放到动态合集里,于是就能跟附近的同类型Label或者使用动态图集的Sprite进行合批,因此可以减少drawcall。
CacheMode.CHAR:这是BMFont类型的缓存模式。Label将按“字”为单位将文本缓存到全局共享的位图中,相同字体样式和字号的每个字符将在全局共享一份缓存。这能支持文本的频繁修改,对性能和内存最友好。
总的来说,这三种缓存模式的用途分别是:
CacheMode.NONE适合对视觉效果要求较高的情况;
CacheMode.BITMAP适合需要提高渲染性能,但文本内容不常更新的情况;
CacheMode.CHAR适合需要频繁修改文本,且对性能和内存使用有较高要求的情况。
热更新时,如何判定文件被删除了?
如果文件被删除,那么该文件的MD5值就会发生改变。这是因为MD5算法会对文件的原始数据进行计算,当文件被删除后,其原始数据已经发生了改变,因此计算出的MD5值也就会跟着改变。
所以在进行增量更新时,如果某个文件的MD5值发生了改变,那么就意味着该文件被删除或修改了。
Cocos Effect
Cocos Effect并不等同于shader,但它是基于shader的一种资源类型。
Effect包括材质(material)和效果代码(effect),通过将两者结合,可以达到一种特定的视觉效果。
1.材质(Material):是Cocos Creator中的材质球,每个Effect的编写就是在材质的基础上进行修改,并将使用到哪个Effect拖动赋值给当前物体。
2.效果代码(Effect):着色器的代码主要在这里编写。
所以,虽然Effect并不等同于shader,但它的实现是基于shader的。
热更新、冷更新、整包更新、增量更新、强制更新:
热更新和冷更新主要区别在于更新方式,热更新是通过动态下发代码,在用户打开app时获取新的应用程序代码或界面并部署到移动设备上;冷更新则是通过安装新的完整版本来进行更新。整包更新和增量更新属于热更新的一种,整包更新是整个app安装包需要重新下载安装,而增量更新是只更新部分资源。强制更新是系统强制要求用户进行更新,不更新就无法使用当前版本。
Cocos Creator中的热更新主要源于Cocos引擎中的AssetsManager模块对热更新的支持。它通过比较服务端和本地版本的差异来决定更新哪些内容。具体来说,在游戏或应用程序运行时,如果检测到服务器上有新的版本,AssetsManager模块会自动下载新版本的资源,并且将新资源加载到游戏中。
这种设计思路可以支持跨版本更新,也就是说,无论当前游戏版本是A还是B,只要服务端版本是C,就可以直接更新A和C之间的差异,不需要先更新到B再更新到C。
除了自动更新外,开发者还可以通过编写自定义脚本,在游戏运行时动态地加载新资源或执行新的游戏逻辑。这种热更新机制可以使开发者在不发布新版本的情况下,修复BUG和发布新功能,从而避免长时间的审核等待以及多次被拒造成的成本。
需要注意的是,由于这种热更新机制主要是针对原生版本,对于WEB版本,需要通过服务器直接进行版本更新。此外,由于Manifest文件可能比较大,每次检查更新的时候都完整下载的话可能影响体验,所以开发者可以额外提供一个非常小的Version文件。
对于Cocos Creator的WEB版本,由于它是运行在浏览器中的,所以不能直接像原生版本那样通过AssetsManager模块进行热更新。而是需要通过服务器来直接进行版本更新。
这意味着,当服务器上有新的版本可供更新时,服务器会向客户端推送更新通知。然后,客户端在接收到通知后,会从服务器上下载新的版本文件,并直接替换掉旧的文件。
这个过程通常需要一个服务器端应用程序来处理版本更新的事务。开发者可以自行开发这个应用程序,或者使用第三方工具和服务来实现。
总之,对于Cocos Creator的WEB版本,要进行版本更新,就需要通过服务器直接进行文件的替换和更新。
在强制更新时,清理之前热更新的文件需要谨慎处理,以避免对用户的数据和应用程序功能造成影响。以下是一些比较安全的清理方式:
备份文件:在清理之前,可以先把旧版本的文件备份到服务器或其他存储设备中。这样即使强制更新失败,也可以回滚到旧版本,并恢复数据。
清理临时文件:在热更新时,有些文件是临时性的,比如缓存文件、临时数据等。这些文件可以被安全地清理掉,因为它们在应用程序重新启动后会被重新生成。
确认用户数据:在清理之前,需要确认用户数据是否已经备份或者已经安全地存储在服务器上。如果用户数据没有备份或者不确定是否安全,那么应该避免清理文件,以免造成数据丢失。
清理冗余文件:在强制更新时,可能会清理一些不再需要的冗余文件。这些文件可能是因为应用程序出错或者被恶意攻击而产生的。在清理之前,需要确认这些文件是否真的不再需要,并确保不会对应用程序造成影响。
使用专业的清理工具:可以使用专业的清理工具来清理之前热更新的文件。这些工具可以识别哪些文件是冗余的、不再需要的,并安全地清理它们。但是需要注意,使用清理工具也需要谨慎,以避免清理掉重要的文件。
总之,在强制更新时清理之前热更新的文件需要谨慎处理,需要确保用户数据安全、备份文件、清理临时文件、确认冗余文件并使用专业的清理工具来进行操作。
在渲染Label和Sprite时,为了减少drawcall的数量,可以考虑以下一些优化策略:
合并显示对象:将需要渲染的Label和Sprite对象合并到一个显示对象中,这样只需要进行一次绘制调用即可完成渲染。可以通过使用同一个Node节点来承载这些显示对象,以实现这一目标。
使用纹理图集:将Sprite使用的纹理图片制作成图集,将多个精灵的纹理合并到一张纹理图中。这样可以让绘制调用中的纹理加载更加高效,减少drawcall的数量。
控制渲染顺序:对于多个显示对象,可以考虑改变它们的渲染顺序,以减少重绘区域。例如,将背景精灵渲染在其他显示对象之前,可以避免每次重绘时都绘制整个背景。
优化标签属性:对于Label对象,可以优化文字属性以减少绘制调用。例如,避免频繁修改字体、颜色等属性,尽量使用相同的属性进行批量渲染。
使用透明度优化:对于具有透明度的显示对象,可以考虑使用混合模式来优化绘制。例如,对于背景和前景的显示对象,可以使用Alpha混合来减少绘制调用。
合理使用动态绘制和静态绘制:对于频繁更新的显示对象,可以使用动态绘制;对于不经常变动的显示对象,可以使用静态绘制。这样可以减少不必要的绘制调用。
优化节点布局:合理安排节点布局,避免频繁的节点位置更新。这样可以减少绘制调用中的位置变换,提高渲染效率。
综上所述,通过合并显示对象、使用纹理图集、控制渲染顺序、优化标签属性、使用透明度优化、合理使用动态绘制和静态绘制以及优化节点布局等策略,可以减少Label和Sprite的drawcall数量,提高渲染效率。
Cocos Creator的自动图集和动态合图是两种用于优化游戏性能的技术,具体区别如下:
自动图集(Auto Atlas)是Cocos Creator中一种在项目构建时的静态合图方法。它是将指定的一系列碎图打包成一张大图,这个过程在游戏开发阶段就已经完成,因此它主要适用于在游戏开发阶段已知和固定的贴图。如果项目中的贴图数量非常多,难以将它们打包到一张大贴图中,那么静态合图就难以满足降低 Draw Call 的需求。
与静态合图不同,动态合图(Dynamic Atlas)主要应用在游戏运行时。它能在项目运行时动态的将贴图合并到一张大贴图中。当渲染一张贴图的时候,动态合图系统会自动检测这张贴图是否已经被合并到了图集中,如果没有,并且此贴图又符合动态合图的条件,就会将此贴图合并到图集中。动态合图主要针对的是在游戏运行过程中可能出现的新的、临时性的、或者变动性强的贴图需求。
总的来说,Cocos Creator的自动图集和动态合图分别适用于游戏开发阶段和游戏运行阶段,自动图集更侧重于一次性打包所有已知的贴图,而动态合图更侧重于在游戏运行时动态地、按需地将贴图合并到一起,以降低 Draw Call 并提高游戏性能。