腾讯游戏学院------SLG游戏技术【笔记】

文章仅记录部分内容作为笔记,对视频感兴趣的可见下面链接的原视频:

https://gameinstitute.qq.com/course/detail/10108

课程目录:

这里面提到的游戏,直接用《XX》代替,不会提到名字

【第一章】SLG游戏简介

      - SLG的分类和特征
      - Strategy Game的分类和特征
      - 《XX》的主要玩法(这部分不重要)


【第二章】SLG游戏的技术特征

      - 游戏开发的引擎
      - 通用的系统实现


【第三章】《XX》一些系统的实现

      - 内城部分的实现
      - 大地图的实现
      - 战斗系统的实现
      - 其他系统的实现

正文:

只会记录部分内容,不会全文记录。

【第一章】

主要玩法:

  • 内城建设

主要用来承载它的数值部分(经济循环系统和其他成长部分)

  • 大地图

这部分更倾向于PVP或群体和群体之间的对战,通过人与人之间的强交互,可以提升游戏生命周期。

  • 战斗部分

【第二章】

关于系统设计:

《XX》游戏中用到了ULUA(在当时这个游戏的开发阶段,现在可能会XLUA或其他等等)的framework,这是LUA的一个脚本的系列,主要是把LUA和C#之间做一次结合,使你能在LUA层去调一些C#层的一些东西,C#也能调LUA的一些东西。

选择这个框架的原因是游戏本身对于快速迭代的要求是非常高的。而用这个框架最主要的目的就是能做到热更新,当我们发现问题的时候,希望能在最短的时间内修复。

C#层主要是完成了核心基础系统的建设,支持,它主要做的事一些比较偏向于底层的东西,包括像一些network的创建,或者事一些对象池或者是像底层resource的管理。其他的大量的界面以及一些游戏玩法逻辑,全部放在LUA层里。

基础架构:

网络层略

资源制作:

动画系统:

2D里面常见的一些方案:

  • Sprite Animation(精灵动画)

Sprite动画是为2D资源创建的动画剪辑。 有多种创建Sprite动画的方法。 一种方法是从Sprite工作表中创建它们,Sprite工作表是排列在网格中的Sprite的集合。 然后将Sprites编译成动画剪辑,该动画剪辑将播放每个Sprite以创建动画,就像动画书一样。 还可以通过在Unity中通过“动画”窗口使用关键帧动画来创建Sprite动画[1]。

2D animation in unity[2]

  • Keyframe Animation(关键帧动画)

key frame (or keyframe) in animation and filmmaking is a drawing or shot that defines the starting and ending points of any smooth transition. These are called frames because their position in time is measured in frames on a strip of film or on a digital video editing timeline. A sequence of key frames defines which movement the viewer will see, whereas the position of the key frames on the film, video, or animation defines the timing of the movement. Because only two or three key frames over the span of a second do not create the illusion of movement, the remaining frames are filled with "inbetweens".[3]

有一个缺点是当你大量的使用关键帧时,如果没有一个好的更新策略,它的消耗会大一些。这时可以采用其他的一些多线程方案去更新。

  • Skeleton Animation(骨架动画)

骨骼动画索具计算机动画中的一种技术,其中将角色(或其他关节对象)分为两个部分:用于绘制角色的表面表示(称为网格蒙皮)和一组互连的部分的层次结构(称为“网格”或“蒙皮”骨骼,并共同形成骨骼装备),这是一种用于对网格进行动画处理(姿势关键帧)的虚拟骨架[1] 尽管此技术通常用于给人类和其他有机人物制作动画,但它只能使动画过程更直观,并且可以使用相同的技术来控制任何物体(例如门,勺子,建筑物)的变形,或星系。当动画对象比例如人形角色更笼统时,“骨骼”集可能不是分层的或互连的,而只是表示对其影响的网格部分运动的更高层次的描述[4]。

脚本系统:

脚本中间层

作用域(Scope)

  • 管理脚本中各数据模块的作用范围
  • 可多层嵌套
  • Scope退出时,所有注册到此Scope及其所有子Scope空间的对象,数据都会被自动清除。

事件系统(用事件进行监听,整个系统的设计耦合性会比较小一点,特别是对于一些系统级监听和C#层的接受)

  • 负责系统模块,组件事件传递
  • C#层发出的事件接受
  • 系统级事件监听

任务系统:

  • 串行和并行任务的执行和同步
  • 处理模块延迟和例行处理

场景管理:

  • 场景级别资源调度处理
  • LuaComponent组件映射各种不同的Scene

组件(很多是对ULUA的封装):

  • LUA->C#的映射
  • 通过数据/脚本驱动这些组件
  • 实现复杂的游戏逻辑(在LUA层)

【第三章】《XX》一些系统的实现

内城建设:

  • 主要用LUA完成
  • 大部分是菜单
  • 菜单采用MVC结构

MVC

模型(Model)(主要用来封装应用层和应用逻辑相关的数据以及对数据的处理方法)

  • 封装数据
  • 封装数据处理方法

视图(View)(它可以访问被它监视的一些数据,在被监视数据里注册进去,这样数据修改的同时自己发生变化)

  • 实现数据有目的的显示
  • 不一定需要

控制器(controller)(对于不同操作和数据之间进行修改)

  • 控制流程(处理响应)

战斗系统:

  • 逻辑处理
  • 通讯处理
  • 优化

表现层只会在客户端有,而状态曾层和数据层是两边都有的。服务端会和客户端一起运行,从而对比判断本地的逻辑状态是否和服务器相同,,从而确定玩家是否作弊。

数据层通过一个逻辑层来修改当前的状态,最后通过表现做出来。

战斗通讯:

战斗逻辑服务器和客户端跑同样的一份LUA脚本。服务器先跑,把战斗输入数据下发给客户端。客户端作相同运算并且展示,可以保证战斗记录的精简。

如果你把大量的数据下发的话,带宽占用量会非常大,所以只需要下发你的初始状态。  

如果不采用服务端计算的话,还有其他的方案:客户端要把一些关键值给记录下来回去校验,服务端来校验这些关键点是否正常

战斗优化:

Game object的优化

动态实例化严重

  • 预计算战斗需要的资源,预加载(能降低实时加载量)

高频操作Game Object耗时接口

  • 针对一些必要的组件,在生成prefrab的时候,添加相应的组件。
  • 建立wrap actor,cache component
  • 使用对象池

特效优化:

不同机型使用相同特效

  • 采用LOD方法(对不同的机器性能进行区分)
  • LOD:细节层次,level of detail,它就是一个数值,随着物体或者模型远离观察者而逐步降低。它能够通过减少多边形的数目从而提升渲染的效率,但是恰恰又由于物体距离很远,所以理论上观察者不会感觉到模型和物体的视觉质量会有所下降

过多的使用粒子(这个问题在国内游戏会比较多,因为国内的美术相对来说更偏向于东西制作。有时为了效果好,它一定会把粒子数加得非常大)

  • 减少粒子的数量
  • 把大范围的特效粒子转换为序列帧
  • 低配机器避免使用粒子

 脚本优化:

频繁的分配对象

  • 封装成Lua Object Pool,减少内存分配,提高重复利用率

Lua 频繁访问GameIObject对象属性

  • 属性访问->方法访问
  • Bullet拆分实现
  • Lua->逻辑运算
  • C#->具体表现

地图实现:

  • 大地图拆分为N*N的网格
  • 网格类型:分为Tile层(基础地表,例如草地或者水),Deco层(装饰地表),Object层(物件,各种建筑物和小兵)

大地图--网络优化

因为地图很大,所以不可能实时更新上面的所有东西.

优化的方法是:

  • 1客户端先将地图给切分成7*7的格子,每个格子相当于一个同步块.
  • 2版本号,如果这块协议在上次看到之后,并没有发生变化,就不需要加版本号.
  • 3.过期时间,设置一个过期时间,如果过了这个时间还没有更新的话,就要强制更新.
  • 4.分帧处理,对于同一块,如果在一帧内获取到太多的更新请求时,要进行分帧处理,每秒做的处理量是一定的.(引起的问题就是有延迟显示)

性能优化:

  • 减少绘制区域
  • 分不同的layer
  • 合并贴图
  • 减少序列帧
  • 压缩贴图
  • 采用map查询
  • 缓存object

 

Reference:
[1]Introduction to Sprite Animations https://learn.unity.com/tutorial/introduction-to-sprite-animations#5fa66921edbc2a0020bcaadb

[2]2D animation in unity  https://www.youtube.com/watch?v=hkaysu1Z-N8

[3] Key frame    https://en.wikipedia.org/wiki/Key_frame

[4] Skeleton Animation  https://en.wikipedia.org/wiki/Skeletal_animation

[5] LOD https://blog.csdn.net/qq_36383623/article/details/85220890

 

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值