游戏设计模式读书笔记:架构、性能、游戏

架构、性能、游戏

  • 在开始读第一章的时候会觉得有点混乱,作者提出了什么是架构这个问题,但是并没有像其它书里那样给出一个明确的定义,而是提到了:

    这本书是关于上面这一切要使用的代码的组织方式。这里少谈代码,多谈代码组织。

  • 仔细品读这句话,你会发现这里面其实已经提到了什么是架构:所谓架构就是代码的组织方式。但是从我个人的认识来看这并不够全面,在这里在引用几段《架构漫谈》中的文字来阐述什么是架构:

    在每个人都必须自己完成所有生活必须品的生产的时候,是没有架构
    的(当然在个人来讲,同一时刻只能做有限的事情,在时间上还是可能会
    产生架构的)。一旦产生的分工,就把所有的事情,切分成由不同角色的什么是架构
    人来完成,最后再通过交易,使得每个个体都拥有生活必须品,而不需要
    每个个体做所有的事情,只需要每个个体做好自己擅长的事情,并具备一
    定的交易能力即可。

    这实际上就形成了社会的架构。那么怎么定义架构呢?以上面这个例
    子为例,把一个整体(完成人类生存的所有工作)切分成不同的部分(分 工),由不同角色来完成这些分工,并通过建立不同部分相互沟通的机制, 使得这些部分能够有机的结合为一个整体,并完成这个整体所需要的所有 活动,这就是架构。

    软件架构实际上包括了:代码架构, 以及承载代码运行的硬件部署架构。实际上,硬件部署架构最终还是由代 码的架构来决定。因为代码架构不合理,是无法把一个运行单元分拆出多 个来的,那么硬件架构能分拆的就非常的有限,整个系统最终很难长的更大。

  • 关于架构和性能的冲突,我认为这个点写的很好,可以说我之前没有这样的认识。长久以来我都希望写出非常面向对象的代码,在我长久的认知中,代码的灵活性、高扩展性和可维护性是最重要的,因此设计模式是我在编写代码时所追求的。

  • 但是作者提出良好的架构是需要很大的代价的,因为这需要遵守一些列的准则,Coder必须谨慎的组织代码,而且在引入了抽象,引入了可扩展性,引入的某个设计模式时,我们在增加了代码的灵活性的同时也增加了不可读性,增加了代码复杂度,这就增加了理解的难度。过度的架构设计往往会导致代码库失控,也许你会看到接口和抽象无处不在,我们可能需要花费大量时间才能找到真正功能的代码。关于这一点我也是深有体会,最近在看UniRx库,发现各种接口齐飞,大量的重载,梳理起来确实很费劲。

  • 同时,从代码本身执行角度来说,灵活的代码往往意味着执行速度比较慢。从UNITY的角度来说,因为有类似CLR的东西,当使用面向接口编程时,往往意味这具体类型的判断需要在运行期,JIT做的越多,性能也越差。而且还很可能导致无法实现代码缓存,每次运行都需要实时的做判定。

由一个美术需求引发的Custom Inspector

需求

  • Editor模式下,在运行或者非运行状态下,能够按照指定的变化率来自动改变material中属性数值。

需求分析

  • 如何在Editor模式下获得一个游戏对象及其组件,尤其是在非运行状态下?我们知道在Unity IDE运行起来后是很容易获得一个对象和组件的,在GameObject上挂一个脚本即可。但是在非运行状态下呢,transform.GetComponent这样的方法怎么执行?好在unity已经为我们考虑到了这个问题,提供了[ExecuteInEditMode]Attribute,通过指定这个attribute使得组件类中的方法可以在edit模式下执行,并且是在非运行状态下的。

  • 如何在非运行状态下匀速改变数值呢?update方法中配合Time.deltaTime是一个完美的方案,但是即使设置了[ExecuteInEditMode],update的表现在非运行和运行时也是完全不同的,查资料看到 is only called when something in the scene changed. 这句话时也有种吐槽的冲动。好在unity又为大家考虑到了这个问题(话说unity editor确实功能强大,AssetAtore里面那些插件真是厉害),Edit模式下提供了EditorApplication.update,这是一个事件,我们注册一个自己的方法就可以在非运行状态下实现update的功能。我个人比较推荐使用EditorCoroutine,一个基于EditorApplication.update的协程实现。

代码生成AnimatorController

0.出发点

  • 现在的项目需要设置多套动画组合,全部是由策划在XML文件中设置完成,如果完全的手动在AnimatorController中去做不但工作量大而且如果将来有配置修改了还要一个个去找到对应的自状态机并且修改。因此就萌生了用代码去生成状态机的想法,而且在网上也有了很多的教程可以参考,只是每个项目都不同,且对于一些参数和属性的设置也不尽相同,因此还是把自己的代码进行一些修改后分享出来,基本上应该是包含了状态机常用的功能。

  • 需要注意我的具体代码中是在一个已有的AnimatorController基础上创建的。如果完全是从0开始可以参考别的资料,其实道理是一样的都是代码创建对象。

1.数据来源

一个典型的XML文件

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="ISO-8859-1"?>
<config>
<datas>
<data INDEX="1" Clip1="jump" Clip1Count="1" Clip2="BackLeap" Clip2Count="2" Clip3="die" Clip3Count="1"></data>
<data INDEX="2" Clip1="BackLeap" Clip1Count="3" Clip2="jump" Clip2Count="0" Clip3="jump" Clip3Count="0"></data>
<data INDEX="3" Clip1="BackLeap" Clip1Count="1" Clip2="ForwardLeap" Clip2Count="1" Clip3="jump" Clip3Count="1"></data>
</datas>
</config>

向量夹角计算

向量夹角

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 基于点积计算,
// a.b = ||a|| * ||b|| * sin(θ)
// => θ = arccos(a·b / (||a|| * ||b||))
// => θ = arccos(a·b) //当a和b按照单位向量算时
float angle = Mathf.Acos(Vector3.Dot(a.normalized, b.normalized)) * Mathf.Rad2Deg;

// 基于叉积计算,
// ||a × b|| = ||a|| ||b|| sinθ
// => θ = arcsin(||a × b|| / (||a|| * ||b||))
// => θ = arcsin(||a × b||) //当a和b按照单位向量算时
// 下面公式中有个Distance的计算是因为||a × b||是有长度的
angle = Mathf.Asin(Vector3.Distance(Vector3.zero, Vector3.Cross(a.normalized, b.normalized))) * Mathf.Rad2Deg;

// 最简单计算方式
Vector3.Angle(a, b)

Deepoon的相关设置以及如何玩steam游戏

基本

  • 保证Deepoon助手、显卡驱动是最新的。
  • 安装Deepoon platform sdk。在platform sdk的安装过程中需要阅读其自带的文档,sdk path中不要带中文。

DpnnGetLastError的处理

  • 目前发现在安装了steamVR的情况下会出现DpnuGetLastError错误,在启动状态下出现错误后,退出steamVR。然后重启游戏。
  • 在setting→play中关闭VR support,这个东西在启动后会被steamVR开启(如果你的程序中用到了steamVR)。
  • 按照上述两部则应该不会出现DpnnGetLastError错误,并且只能通过头盔来看游戏内容。

玩steam

  • 在steam的安装目录下放置xxx\Steam\steamapps\common\SteamVR\drivers\deepoon。如果没有放置这个驱动可能导致steam下无法设置VR房间。设置完成后应该是
    image

  • 经过上面的设置就可以用大朋眼镜玩steam游戏了。

开发相关

  • 目前发现如果用大朋眼镜可以玩steam,则在unity中是不需要使用DpnCameraRig的,而且也不需要开启大朋助手。
  • 从这些表现来看大朋应该用的是Oculus的底层。

LOD初探

概念

  • LOD全称是Level of Detail,也就是细节层级。
  • 为什么会产生这个技术?根据官方教程的解释是因为在一个很大的场景中,需要进一步考虑性能问题。LOD就是一个很好的解决性能问题的方案,它根据物体与摄像机的距离来展示这个物体不同的mesh,从而使得物体较远是使用面数比较少的mesh,而距离近的时候使用面数多的mesh。

VR开发环境搭建

  • unity3d的安装

  • 目前使用的Deepoon
    1.安装大朋助手。
    2.如果提示require DpnPlatform_x64.dll,则在大朋官网下载platform的sdk,并找到对应的平台的文件夹安装,有个bat文件可以安装。

  • 安装steam和steamVR。对于steamVR来说正常安装完会显示能识别头盔,但是可能提示未准备好,需要进行房间设置。

Github Page爬坑指南

1.jekyll的使用

  • jekyll的核心命令就几个

    1
    2
    3
    jekyll new blog // 选好文件夹位置
    jekyll build // 在_site文件夹下生成网站内容
    jekyll serve // 可以在本地生成一个服务查看生成网站的内容,IP:127.0.0.1:4000
  • 模板,参考别人的模板进行了修改,地址

iOS学习笔记-02集合

2.集合

  • 集合分为可变与不可变。

  • 泛型,写法NSMutableArray<NSNumber*>* mutablearr = [NSMutableArray array];NSMutableDictionary<NSString*, NSNumber*>* dic = [[NSMutableDictionary alloc] init];,目前会有warning提示如果类型不对。多参数泛型如下,第二行为Xcode的提示性代码。

    1
    2
    NSMutableDictionary<NSString*, NSNumber*>* dic = [[NSMutableDictionary alloc] init];
    [dic addEntriesFromDictionary:<#(nonnull NSDictionary<NSString *,NSNumber *> *)#>]

目前来看类型只能是Objective-C object或者block。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×