为为为为为为为为为为为为为 为为为为为为为为为为为为为 —— —— 利利利利利利利利利利利利 利利利利利利利利利利利利 利利
为独立工作室构建为独立工作室构建跨平台引擎跨平台引擎
———— 利用开源技术进行快速开发利用开源技术进行快速开发封烨
声明
绝无高科技
源自手头项目经验
不同意见
Project OneTap
一键操作一键操作
2D2D 动作动作
简单解迷简单解迷
轻松风格轻松风格
自定义关卡自定义关卡
挑战:关卡设计
工欲善其事
选择 1 :廉价商业引擎
选择 2 :开源引擎
廉价商业引擎
优点
快速开发环境
跨平台(在厂商支持下)
可承受的授权费
缺点
离线开发环境
移植(在厂商无支持的情况下)
无源码
纯脚本
开源引擎
优点
全部源码
跨平台
免费
缺点
无快速开发环境
纯原生代码
注意授权方式
选择
选择 1 :廉价商业引擎
选择 2 :开源引擎
选择 3 :开源引擎+游戏开发支持层
Allegro ✔
Plus 层的优势
脚本+原生代码支持
为游戏内容定制的开发环境
玩家可用编辑器
高效率
etc...
Plus 层做了什么游戏对象和组件系统
脚本集成
刚体物理集成
多个小系统简单场景管理
生成即丢弃的 Action 系统
脚本 Key-Value Dictionary
etc...
演示
3 个月后的成果
展示游戏内容和编辑器展示游戏内容和编辑器
游戏对象和组件系统
类继承与游戏层开发
游戏层开发 ∈ 游戏程序开发
游戏层开发过程=迭代过程
迭代产生变化
类继承难以响应变化
类继承的困境
类继承的困境
类继承的困境
类继承的困境
类继承的困境
设想:组合
设计模式
Favor object composition over class inheritance
游戏对象和游戏组件
以组合的方式代替继承
一个游戏逻辑上的对象
由多个功能性的组件组合而成
Game Game ObjectObject
Component Component #1#1
Component #2Component #2
Component #3Component #3
游戏对象和游戏组件
运行时添加删除组件
搭建快速开发环境的关键
脱困:组合
基本组件位置信息 Transform
2D 渲染 Sprite
位图信息 Bitmap Source
用户输入处理 Event Receiver
刚体实体 Body
刚体碰撞 Fixture
粒子喷口 Particle Emitter
etc...
用户组件游戏层需要的任意功能
自动旋转
关卡终点
人物行为
关卡中的尖刺
编辑器需要的画线功能
etc...
演示
背景云背景云移动可碰撞前景云+自动翻转功能
背景云背景云移动可碰撞前景云+自动翻转功能
组件间通信
查询接口,直接调用
破坏组件间独立性,增加耦合度
注册消息,委托系统调用
无法确定调用先后关系
脚本集成
原生语言困境
编译时间
运行时修改
高级语言特性
“胶水”代码
脱困: 2-tiers 系统
核心:原生语言
编辑器和游戏层:脚本语言
Lua
在合适的位置做合适的事
脚本集成相关工作
原生语言和脚本语言通信
导出工具 /库
脚本语言 API
原生和脚本间通信
简单函数 /底层系统 API
tolua
简单、无编译成本
复杂函数
Lua C API
脚本集成相关工作
序列化
支持语言高级特性
引用
函数对象、闭包
etc...
存读盘、编辑器
序列化
Pluto
只需为每个组件编写序列化函数
约 1000 行 Lua 代码
预制对象
给对象取“快照”
参数
引用
层级关系
辅助“对象设计”
关卡编辑器 对象编辑器➔
演示
1、运行时修改2、 Prefab1、运行时修改2、 Prefab
脚本的问题
Debugger
Coroutine/Fiber
引用泄露
脚本载入器
iPhone版
简单移植
Mac➔iPhone
20 FPS + 崩溃
可能出现问题的地方
内存 /显存需求超限
脚本效率
绘制系统效率
内存限制
内存显存共用架构
用户程序可用 112M - iPhone 4
解决内存限制
2D 游戏-重度使用位图纹理
预分配位图空间
22 x 1M x 4 bpp = 88M
Atlas
将零散的位图拼接成 Atlas
使用自动工具
解决内存限制
内存碎片
堆分配 /释放
脚本系统
dmalloc
Drop-in, just works
侦测效率问题
Instruments
Mac/iPhone
代码嵌入式 Profiler
侦测效率问题
嵌入式 Profiler 发现:
Draw call数量高
Instruments 发现:
Renderer 利用率 100%
Tiler 利用率 9%
减少绘制调用
桌面平台通用技巧
实现
收集绘制调用
排序,位图相同者归簇
批量绘制相同位图
目的:减少纹理切换造成的管线停滞
减少绘制调用
优化前
优化后
绘制优化
填充率
每秒写入帧缓存的纹素数
桌面平台-重度使用 pixel-shader
填充率瓶颈
减少帧缓存大小,帧率提升✔
填充率优化
硬件限制- 221M/秒
60 FPS - 3.6M/帧
30 FPS - 7.2M/帧
2D 游戏
重度使用 Alpha-blend
难以利用 Z-buffer
填充率优化
减少重复绘制
完全不透明物体使用 Z-buffer
修改美术资源,重定义美术规格
演示
填充率效率优化前后对比填充率效率优化前后对比
Questions?