好久没有更新

太久没更新了,不过很多心得都是随手记在了印象笔记,最近工作状态不是很好,一直没有调整到最好状态,比较烦躁,加上前两天又跟老妈吵架,她第二天血压还升高,我就立马自责后悔了,最近各种生活烦心事让我真是压抑,心情也是坏到不行,我是个很容易受情绪影响的人,工作也是自然受到影响,但我一直在努力调整,告诉自己一心工作来淡忘这些,但效果还有待坚持呢训练,现在不是一个人在战斗,也肩负着整个团队共同的目标和希望,加油!

最近做了些事情,一些有坑的地方,翻出来分享下好了,有些没想起来的就没写了:

1.由于找了很多零散资源,大多模型贴图都是各顾各的,所以就写了个工具,将很多贴图合并成Atlas,然后再修改模型的顶点uv,适配到atlas里面,这里有一个坑,如果uv存在wrap的情况,那么换了atlas贴图后就不对,两种方法:一是就别换uv存在wrap顶点引用的贴图了,二是把对应的shader再写一份,修改ps,让wrap的uv全都落在atlas中原有贴图的区域;

2.发现编译完的demo,在ios上ok,但是android上闪烁非常厉害,一直不明原因,后来在官方论坛了解到不多的几个人讨论过,原因是z-buffer的精度与摄像机的裁剪距离问题,解决方法是将摄像机的近切面设置的足够大,远切面设置的足够小;

3.写了个简单的倒影水,无diffuse,无specular,法线贴图+cubemap,这次是ios出了幺蛾子,反射完计算的颜色总是不对,无论眼睛的位置在哪里,反射取得的颜色都是黑乎乎一片,后来逐步排查,是shader里浮点数精度的问题,为了优化我把原来的很多float尽量都换成了fixed,结果就在reflect的vector换成fixed,悲剧旧出现了,后来改成half,都好了,这个不同的硬件真的需要各种测试,过度优化就是犯罪;

4.下载了一个地形插件T4M,能将unity的内置地形转换成制定顶点数量的网格,并可以刷地表,但是地形是一整块不能被unity裁减,也不能导出非矩形的地形(会出错),于是在源代码的基础上开始改动,增加地形导出分块功能,任意选择导出成axb块,并对导出的每一块进行优化,如果这一块里面的顶点高度没有起伏,则只保留4个顶点,并导出任意长宽的地形不会变形,经过测试,原来一个8100个顶点的地形,分割成6x6块,经过优化后,导出的地形顶点是5300多个,当然了这个需要看地形复杂度还有分割数量了;

5.分割并导出的地形理论上很完美,可以做长方形,也可以被untiy裁减,但是问题也来了,当你打光时发现噩梦来了,所有分割块的边缘,全是各种万恶的打光缝隙,无论你怎么调整打光参数,都不能完美解决,总会有个你意想不到的地方蹦出一条缝,于是后来我只能另辟蹊径:同时将原地形导出一个不分割块的,先隐藏分块地形,用未分块这个参与打光,打光完毕后,隐藏未分块的,显示出分块的,用我写的一个小工具,将未分块地形的光照图信息全都拷贝至分块地形中,于是整个世界瞬间就完美了,会成功的关键是分块后的地形顶点uv与未分块地形是保持一致的;

6.场景中的透明物体,由于排序问题,可能会造成 drallcall batching 失败;

7.与同事讨论服务器的一个功能时,用到了一个很有趣的c++模板功能,很难解释这个需求,大意是为了尽量使用编译期对类型的判断和萃取,判断一个类是否继承自另一个类,并且是否具有某个特定行为。

 1 template<typename Base, typename Derived>
 2 class IsClassConvertible
 3 {
 4 private:
 5     typedef char                ConvertYes;
 6     typedef struct {char a[2];} ConvertNo;
 7     
 8 private:
 9     template<typename T> static ConvertYes Test(T*);
10     template<typename T> static ConvertNo  Test(...);
11     
12 public:
13     static const bool Value = (sizeof(IsClassConvertible<Base, Derived>::Test<Base>(static_cast<Derived*>(0))) == sizeof(ConvertYes));
14 };
15 
16 struct singleton_need_init_type {};
17 struct singleton_no_need_init_type{};
18 
19 template<typename Base, typename Derived, bool Toggle>
20 class SingletonInitTypeBase
21 {
22 public:
23     typedef singleton_no_need_init_type init_type;
24 };
25 
26 template<typename Base, typename Derived>
27 class SingletonInitTypeBase<Base, Derived, true>
28 {
29 public:
30     typedef singleton_need_init_type init_type;
31 };
32 
33 template<typename Base, typename Derived, bool Toggle = IsClassConvertible<Base, Derived>::Value>
34 class SingletonInitType : public SingletonInitTypeBase<Base, Derived, Toggle>
35 {
36 public:
37     typedef typename SingletonInitTypeBase<Base, Derived, Toggle>::init_type init_type;
38 };
39 
40 template<typename T>
41 inline bool IsSingleNeedInit(T* pObj, singleton_need_init_type)
42 {
43     std::cout << "I need to be inited!
";
44     return pObj->Check();
45 }
46 
47 template<typename T>
48 inline bool IsSingleNeedInit(T* pObj, singleton_no_need_init_type)
49 {
50     std::cout << "I do not need to be inited!
";
51     return true;
52 }

8.一两年前写过的一个叫SafeArray的安全数组模板和一个叫YKArchive的文件序列号类被我翻出来,看能不能用在数据表工具的读写上,结果放在linux和mac下编译才知道当初代码写的多么不遵循标准,害的同事改了好久的编译错误,然后才整合到项目里,让我惭愧啊惭愧;

9.还有啥其它有点印象的东西,想不起来了,对了,最近买了3本书。

10.明天要起早给老妈挂号,得休息了

 
原文地址:https://www.cnblogs.com/yaukey/p/unity_keng_keng_keng.html