vpa updater 源码分析

vpa updater 源码分析,第1张

updater整体逻辑是比较简单的。

(1)定义了一个NewUpdater的对象

(2)然后每隔1分钟,执行NewUpdater.RunOnce

每隔1分钟进行以下的运行逻辑:

热升级调整的逻辑:

(1)修改 podLifetimeUpdateThreshold = 30s

(2)跳过canEvictedPods逻辑

每隔1分钟进滚困链行以下的运行逻辑:

感觉驱逐逻辑迁移到cgroupManager可以如下:

(1)继承上诉的步骤1,步骤2,因为是热升级,所以不用关注步骤三(考虑min-replica )

(2)OOM事件会影响pod驱逐,但是是热升级的情况下感觉可以忽略

举例说明会更清楚一点:

假设deploy yaml中定义的资源为:(这里limit:request=2:1)

而vpa推荐值为:cpu=25m mem=262144k。那么这个pod实际运行时的request如下:

假大孙设pod yaml中定义的资源为:(这里尺物没有limit)

而vpa推荐值为:cpu=25m mem=262144k。那么这个pod实际运行时的request如下:

假设pod yaml中定义没有定义资源:(besteffort)

而vpa推荐值为:cpu=25m mem=262144k。那么这个pod实际运行时的request如下:

一、什么是LuaFramework?

答:基于SimpleFramework + tolua # 基础上,重新构造的新框肢咐衫架。框架内自带了LuaBundle模式(将Lua文件打包进Assetbundle) + 重构的资源管理器。

两大版本:

LuaFramework_NGUI:GitHub下载地址

LuaFramework_UGUI:GitHub下载地址

注:受限制于Unity在不断的版本更新中,Assetbundle的内部变更与机制更新,Github上作者LuaFramework也需要跟随版本进行填充内容,优化源码等,但更新已经跟不上Unity更新速度。使用中需要选择对应Unity版本的LuaFramework。解决的方法是,开发者自主基于现有框架添加新的机制和功能。或自主开发Lua框架以应对Unity各版本。

二、目的

理解LuaFramework原理。能够轻松自主开发框架或基于现有框架更新。

三、查看Lua项目

从Github上下载的LuaFramework,是一个完整的项目包。里面关于Lua的内容使用的均为绝对路径。在尚未清楚Lua的原理前,拖进至其他项目之中,会出现无法使用等报错原因。故Unity新建添加该项目。

其他:历腔

Opening Project in Non-Matching Editor Installasion - 选择 “Continue”

API Update Required - 选择 “I Made a Backup. Go Ahead!”

一些问题: 2020版本无法打开。经检查目前LuaFramework仅提供2017/2018/2019的版本支持。在转2019版本时,出现反复加载某一段资源,长时间无法结束加载的情况。

3.1 *** 作流程(简)

打开Project窗口下 Framework->Scenes->mian场景:Hierarchy窗口下的GameManager对象上挂载有Main.cs。

第一次运行:[报错]没有找到框架所需要的资源,单击Game菜单下Build XXX Resources生成!

查看菜单栏:菜单栏上有 “LuaFramework” 和 "Lua"两新增菜单

打开Menu栏下 LuaFramework->Build Windows Resource:点击后,会在Project窗口新生成一个StreamingAssets目录。(注意:不同平台的Resource不一,根据需求平台进行选择。)

第二次运行:Game窗口出现由Lua实现的UI。

查看Console:梳理过程

3.2 流程梳理

前提 *** 作:清理无用的DeBug

消息 描述 自上而下

Init lua state 初始化 LuaState

Register lua type cost time: XXX 注册 lua type 所耗费的时长

Initialize OK! 初始化完成

LuaState start 启用LuaState

[tolua.lua:11]:version20100 jit: XXX XXX 及时编译器版本信息

[tolua.lua:12]:os: Windows, arch: x64 Windows x64

[Main.lua:3]:logic start

3.3 MVC框架

参照LuaFramework->Scripts->Framework

M:Manager.cs

V:View.cs

C:Controller.cs

3.4 实现

参照LuaFramework->Scripts

3.4.1 关于Manager

GameManager:实现热更新的简激流程(关于实现的机制)

ResourceManager:从Assetsbundler中获取指定的Assets

LuaManager:初始化Lua语句来执行与Lua相关的内容

3.4.2 关于View

AppView(未被使用)

3.4.3 关于Controller

StartUpCommand:初始化管理器

3.5 打包

重新LuaFramework ->Build Window Resource

3.6 调试

变更AppConst.cs:2中的LuaBundleMode为Fasle

3.7 准备服务器

在服务器本地目录下新建命名文件夹,这里取名Lua_Test。

在新建目录Lua_Test下新建两个文件夹,分别取名为Release和Web。

Web:放置更新资源

Release:放置需要热更新的程序

将生成的StreamingAsset目录放置入Web目录中(也可是目录中整个文件)

使用Microsoft Edge或其他浏览器访问服务器

访问本地IP:http://local

访问局域网IP:http://192.168.0.1

访问远程服务器IP:http://IP

访问目录文件files.txt

IP地址:http://远程服务器IP/StreamingAssets/files.txt

搭建完成

四、热更新原理

Unity的热更新需要涉及到3个目录:

流程:

*** 作①仅第一次 *** 作出现,是将游戏包资源文件拷贝至数据目录(后续将不再执行)

*** 作②请求网络资源,检查是否更新资源

*** 作③启动游戏程序

4.1 游戏资源目录:

包含Unity工程中StreamingAssets文件夹下的文件。安装游戏之后,这些文件将被复制到目标机器上特定的文件夹内。

注意:不同平台下的目录路径不一。

平台 路径

Mac OS或Windows Application.dataPath + "/StreamingAssets"

IOS Application.dataPath + "/Raw"

Android "jar:file://" + Application.dataPath + "!/assets/"

4.2 数据目录

“游戏资源目录”在Andriod、IOS上只读,无法将下载更新的资源放置其中。需建立一个“数据目录”,该目录可读写。

在第一次启动游戏后,程序会将“游戏资源目录”的内容复制到“数据目录中”。 *** 作①

游戏过程中的资源加载,都将从“数据目录”中获取、解包。 *** 作③

注意:不同平台下的目录路径不一。

平台 路径

Mac OS或Windows C:/LuaFramework/"

Android或IOS Application.persistendDataPath + "/LuaFramework""

调试模式下 Application.dataPath + “/StreamingAssets/”

4.3 网络资源地址

存放游戏资源的网址,游戏开始后,程序会从网络资源地址下载一些更新的文件到数据目录。

此目录下包含不同版本的资源文件,以及用于版本控制的files.txt。程序会优先下载此文件,然后与“数据目录”中文件的MD5码作比较,更新有变化的文件。 *** 作②

LuaFramework的热更新代码定义在Assets\LuaFramework\Scripts\Manager\GameManager.cs【根据实际情况配置路径】

释放资源

//释放资源

void CheckExtractResource()

{

bool isExists = Dictionary.Exists(Util.DataPath)

&&Dictionary.Exists(Util.DataPath + "lua/")

&&Dictionary.Exists(Util.DataPath + "lua/");

if (isExists || AppConst.DebugMode)

{

StartCoroutine(OnUpdateResource())

return

}

StartCoroutine(OnExtractResource()) //启用释放协议

}

IEnumerator OnExtractResource()

{

string dataPath = Util.DataPath//数据目录

string resPath = Util.AppContentPath()//游戏包资源目录

if(Directory.Exists(dataPath) &&Directory.Delet(dataPath, true))

{

Directory.CreateDirectory(dataPath)

}

}

登录后复制

启用更新资源

IEnumerator OnUpdateMode()

{

if(!AppConst.UpdateMode)

{

OnResourceInited()

yield break

}

string dataPath = Util.DataPath //数据目录

string url = AppConst.WebUrl

string message = string.Empty

string random = DateTime.Now.ToString("yyyymmddhhmmss")

string listUrl = url + "files.txt?v=" + random

Debug.LogWarning("LoadUpdate ——>" + listUrl)

WWW www = new WWW(listUrl)

yield return www

if(www.error != null)

{

OnUpdateFaild(string.Empty)

yield break

}

}

登录后复制

五、代码热更新

5.1 修改配置

LuaFramework框架默认配置是从本地加载文件。需要打开AppConst.cs文件,

将UpdateMode设置为true,启用更新模式

将LuaBundleMode设置为true,启用热更新模式

修改WebUrl下的路径为对应服务器地址

5.2 配置"网络资源"

打开服务器,将工程项目中StreamingAssets里的所有内容复制到服务器上(必要时配置权限,让所有文件可下载)

5.3 测试热更新

修改Lua脚本(如将HelloLua改为LuaLuaLua)

点击Build Windows Resource

将"工程目录/StreamingAseets"里面的所有文件复制到服务器上。

再修改Lua脚本内容,覆盖本地资源。运行游戏,程序中出现"LuaLuaLua From Server"即证明网上拉去文件成功。

5.4 打包代码资源

File ->Build Setting ->PlayerSetting 更改相关描述

Build并上传至 服务器的Release目录下

5.5 上传代码资源

LuaFramework ->Build Windows Resource 更新Lua

将资源中新生成的StreamingAssets上传至 服务器Web目录下

5.6 其他Lua *** 作

Main.Lua

--主入口函数。 从此处开始Lua逻辑

local GameObject = UnityEngine.GameObject

function Main()

print("Logic Start")

local go = GameObject("test") --创建对象

go.transfrom.position = Vector3.one --设置坐标为(1,1,1)

end

登录后复制

Lua中使用.是极消耗性能,不提倡。如local go = UnityEngine.GameObject("Test"),应选择提前声明准备,如local GameObject = UnityEngine.GameObject,后续调用如local go = GameObject("Test")来降低性能消耗。

六、资源热更新

6.1 准备框架

参数设置:

设置AppConst.cs中ExampleMode为false(案例Lua,对正式打包无用)

设置AppConst.cs中LuaBundleMode为true(解决资源管理器中出现Lua文件,将其打包成Unity3D文件)

流程:

创建GameObject对象命名为"GameManager"(命名有严格要求,若更改须变更代码内容)

在GameManager游戏对象上添加(挂载)Main.cs脚本

在GameManager游戏对象上添加(挂载)Console.cs脚本(非LuaFramework内脚本,可忽略)

运行-检查有无报错

6.2 添加模型资源

向场景中添加若干模型资源。对必要 *** 作模型创建Prefab预制体,放置对应资源文件夹内。

在LuaFramework框架下,Packager.cs内第77行添加如下代码:

//添加自定义资源

//AddBuildMap为脚本内提供方法 参数分别为 生成的Assetbundle文件名称 、 打包文件类型 、 文件目录

AddBuildMap("Tank" + AppConst.ExtName, "*.prefab", "Assets/Tanks/Prefabs")

登录后复制

6.3 打包模型资源

File ->Build Setting ->PlayerSetting 更改相关描述

Build并上传至 服务器的Release目录下

6.4 检查(可忽略)

--主入口函数。 从此处开始Lua逻辑

local GameObject = UnityEngine.GameObject

function Main()

print("Logic Start")

local luaHelper = LuaFramework.LuaHelper

local resMgr = luaHelper.GetResManager()

--参数 Assetbundle名字 资源名字 加载方法

resMger:LoadPrefab("Tank", {"TankPrefab"},OnLoaded) --LoadPrefab是实例方法,故使用 :

end

function OnLoaded(objs)

print("OnLoaded " .. type(objs))

end

6.5 上传模型资源

LuaFramework ->Build Windows Resource 更新Lua

将资源中新生成的StreamingAssets上传至 服务器Web目录下


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12264937.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存