好久没有更新
太久没更新了,不过很多心得都是随手记在了印象笔记,最近工作状态不是很好,一直没有调整到最好状态,比较烦躁,加上前两天又跟老妈吵架,她第二天血压还升高,我就立马自责后悔了,最近各种生活烦心事让我真是压抑,心情也是坏到不行,我是个很容易受情绪影响的人,工作也是自然受到影响,但我一直在努力调整,告诉自己一心工作来淡忘这些,但效果还有待坚持呢训练,现在不是一个人在战斗,也肩负着整个团队共同的目标和希望,加油!
最近做了些事情,一些有坑的地方,翻出来分享下好了,有些没想起来的就没写了:
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!\n"; 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!\n"; 51 return true; 52 }
8.一两年前写过的一个叫SafeArray的安全数组模板和一个叫YKArchive的文件序列号类被我翻出来,看能不能用在数据表工具的读写上,结果放在linux和mac下编译才知道当初代码写的多么不遵循标准,害的同事改了好久的编译错误,然后才整合到项目里,让我惭愧啊惭愧;
9.还有啥其它有点印象的东西,想不起来了,对了,最近买了3本书。
10.明天要起早给老妈挂号,得休息了