[unity3D]关于设置物体父节点和设置物体显示

最近在做系统的gameobject池管理,所以需要研究一下物体不可见,和设置parent的最优搭配

物体不可见方案

1:可移动物体位置到摄像机可照射范围之外;2:设置物体大小到0;3:禁用component组件;4:禁用gameobject;5:设置layer层级为摄像机不可见层级

测试数据
2D界面设置大小
2D界面设置layer层级

测试下来发现禁用layer为最优化的方案。

此测试为3D摄像机的测试数据,只测试了cpu计算耗时,此耗时为unity内部实现方法的耗时,即函数耗时。

缩小scale在3D摄像机里是不会减少DC的但是在2D下,是可以减少DC的。猜测的区别为:在2D摄像机下,会重组mesh,当scale为0的时候会被剔除出mesh渲染中,这个为2D的实现方法,后续整理这块数据。在3D摄像机下的时候,不管scale是否为0,这个物体的矩阵还是存在的,所以还是要进行矩阵转换和渲染。

在2D下移走坐标是不会减少DC的,但是加一个2Dmask就可以。猜测为:UI和2Dmask的矩阵求交集,超出就不渲染。

后续补充:

在设置layer的时候,你如果设置物体父节点的layer但是子节点是不管用的,所以你只能循环子节点来设置,在这个时候产生了循环遍历,消耗就变成指数级别的上升。最优选择为设置大小。还产生了GC。

设置parent方案

设置parent为null,和设置parent为具体的gameobject;Setparent第二个参数worldPositionStays为true和false,当这个值设置成false的时候是不会修改localposition的坐标,这个就相当于,直接把物体的世界坐标给修改了。

测试结果为设置parent不能为null,为null是最耗时的, worldPositionStays可设置为false,这样最优的,设置成true的时候设置parent的耗时和设置parent的层级有关系,如果层级最深的话耗时最长

方案选择

根据以上的测试结果,方案为设置物体的parent为最浅根节点worldPositionStays设置为false,以设置layer的显示层级来决定是否渲染。

拓展发散

当需要隐藏一个物体不被摄像机渲染的时候,我们可以选择设置layer。还有一个测试数据为当获取物体的localposition的时候比获取物体的position要快将近一倍。所以unity保存物体的坐标系是否为localpostion和一个世界坐标的转换矩阵,然后position为使用的时候才去计算。还有设置parent为null的时候慢了超过1/9,设置为null的时候是否重新生成了一份场景物体树的根节点。这些都需要以后好好研究一下。最后一句,不考虑数量级的优化都是假的。

[生活]减脂随笔

饮食

因个人体质问题,带奶的甜品类全戒,重油食品少吃,碳酸饮料全戒。正因为身体原因所以我一般都只能自己带饭,也因为时间问题,早餐就只能吃燕麦泡无乳糖奶粉;中午为水捞蔬菜加蛋白质肉类;下午如果饿了正常为水果,不正常为饼干等零食;晚餐锻炼完回家吃点香蕉水果一类,也会有时候去吃个麻辣烫这类的。日常朋友聚餐也会去参加,比如烤肉,火锅这类的也会去吃。所以对于饮食没有靠自己多大毅力,只是身体原因,所以正常也就很健康了。正常人应该不会像我这样吃的。但是要减脂还是七分吃,三分练的。这个控制不住自己的嘴,其实也很难减下来。对了碳水的摄取还是需要注意的,我基本上除了早上的燕麦,主食很少吃的。

锻炼

在最开始的时候,我基本上是有氧加无氧一起的,举铁一般为一个小时,然后泡四十分钟的有氧,再去拉伸二十分钟加卷腹。因为跑步次数比较多,加上以前收到过的老伤,现在基本上不会再去跑步了。有氧就改成了每天骑车上下班,单程8-9公里,四十分钟。对于很多人说,锻炼容易受伤什么的,我的感觉就是,你一个月锻炼最多三次,一年都不一定有十次,你考虑受伤,是有点多虑的,你预期考虑这个,还不如去想着怎么放松,拉伸身体。如果能坚持一礼拜去三次,坚持一个月;那你可以考虑去请个私教或者找个朋友带你系统的规范动作锻炼。还有就是健身房办卡什么的,除非是离家近,或者离公司近的,要不然很难坚持去的,毕竟健身太难受了,人很容易找到借口的。

休息

关于休息这块吧,我反正没有什么发言权的,我的日常生活都不正常,晚上看书,写东西都基本上要到12点,早上基本上七点左右就起床了。按各方面到知识点,休息这块是必须满足八小时,恢复身体的时间。太少了,第二天身体还是疲劳状态。这块反正就是坚持好好睡觉,好好休息,坚持拉伸身体,没事可以去做做冥想,瑜伽。这块我还在学习中,有好的东西可以大家一起分享。

结语

减肥或者说减脂,其实没有大家想的那么麻烦,控制嘴,然后去运动就好了,我属于那种回家不锻炼也能一个礼拜胖五斤到十斤的易胖体质。其实回想起来,坚持也不是那么的难,我这样的生活已经两三年的,吃,锻炼,天天如此,从来没有觉得难受,除了最近改吃牛肉为了增肌,牛肉是真的太难嚼了。任何事情起步难,坚持更难。要不是健身房离公司近,我也应该早早就放弃了;要不是身体原因,我也早早的各种乱吃,毕竟我爱美食。所以不要觉得什么这个人能坚持那么就觉得毅力真强,其实可能刚好习惯了,刚好方便。当你的肌肉量上去了,新陈代谢上去了,就算胖起来也很容易减下去的。

[渲染]关于3D引擎的坐标

概念

坐标转换为物体显示到屏幕上坐标的转换过程.

模型坐标系

这个坐标为物体进入3D引擎中自己的坐标系,是建模时候使用的坐标系,为了确定模型定点的坐标信息。和建立模型大小尺寸,比如说,我将导入一个人和一间房子这两个模型,但是他们在建模到时候,大小单位是多大呢?一单位长度究竟是米还是厘米呢?这个时候就需要用模型坐标,来确定长度到单位尺寸

世界坐标系

这个坐标是相当于3D引擎中到世界,就好比,我们现实世界一样,有一个经纬度,能明确自己所在位置究竟在哪里,在3D世界里也有一个坐标,来确定物体的位置。

观察空间坐标系

这个坐标是世界中用来照射的一个摄像机的坐标系,这个照射就好像我们的眼睛一样,用来看世界上的物体。我们所看到的物体就是在这个摄像机坐标系的某个位置上。当我们确定相机的照射范围的时候,就相当于我们视野范围,超出的将被忽略,这做了第一次的裁剪。

投影空间坐标系

这个坐标是一个视锥体,有一个最近显示平面,一个最远显示平面,和四周显示平面,一共六个平面,当一个物体有一部分在显示平面内,一部分在显示平面外的时候,将把这个物体裁剪,只显示在平面内部的部分。然后把物体的投影到一个投影屏幕上,确定物体在投影屏幕上的坐标。相当于把一个3D坐标转换到一个2D平面上的

屏幕坐标

这个就是现实中在屏幕上看到的的东西的坐标系。

转换过程

坐标转换为矩阵转换,下一次写矩阵转换公式

工作问题

涉及的专业知识:1:编程语言;2:unity基础框架;3:渲染知识。

编程语言:

问题1:

class entrusttest
    {
        delegate void hello();
        static List<hello> a = new List<hello>();
        public entrusttest()
        {
            for (int i = 0; i < 10; i++)
            {
                a.Add(delegate
                {
                    Console.WriteLine(i);
                });
            }
            for(int i = 0; i < a.Count; i++)
            {
                a[i]();
            }
        }
    }

问题为打印出来的值为什么。答案为:全部都是10;
根据大佬的说法:这个为闭包概念,i会变成全局的唯一变量。
学习重点:lamda表达式
在c#基础上看到过这个概念,但是实际应用就没用过。

问题2

class entrusttest1
    {
        delegate void hello();
        public entrusttest1()
        {
            abc();
        }
        public void abc()
        {
            hello a;
            a = b;
            a += c;
            a += d;
            a();
        }
        public void b()
        {
            Console.WriteLine("a");
        }
        public void c()
        {
            Console.WriteLine("c");
        }
        public static void d()
        {
            Console.WriteLine("dddd");
        }
    }

这里委托+=是否可以为静态函数
答案是:可以
拓展:在构造函数里不能直接执行委托属性。必须包一层方法。构造函数和普通函数有什么区别呢?如果都是线性执行的话那有啥区别。
学习重点:函数。

问题3

class box
    {
        long a = 1000000000L;
        public box()
        {
            object c = a;
            int d = (int)c;
        }
    }

这里是否会抛出异常。
答案是:会,装箱的类型和拆箱的类型不匹配
学习重点:拆装箱,值类型和引用类型
拓展:值类型在装箱的时候怎么把栈上的内存放到堆上。内存变化。

问题4

soket的实现
答案:
学习重点:
拓展:

问题5

hashtable是怎么存内容的,又能存对象,也能存基础类型
答案:存对象的时候是保存对象的指针,keys是把指针再存到一个数组里(未验证)
学习重点:数据结构
拓展:

问题6

UI系统框架改怎么实现
答案:根据大佬理解,应该是做一个UI栈,先进后出。
学习重点:数据结构知识,设计模式
拓展:

问题7

找到字符串中第一个出现两次的字符
答案:

string str = "dafdfureqwnfahfgi";
        Hashtable c;
        public stringtext()
        {
            c = new Hashtable();
            char[] b = str.ToCharArray();
            for(int i = 0; i < b.Length; i++)
            {
                if (c.Contains(Convert.ToInt32( b[i])))
                {
                    Console.WriteLine(b[i].ToString());
                    return;
                }
                else
                {
                    c.Add(Convert.ToInt32(b[i]), Convert.ToInt32(b[i]));
                }
            }

        }

大佬给了一个新的解答方案,用二进制做匹配,保存进制位,如果位一样,就相当于前面有相等的值:

 class stringtext1
    {
        int n = 0;
        string str = "dfdafaffasrwer";
        public stringtext1()
        {
            char[] b = str.ToCharArray();
            for (int i = 0; i < b.Length; i++)
            {
                int offset = Convert.ToInt32(b[i])-96;
                int c = 1 << offset;
                n = c^n;
                int r = n & c;
                if (r == 0)
                {
                    Console.WriteLine(b[i].ToString());
                    return;
                }
            }
        }

    }

学习重点:字符比较转换
拓展:是否还有效率更高的解答

问题8

c#的GC是怎么实现的

答案:

学习重点

拓展:引用类型的回收,值类型的回收

问题9

lua的GC实现原理

答案:

学习重点:

拓展:

问题10

lua元表的概念

答案:

学习重点:

拓展:

问题11

事件,委托有什么不同

答案:

学习重点:

拓展

unity框架知识

问题1

unity的渲染顺序
答案:先camera depth的值,越小越优先;sorting layer层,越小越优先;sorting order 越小越优先;renderqueue越小越优先;z轴大小;创建顺序。
学习重点:渲染顺序。
拓展:renderqueue的值2500为分界线,renderqueue的值相等,大2500则远到近,小于则近到远。个属性分别实在哪些组件上。

问题2

unity的遮挡剔除
答案:
学习重点:遮挡剔除
拓展:剔除算法放在哪一步做。

问题3

unity怎么在label上加描边
答案:
学习重点:渲染label的方法
拓展:在哪步做渲染加描边最优

问题4

unity的协程是怎么实现暂停后继续执行当前行
答案:协程实现了一个迭代器
学习重点:协程实现
拓展:C#的迭代器

问题5

一个物体被渲染到看到,经历里几次坐标转换
答案:物体坐标到世界坐标,世界坐标到摄像机坐标,摄像机坐标到裁剪空间,裁剪坐标到屏幕空间,屏幕空间到视口空间。
学习重点:坐标转换
拓展:坐标转换计算

问题6

unity系统方法调用顺序
答案:Awake>OnEnable>Start>FixedUpdate>Update>LateUpdate>OnGUI>OnDestroy
学习重点:各种函数的调用时机
拓展:系统全部函数调用顺序和时机

问题7

recttransform的介绍

答案:

学习重点

拓展

问题8

scrollview加3D特效

答案:

学习重点

拓展

问题9

聊天的图文混搭

答案:

学习重点

拓展

渲染

问题1

光栅化做了什么
答案:
学习重点:
拓展:

问题2