一点心得


  • 首页

  • 归档

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

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

阅读全文 »

Unity的MemoryPool模块

发表于 2018-07-14

unity 4.7.1f1

MemoryPool主要是对内存分配的碎片化和频繁分配和释放进行优化。

结构

MemoryPool的设计结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class MemoryPool
{
    ...
  
private:
    struct Bubble
    {
        char data[1]; //只是一个占位符,其实这个成员变量加不加sizeof(Block)大小都是1个字节
    };

    typedef dynamic_array<Bubble*> Bubbles;

    Bubble m_Bubbles;
  
    void* m_HeadOfFreeList;
  
    ...
}
阅读全文 »
1 … 3 4 5 … 9
© 2025 yiliangduan@qq.com