一点心得


  • 首页

  • 归档

Unity Texture合并工具

发表于 2018-12-06

Unity 2018.3.5f1

这里实现了一个简单的合并贴图的工具,在Unity的Project窗口中,选中一个存放图片的文件夹。右键菜单中可以看到 [Pack Texture], [Pack Texture(All Relayout)] 选项, 即可合并该文件夹下的所有贴图。具体如图所示:

选中一个存放了图片的文件夹:

执行合图操作之后,将会合并贴图并将结果生成在事先在AtlasConfig.cs中配置好的路径中(这里测试配置的是Assets/Res目录)。结果包含两类文件Asset和Atlas,Asset文件保存了Atlas文件中每张贴图在图集中的偏移,缩放和对原始图片的引用。如果选中的目录下既有带Alpha的图片又有不带Alpha的图片,工具会根据是否带Alpha进行归类并且结果输出到不同的目录。如下图:

生成的Asset文件保存的信息如图:

由于这些合并后的贴图是用于Mesh的贴图,并且MeshRenderer会根据这些贴图再图集中的偏移而要改变自己的UV,所以为了避免每次合图之后MeshRenderer的都需要重写UV的操作,这里的合图有两个选项Pack Texture和Pack Texture(All Relayout)。Pack Texture选中执行过程中不会对之前合并好的贴图进行改变,保持其在图集中的位置偏移,而Pack Texture(All Relayout)相当于重新排列每张图片在图集中的位置。所以需要注意这两点:

  • Pack Texture: 如果之前合并过贴图,该种模式下会继承上次贴图的合并后在图集中的偏移,不会改动之前已经合过贴图的位置。
  • Pack Texture(All Relayout): 全部重新排列合图,这种情况下可能改变之前已经合过贴图的在图集中的偏移。
阅读全文 »

Unity Shader加载性能消耗问题

发表于 2018-11-21

unity 5.6.6f1

在做性能优化时,发现Shader在每次加载使用了Shader的Prefab资源的时候都会调用Shader.Parse,Shader.CreateGPUProgram两个函数,这个函数的调用消耗了大量的CPU性能。这里写个demo测试下,测试的demo创建了几个prefab,每个Prefab都挂在material,然后没隔0.5s执行一次随机创建一个prefab,再隔0.5s销毁,依次重复。主要如下:

阅读全文 »

Unity的Lightmap加载的内存问题

发表于 2018-10-24

unity 5.6.6f1

再检查项目的内存问题时发现Lightmap的加载会消耗大量堆内存(高达17M,总共差不多35张lightmap贴图)。抛开lightmap的资源内存分配理论上不应该消耗堆内存才对,查看加载的代码最终发现了问题。

  • LightmapSettings.lightmaps 每次返回的是一个新创建的数组。在所有的lightmap加载完成后去查找单独每个lightmap数据的索引使用到这个API,这个是分配堆内存的主要原因。
  • lightmapData.lightmapColor.name 每次都会创建一个新的string对象。项目里面使用查找每个lightmapData的时候使用了名字去查找对比,调用次数非常频繁导致消耗了不少堆内存
阅读全文 »

Unity的Animator BlendTree

发表于 2018-10-19

unity 5.6.6f1

在游戏中角色的两个动作直接切换过度效果上,如果两个动作没有很好的衔接会出现一定程度上的僵硬现象。这种情况可以用BlendTree来进行融合。比如这样:

这里配置了三个Motion动作,三个动作之间的切换利用Controller的Parameter来控制,这个Parameter同时可作为BlendTree的Thresholds。Thresholds是用来配置各个Motion的触发条件的。

阅读全文 »

Unity渲染的深度值获取

发表于 2018-08-18

unity 5.6.6f1

深度值是对象距离摄像机距离的一个参考值,在制作一些场景效果时会经常用得到。深度值是在顶点着色器之后的像素着色器之前的深度测试阶段生成的,所以获取深度值就得在像素着色器中获取。下面创建了一个简单的场景来显示深度信息

阅读全文 »
1 … 3 4 5 … 9
© 2025 yiliangduan@qq.com