[周总结]第一次周总结

万事开头难,坚持更难。

前言

最近一直在写博客,我戏称为论文。其实很早以前就知道,学到的知识需要用自己的语言说出来,那才是正的学到了。但是因为我比较懒,所以很会找借口,不知道写在哪里啊,没有电脑什么的。自从前段时间,以前用的便宜的vps被封了,才狠下心来,买个稍微好点的wps,和一个域名,来好好做自己的知识积累(此处吐槽公司大佬,让我入了域名这个坑)。

正文

加密

如果是为了不能让玩家读到我们文件的信息的话,其实只需要文件的前面随机加几个一堆字符,然后在读取的时候就舍去这部分的内容,这种简单是很容易破解,但是也是一种防止资源被盗取的最简单的使用。但是为了过包,在公司大佬的提示下,如果做切片验证的话,我就算前面加了一堆一样的但是在切片时候,可读文件还是一样的,照样能找到相识度;所以考虑用aes加密。aes加密是相当于把每个字符修改了。值得注意的是aes的标准是16个字节为一个单位的加密(也可以使用别的标准)。做10轮加密,密钥最小需要的16字节的密钥;还能设置初始化向量为16字节。在加密的时候专业人士提供了一个顾虑,如果我们把密钥明文写在代码里,被别人获取到了,那不就很容易被破解;在考虑到这个顾虑以后,我们想到用伪随机来生成密钥,具体原理没有去详细了解,现在用下来,使用的种子如果是一样的化,那生成出来的随机数也是一样的。所以打算用伪随机生成密钥来加密文件。

渲染

经过一段时间的思考,觉得对于一个3D游戏前端来说,如果不懂渲染那核心知识基本上就很少了,对于逻辑代码来说,如果不涉及很高深的游戏,很难有大的突破。在以前的时候也看过一段时间的渲染基础,向量计算呀,矩阵转换啊,渲染流程啊,这些以前都会,现在都忘记了,再学的时候还是要去查看下书上概念。所以在学东西的时候没有用到,很容易忘记,学以致用,古人诚不欺我。这段时间从头看了坐标转换的知识点。

unity

这个是我现阶段吃饭的工具,但是当我从新去研究的时候,发现自己还是很多东西不懂,很多东西还只是在使用阶段,没有进阶原理。比如前几天研究的实体池,在研究的时候还是有个东西没有明白,在ui不显示时候,设置layer层overdraw还是不能降低。对于这个引擎还是有很多知识点要去了解的。

编程基础

对于GC的了解深入了一点,第一次接触到最小堆的概念。感觉自己对于数据结构的东西还是只在知识层面,还没有到应用层面。链表的翻转也从头写了一下,感觉也不是那么的难。自己的基础补充道路还是很长的。感觉看不到头了。

结语

能开始写总结就是一个好的开始,希望自己能继续坚持下去。路漫漫,总有一天能让我走完的。

[编程基础]最小/大堆的实现

定义:1:一个完全二叉树,可以是空

2:子结点不能比父结点大/小

3:每一个结点的子树也是一个堆

知识点

1:二进制左移,右移。

2:完全二叉树,因为对应的树结点都是有两个叶结点。1:3,4;2:5,6;3:7,8;4:9,10,所以子结点的父结点都是除2得。对应的数字为当前数字-1右移一位。

(i - 1) >> 1;//找到i的跟结点
tmp << 1, (tmp << 1) + 1;//为tmp的左右子树

3:比较二叉树的大小。先从右子树对比树结点,如果大或者小,就和调换值;再用左子树和树结点比较。因为我们存值的时候是用从左到右这样存的。

4:添加值。添加到堆的最后,然后开始向上比较。

5:获取值。最大值or最小值,已经在root结点上,所以取走最上面的值就可以来;再把最后到值放到最顶部开始比较。

[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的时候是否重新生成了一份场景物体树的根节点。这些都需要以后好好研究一下。最后一句,不考虑数量级的优化都是假的。

工作问题

涉及的专业知识: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