热更新技术
2021-04-11 14:06:24 0 举报
AI智能生成
热更新技术
作者其他创作
大纲/内容
热更新技术
原理
问题:因为C#属于编译型语言无法热更新。传统上游戏更新,需要下载整个下载包,游戏体验交差。
类别
使用Lua脚本实现
ulua(网站:ulua.org)、nlua(网站:nlua.org)、UniLua、sLua等
Tolua(目前公司用的多)
Xlua(腾讯维护的技术)
使用C# Light
使用C# 反射技术
Lua
概述
发展史
巴西大学研究项目,设计目的是嵌入应用程序中,提供灵活的扩展和定制功能。lua由C语言编写而成,是1993年完成开发。lua最新是5.3的版本,但是版本提升很慢。
特点
使用C/C++开发
快速小巧,易于使用,跨平台性强
本身不涵盖什么功能
动态的脚本语言
常用来实现逻辑
方便和其他的语言集成,无需编译,利用集成和扩展。
相关网站
官网
LuaForwindows
IDEA的lua插件
其他编译器
LuaDist(官方推荐)
LuaStudio(国内开发优秀IDE)
VS lua插件(babelua插件)
初级基础
命名规则
使用规则
注释
行注释:--
块注释:--[[ ]]--
标识符与关键字
标识符
以字母与下划线开头,不能以数字开头,不允许出现特殊字符,区分大小写
关键字
变量
注意
lua语言中的变量,无需声明类型
lua语言中的类型,随时可以改变。
全局和局部变量
lua变量默认都是全局性的,定义局部变量则需要用关键字local来修饰。
Lua语句块(if、for等)与函数中,定义的默认都是也都是全局变量。
lua中也可以直接使用do ... end来直接定义一个语句块。
如果想要删除一个全局变量量只需要给其赋值nil即可
type(变量):获取当前的变量类型
nil
定义
相当于C#中的null(销毁占用的资源)
boolean
定义
布尔变量
string
定义
字符串类型,可以使用双引号和单引号
多行字符串
格式
name=[[多
行字
符串]]
行字
符串]]
字符串链接
str1..str2
使用“..”作字符串连接,并且只做字符串连接
字符串转换
tonumber
tostring
注意
当两个字符串进行连接时,当其可能为空时要给其添加tostring防止报错。
表(数组)的类型,不能之转换成数据类型,所以在和数据类型做连接时表(数组)需要加上tostring
字符串和数值类型无法进行加法运算
获取字符串长度
string.len(变量)
#变量
大小写转换
大写
string.upper(变量)
小写
string.lower(变量)
字符串查找
string.find(str,'a',5)
字符串截取
string.sub(str,1,3)
字符串替换
string.gsub("hello world","l","z")=hezzo worzd
字符串反转
string.reverse(变量)=量变
字符串格式化
string.format(formatstring:"字符串格式化:%d,%s",num1,num2)
number
定义
小数类型(lua是没有整数类型)。
table
定义
Table 是 Lua的一种数据结构用来帮助我们创建不同的数据类型,如:数组、键值对集合等。
特点
lua(数组)的下标可以是负数
lua的长度可以动态改变(与C#的固定长度数组不同),可以把lua数组认为是C#的List、Dictionary等集合类型。
把Table当成一个“字典”集合来对待。也可以当成一个“数组”来对待,这要看如何来初始化表。
方法
获得table长度
#tabMyArray
table.getn(tabMyArray)
链接
表的连接器,就是将表中的数据连接在一起。
table.concat(tab1,"分隔符","连接开始的下标","连接结束的下标")
插入
table.insert(表对象,插入位置,插入的值)
删除
table. remove(表对象,删除位置)
函数默认移除最后一个位置序号
排序
table.sort(表对象)
先输出数字,大写开头的字符串,小写开头的字符串,中文。
最大值
table.maxn(表对象)
针对数组数值类型。
输出了表的长度,而不是表的内容最大值。
实例
数组类型
tabMyArray={22,23,25}
迭代输出
for i=1,3 do
print(tabMyArray[i])
end
print(tabMyArray[i])
end
这里可以使用#tabMyArray或者table.getn(tabMyArray)的方式来替代3
键值对类型
tabMyArray={str1=22,str2=23,str3=25}
tabMyArray["str1"]
tabMyArray.str2
迭代输出
for i=1,3 do
print(tabMyArray["str"..i])
end
print(tabMyArray["str"..i])
end
这里不可以使用#tabMyArray或者table.getn(tabMyArray)的方式来替代3
function
定义
表示由lua(或者C)编写的函数
userdata
定义
表示任何存储在变量中的C数据类型
thread
定义
表示执行的独立线程(本质是“伪线程”,是协成的概念),用于执行协同程序。
三大运算符
算数运算符
分类
+、-、*、/、%、^
注意
没有自增自减函数
关系运算符
分类
<、<=、>、>=、== 、~=
注意
nil只与其自身相等
对于table、函数、userdata、lua是做引用比较的。即:只有当它们引用同一个对象时,才认为他们相等。
逻辑运算符
分类
and、or、not(&&、||、!$)
注意
false和nil为假,其他都为真
短路规则
A and B:当A为真返回B的值,如A为假返回A的值
A or B:当A为真返回A的值,如A为假返回B的值
循环体
if
单分支
双分支语句
多分支语句中
注意
elseif(中间没有空格)
while
repeat(相当于do while)
定义
先实现循环,后判断
结构
repeat
until()
until()
for
结构
泛循环
for k,v in ipairs(myArray)do
end
end
数值循环
for 变量名=初始值,结束值,(步长)do
end
end
注意
使用pairs关键字,循环输出“数组”类型的表时,for中必须使用k , v
使用pairs 关键字,循环中的k , v字母,可以是任何字母或者合法标识符代替。
关键字
循环终止
break
iparis和paris
iparis
定义
顺序遍历集合
注意
遇见对象中有nil,则不再往后输出
paris
定义
遍历集合中所有的数据,一般用于键值对类型
注意
输出集合中所有非nil的数值
实例
for m,n in iparis(或者paris)(table对象) do
print(m,n)
end
print(m,n)
end
函数
格式
function funName(para1,para2,...)
[函数体]
end
[函数体]
end
基本性质
函数无需定义返回类型,可以返回任意类型与任意数量的数值。
函数的参数,无需定义参数类型。
函数无需大括号。
可以定义变量,把函数直接赋值给它,从而获得相同功能。
匿名函数
定义的时候,不需要定义函数名称,但是一定要给匿名函数赋值给变量
知识点
多重赋值
示例
num1, num2,num3=1,2,3
注意
如果值的个数少于变量的个数,那么多余的变量会被赋值为nil,如果值的个数更多的话,多余的值会被忽略掉。
lua语言OOP编程
原理
使用table(表)来实现OOP编程模拟
“类”
Person={}
“字段”
Person.Name="刘国柱"
“方法”
Person.Speak=function()
print("人在说话");
end
print("人在说话");
end
匿名函数的方式
不常用
function Person.Walking()
print("人在走路");
end
print("人在走路");
end
常用
调用
字段
Person.Name
方法
Person.Speak()
使用Self关键字来提高灵活性
中级篇
函数进阶
参数简化
如果“实参”是一个字符串,则圆括号可以简化
SetName("mengdi") 简化为 SetName "mengdi"
如果“实参”是一个table构造式,则圆括号可以简化
SetNmaeArray(nameArray)简化为 SetNameArray {10,20,30,40}
可变参数(变长参数)
定义
表示一个函数的参数是多个
实例
function MultiParaVal(...)
for i,v in pairs({...}) do
print("v")
end
end
for i,v in pairs({...}) do
print("v")
end
end
lua内置了函数“arg”来代替“{...}”
#arg表示参数的个数
MultiParaVal("占山",“世界”,“王五”)
标准函数库
数学函数math.
abs()
绝对值
max()
最大值
min()
最小值
sin()
正弦值
cos()
余弦值
sqrt()
平方根
floor()
取整
random()
假随机数
可以利用整数时间改变假随机树因子,来实现真正的随机数
字符串函数string.
lower()
得到全部小写
spper()
得到全部大写
sub(字符串对象,截取开始位置,截取结束位置)
截取字符串
操作系统库os.
date()
得到日期
time()
得到时间
整数时间
函数尾调用
定义
一个函数调用是另一个函数的最后一个动作
特点
不占用“堆栈”空间
带圆括号和不带圆括号区别
带圆括号的会返回一个数值
本质
lua函数本质是匿名函数,既没有名称。讨论一个函数,本质是讨论一个持有此函数的变量。
闭包
定义
一个函数中嵌套子函数,子函数可以使用父函数中的局部变量,这种行为是“闭包”
特点
闭包中的内嵌函数可以访问外部函数已经创建的所有局部变量,这些变量称为该内嵌函数的“upvalue”。
与函数的区别
团包只是在形式和表规上像函数,但是实际上不是函数。函数只有一个实例,定义后逻辑就确定了,不会执行时发生变化。
功能与作用
开发自定义“迭代器”函数
扩展了现有的函数功能
扩展了命名空间
模块
定义
由变量、函数等组成的table,因此创建模块本质就是创建一个table,此table最后需要返回。
作用
类似于一个封装库,把一些公用的代码放在一个文件里,以API接口的形式在其他地方调用,有利于代码的重用和降低代码耦合度。
注意事项
定义local的函数名,就不要加模块限定,否则出错。
Xlua
(腾讯维护的技术)
Tolua
(目前公司用的多)
热更新框架设计
Xlua基础
热更流程与热补丁技术
游戏客户端框架
热更新客户端框架
热更新流程模块
负责游戏项目开始前,向服务器询问是否需要资源更新的管理机制
UI框架
负责UI界面的加载、管理
负责UI界面核心按钮事件注册
lua框架
负责UI界面内容展现(文字、图片、特效等)
UI界面各功能实现(公告、任务、背包、商城等)
场景跳转、UI界面配置文件管理等
负责游戏项目C#程序Bug修复管理,即热补丁(HotFix)管理
Xlua插件
AssetBundle框架
基于ab包的网络(远程)/单机(本地)加载模式
0 条评论
下一页