躯干
- 头部和躯干不在一条直线, 避免太证件照
- 肩线和腰线不要平行线
- 尽量露出颈部曲线
项目的优化直接影响着应用的使用体验。首先我们需要选择一些指标来作为优化目标:
下面从离线资产优化开始介绍。
参考Game Programming Patterns完成的设计模式总结笔记。
命令模式本质上希望把一个硬编码的函数解耦成可配置的函数命令,尽可能将功能触发和具体功能分离。
如下有一个玩家对象的输入控制功能,其中按下X键对应jump动作。如果我们想要将X键绑定到fireGun功能,那还得去代码里修改对应的硬编码if语句,然后重新编译,重新链接。
1 | void InputHandler::handleInput() |
PointNet首次基于原始点云进行深度学习,其提出了点云深度学习的三大原则: 无序性、点间联系、变换一致性。基于此, PointNet在点云上逐点运用了MLP进行变换, 并且构造了T-Net进行对抗点云的仿射变换, 最终使用max pool进行对称聚合。
缺少对局部结构的特征学习
PointNet没有捕捉到点的局部结构特征,限制了细粒度和复杂场景的识别、泛化能力。PointNet++则引出了一个set abstraction层对点云进行多级学习。set abstraction定义了多级多块的局部邻域结构, 其在每一个局部邻域中都使用了mini-PointNet来进行特征抽取。然而由于点云是非均匀分布的, 不同的局部邻域的密度不一样, 因此PointNet++提出了两种自适应密度的特征融合模块: Multi-scale grouping(MSG) 和 Multi-resolution grouping(MRG)。
另外由于部位分割等任务最终需要输出逐点的特征标签, 因此在set abstraction之后, Pointnet++一方面在同一级内进行反距离的插值传播, 另一方面自顶向下进行反向逐级的特征传播。在同一层内对两种传播特征进行拼接, 即得到该层的逐点特征。
委托类似于函数指针:
1 | //定义委托类型 / 定义函数指针类型 |
在我们定义委托类型时,本质上编译器会生成一个继承自标准库的类,如下所示。这个类实际上会形成一个委托的闭包,其会包含调用所需的所有信息,如调用实例、待调用方法的位置。
1 | class MyDelegateType :System.MulticastDelegate |
对于单播委托,其会在_methodPtr
中直接存储方法地址。然而正如上文所示,一个委托可以注册多个方法。实际上在注册多个方法后,C#会生成一个独立的委托实例,用来指向多个单播委托: