Top Banner
为为为为为为为为为为为为为 为为为为为为为为为为为为为 —— —— 利利利利利利利利利利利利 利利利利利利利利利利利利 利利
51

为独立工作室构建跨平台引擎

Jul 01, 2015

Download

Technology

Coconut Island

利用开源技术进行快速开发构建工作室引擎
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 为独立工作室构建跨平台引擎

为独立工作室构建为独立工作室构建跨平台引擎跨平台引擎

———— 利用开源技术进行快速开发利用开源技术进行快速开发封烨

Page 2: 为独立工作室构建跨平台引擎

声明

绝无高科技

源自手头项目经验

不同意见

Page 3: 为独立工作室构建跨平台引擎

Project OneTap

一键操作一键操作

2D2D 动作动作

简单解迷简单解迷

轻松风格轻松风格

自定义关卡自定义关卡

Page 4: 为独立工作室构建跨平台引擎

挑战:关卡设计

Page 5: 为独立工作室构建跨平台引擎

工欲善其事

选择 1 :廉价商业引擎

选择 2 :开源引擎

Page 6: 为独立工作室构建跨平台引擎

廉价商业引擎

优点

快速开发环境

跨平台(在厂商支持下)

可承受的授权费

缺点

离线开发环境

移植(在厂商无支持的情况下)

无源码

纯脚本

Page 7: 为独立工作室构建跨平台引擎

开源引擎

优点

全部源码

跨平台

免费

缺点

无快速开发环境

纯原生代码

注意授权方式

Page 8: 为独立工作室构建跨平台引擎

选择

选择 1 :廉价商业引擎

选择 2 :开源引擎

选择 3 :开源引擎+游戏开发支持层

Allegro ✔

Page 9: 为独立工作室构建跨平台引擎

Plus 层的优势

脚本+原生代码支持

为游戏内容定制的开发环境

玩家可用编辑器

高效率

etc...

Page 10: 为独立工作室构建跨平台引擎

Plus 层做了什么游戏对象和组件系统

脚本集成

刚体物理集成

多个小系统简单场景管理

生成即丢弃的 Action 系统

脚本 Key-Value Dictionary

etc...

Page 11: 为独立工作室构建跨平台引擎

演示

3 个月后的成果

展示游戏内容和编辑器展示游戏内容和编辑器

Page 12: 为独立工作室构建跨平台引擎

游戏对象和组件系统

Page 13: 为独立工作室构建跨平台引擎

类继承与游戏层开发

游戏层开发 ∈ 游戏程序开发

游戏层开发过程=迭代过程

迭代产生变化

类继承难以响应变化

Page 14: 为独立工作室构建跨平台引擎

类继承的困境

Page 15: 为独立工作室构建跨平台引擎

类继承的困境

Page 16: 为独立工作室构建跨平台引擎

类继承的困境

Page 17: 为独立工作室构建跨平台引擎

类继承的困境

Page 18: 为独立工作室构建跨平台引擎

类继承的困境

Page 19: 为独立工作室构建跨平台引擎

设想:组合

Page 20: 为独立工作室构建跨平台引擎

设计模式

Favor object composition over class inheritance

Page 21: 为独立工作室构建跨平台引擎

游戏对象和游戏组件

以组合的方式代替继承

一个游戏逻辑上的对象

由多个功能性的组件组合而成

Game Game ObjectObject

Component Component #1#1

Component #2Component #2

Component #3Component #3

Page 22: 为独立工作室构建跨平台引擎

游戏对象和游戏组件

运行时添加删除组件

搭建快速开发环境的关键

Page 23: 为独立工作室构建跨平台引擎

脱困:组合

Page 24: 为独立工作室构建跨平台引擎

基本组件位置信息 Transform

2D 渲染 Sprite

位图信息 Bitmap Source

用户输入处理 Event Receiver

刚体实体 Body

刚体碰撞 Fixture

粒子喷口 Particle Emitter

etc...

Page 25: 为独立工作室构建跨平台引擎

用户组件游戏层需要的任意功能

自动旋转

关卡终点

人物行为

关卡中的尖刺

编辑器需要的画线功能

etc...

Page 26: 为独立工作室构建跨平台引擎

演示

背景云背景云移动可碰撞前景云+自动翻转功能

背景云背景云移动可碰撞前景云+自动翻转功能

Page 27: 为独立工作室构建跨平台引擎

组件间通信

查询接口,直接调用

破坏组件间独立性,增加耦合度

注册消息,委托系统调用

无法确定调用先后关系

Page 28: 为独立工作室构建跨平台引擎

脚本集成

Page 29: 为独立工作室构建跨平台引擎

原生语言困境

编译时间

运行时修改

高级语言特性

“胶水”代码

Page 30: 为独立工作室构建跨平台引擎

脱困: 2-tiers 系统

核心:原生语言

编辑器和游戏层:脚本语言

Lua

在合适的位置做合适的事

Page 31: 为独立工作室构建跨平台引擎

脚本集成相关工作

原生语言和脚本语言通信

导出工具 /库

脚本语言 API

Page 32: 为独立工作室构建跨平台引擎

原生和脚本间通信

简单函数 /底层系统 API

tolua

简单、无编译成本

复杂函数

Lua C API

Page 33: 为独立工作室构建跨平台引擎

脚本集成相关工作

序列化

支持语言高级特性

引用

函数对象、闭包

etc...

存读盘、编辑器

Page 34: 为独立工作室构建跨平台引擎

序列化

Pluto

只需为每个组件编写序列化函数

约 1000 行 Lua 代码

Page 35: 为独立工作室构建跨平台引擎

预制对象

给对象取“快照”

参数

引用

层级关系

辅助“对象设计”

关卡编辑器 对象编辑器➔

Page 36: 为独立工作室构建跨平台引擎

演示

1、运行时修改2、 Prefab1、运行时修改2、 Prefab

Page 37: 为独立工作室构建跨平台引擎

脚本的问题

Debugger

Coroutine/Fiber

引用泄露

脚本载入器

Page 38: 为独立工作室构建跨平台引擎

iPhone版

Page 39: 为独立工作室构建跨平台引擎

简单移植

Mac➔iPhone

20 FPS + 崩溃

可能出现问题的地方

内存 /显存需求超限

脚本效率

绘制系统效率

Page 40: 为独立工作室构建跨平台引擎

内存限制

内存显存共用架构

用户程序可用 112M - iPhone 4

Page 41: 为独立工作室构建跨平台引擎

解决内存限制

2D 游戏-重度使用位图纹理

预分配位图空间

22 x 1M x 4 bpp = 88M

Atlas

将零散的位图拼接成 Atlas

使用自动工具

Page 42: 为独立工作室构建跨平台引擎

解决内存限制

内存碎片

堆分配 /释放

脚本系统

dmalloc

Drop-in, just works

Page 43: 为独立工作室构建跨平台引擎

侦测效率问题

Instruments

Mac/iPhone

代码嵌入式 Profiler

Page 44: 为独立工作室构建跨平台引擎

侦测效率问题

嵌入式 Profiler 发现:

Draw call数量高

Instruments 发现:

Renderer 利用率 100%

Tiler 利用率 9%

Page 45: 为独立工作室构建跨平台引擎

减少绘制调用

桌面平台通用技巧

实现

收集绘制调用

排序,位图相同者归簇

批量绘制相同位图

目的:减少纹理切换造成的管线停滞

Page 46: 为独立工作室构建跨平台引擎

减少绘制调用

优化前

优化后

Page 47: 为独立工作室构建跨平台引擎

绘制优化

填充率

每秒写入帧缓存的纹素数

桌面平台-重度使用 pixel-shader

填充率瓶颈

减少帧缓存大小,帧率提升✔

Page 48: 为独立工作室构建跨平台引擎

填充率优化

硬件限制- 221M/秒

60 FPS - 3.6M/帧

30 FPS - 7.2M/帧

2D 游戏

重度使用 Alpha-blend

难以利用 Z-buffer

Page 49: 为独立工作室构建跨平台引擎

填充率优化

减少重复绘制

完全不透明物体使用 Z-buffer

修改美术资源,重定义美术规格

Page 50: 为独立工作室构建跨平台引擎

演示

填充率效率优化前后对比填充率效率优化前后对比

Page 51: 为独立工作室构建跨平台引擎

Questions?