type
status
date
slug
summary
tags
category
icon
password
fullWidth
fullWidth

TypeScript、PuerTS、V8优化实践

脚本语言:蓝图、Lua和TS优缺点分析

💡
脚本语言和编程语言的区别:脚本语言是解释执行的,运行时逐行执行;编程语言是编译执行的,代码在运行前被编译成机器码。

蓝图

  • 优点:
    • 支持热更新
    • 可视化编程
    • 简单易上手,策划和美术参与度高
    • 资源、配置、逻辑三位一体
  • 缺点:
    • 多人协作不变、版本管理困难(二进制资产无法使用github、Perforce等版本管理工具)
    • 运行时出问题难以回溯
    • 性能较差
    • 复杂逻辑的可维护性低
    • 难以跑在非专用游戏服务器上,双端逻辑不共用

Lua

  • 优点:
    • 支持热更
    • 可多人协作
    • 语法简洁、Runtime简单、可定制性强
    • 行业人才多、团队内部经验丰富
    • 性能比蓝图优
  • 缺点:
    • 无类型语言
    • 周边工具如IDE、性能分析工具、调试工具缺少
    • 第三方库稀缺

TypeScript

  • 优点:
    • 支持热更
    • 可多人协作
    • 周边工具(IDE、Profiler、Debugger、混淆器等)完善
    • 有类型的语言、语法简单
    • 性能比蓝图优,和lua差不多
    • 广泛应用于Web前端,第三方库众多
  • 缺点:
    • JS引擎复杂度高,维护和定制困难
    • 游戏行业存量人才短缺

为什么选择TypeScript

比较维度
蓝图
Lua
TypeScript
支持热更
双端逻辑共用
×
可视化编程
×
×
多人协作性
×
编码效率
中等
中等
可维护性
上手难度
第三方库
配套开发工具完备性
较少
完备
运行时性能
略低于lua
和lua等同
脚本引擎定制难度
社区成熟度
业内人才密度
作为一个大团队的大项目,从运行时性能、多人协作性、可维护性、双端逻辑共用的角度综合考虑选用TypeScript

V8 垃圾回收优化

  • V8的堆结构分为
    • 新生代:又分为From-Space和To-Space,储存大部分新创建的对象
    • 老生代:从新生代存活的对象
    • 大对象区:存放新生代无法容纳的对象,大对象区的对象不进行复制和移动
    • Map Space:保存对象结构
    • Code Space:储存编译器编译出来的代码
V8堆内存示意图
V8堆内存示意图

Orinoco 垃圾回收主要策略

主线程和辅助线程:主线程是应用程序启动时由操作系统创建得第一个线程,主要负责界面更新和响应用户输入,管理应用程序的生命周期;辅助线程用于执行后台任务(计算密集型操作、文件IO操作等)
  • Parallel:主线程和辅助线程同时进行GC,GC时主线程也停止
  • Incremental:主线程间歇地执行少了GC工作,类似分帧计算
  • Concurrent:主线程持续执行JS不中断,由辅助线程在后台执行GC

垃圾回收优化策略

V8的GC触发策略:1.分配新对象且V8堆内存不足;2.达到内存使用阈值;3.内存分配速率达到阈值
  • 通用优化
    • 减少临时对象的创建
    • 使用对象池技术做到对象复用
    • 慎用字符串相关操作函数
    • 减少从JS向UE4传递参数造成的隐式编码转换
  • 闲时回收
    • 在每帧耗时低时主动增量GC;在UE4的tick中计算每帧的闲置时间,通知V8进行GC
  • 调度策略
    • 根据新增的Uobject对象数量来决定主动强制Parallel GC,而不等V8来决定何时进行GC
  • 利用弱回调函数
    • 强引用和弱引用:强引用的生命周期和引用它的变量相同,强引用存在时GC不会回收这个对象,容易导致内存泄漏;弱引用的对象会被GC回收,可避免对象被长时间持有
    • 弱回调函数使用弱引用来引用对象,该对象不会因为这些引用而阻止被垃圾回收器回收
    • 弱回调函数允许在对象被回收前执行一些清理或通知操作
  • 语言内置类型
    • 把部分结构(如Vector3、Quat等)实现为JS内置类型,在UE4和JS之间使用值传递而不导出成对象
捣鼓记录:Unity内置渲染管线实现角色NPR渲染的简单实践UFSH摘要:《鸣潮》基于虚幻引擎4的多平台效果和性能优化实践 by 王宏波
Loading...
Latest posts
工作笔记:一些乱七八糟的踩坑记录
2025-4-17
游戏算法-Floyd搜索算法知识梳理和通用框架
2025-4-2
游戏算法-A*搜索算法知识梳理和通用框架
2025-4-2
游戏AI行为决策-目标导向行为规划(GOAP)通用框架
2025-3-23
自制Python任务调度模块-MySchedule
2025-3-20
学习笔记:23种设计模式
2025-3-19