有哪些可以做兼职的翻译网站吗/整站seo排名要多少钱

有哪些可以做兼职的翻译网站吗,整站seo排名要多少钱,手机编程软件中文版免费,网站建设公司网址大家好,我是阿赵。   阿赵我做手机游戏已经有十几年时间了。记得刚开始从做页游的公司转到去做手游的公司,在面试的时候很重要的一个点,就是会不会用Lua。使用Lua的原因很简单,就是为了热更新。   热更新游戏内容很重要。如果…

  大家好,我是阿赵。
  阿赵我做手机游戏已经有十几年时间了。记得刚开始从做页游的公司转到去做手游的公司,在面试的时候很重要的一个点,就是会不会用Lua。使用Lua的原因很简单,就是为了热更新。
  热更新游戏内容很重要。如果游戏内容需要改动,如果每次都要去平台出新的安装包提审,周期不可控,甚至像iOS这种提审特别麻烦的平台,还有不过审的风险。比如出个春节活动,提审完可能春节都过完了,那么这个内容也就没有意义。 但如果游戏的内容自己可以通过某些方法进行修改,不需要通过平台的审核就能直接改动,那么游戏制作的灵活性就大大增加了。我们使用Unity引擎来开发游戏,游戏资源是可以通过AssetBundle的方式热更新的,但C#代码,以前是不能热更新的,至少在iOS平台是不能的,安卓和pc有办法可以热更新dll。
  Lua作为一个可以通过字符串或者字节资源的形式加载的脚本,在游戏热更新上起到了重要的作用,起码在近十年时间是出于统治地位的。但由于性能问题Lua也一直受到各种诟病,特别是在微信小游戏或者抖音小游戏上面,性能的确不是很好。
  最近和UWA沟通的过程中,听说很多公司已经不用Lua,而改为用了HybridCLR(华佗)热更新。华佗热更新的原理是更新c#的程序集,也就是通过加载dll来实现代码层面的热更新,而且iOS也能用。不过由于公司的项目都是在用Lua开发的,如果换成华佗,等于整个项目要重新用C#写一篇,成本还是很高的。
  学多一点东西肯定是有好处的,说不定以后新项目就能用得上。于是阿赵我也来学习一下华佗热更新的用法,并且记录一下一些使用的问题。

一、 安装

HybridCLR华佗热更新的在线文档地址是:
文档地址
  里面有比较详细的安装说明,可以根据步骤一步步来安装。我只记录一下我遇到的问题。

1、 对应的Unity版本

  在官方文档里面说,华佗支持的Unity版本有这些:
在这里插入图片描述

  由于我有一个项目是使用2019.4.24开发的,一看文档说支持2019.4.x,感觉挺好,但继续看下去,会看到:
在这里插入图片描述

  从文档看,2019只能在2019.4.40上面安装。其实2019.4前面的版本的确挺多问题的,比如我之前发现的URP的SRPBatcher合并问题等,各位如果还在用2019版本开发的朋友,我也挺建议大家都升级到2019.4.40。无奈的是,如果项目已经上线了,再来换版本,可能会导致AssetBundle打包的资源会全部变更,Unity打包AssetBundle的时候会把版本号写在文件开头,所以就算你所有内容都没变,只是换个Unity版本,打出来的AssetBundle文件也会全部改变的……
  不过幸好,华佗的文档里面也有针对这种情况的处理办法,就是先把项目切换到2019.4.40,然后安装华佗,再切换会原来的版本。
在这里插入图片描述

  抛开项目已有版本的问题,其实就无所谓了,因为之后的版本很多都支持, 比如直接安装2022.3.x版本,就没这个问题了。

2、下载代码

  由于代码库是从git下载,所以必须安装git。
  然后通过Unity的PackageManager里面的Add package from git URL来安装
库地址:
https://gitee.com/focus-creative-games/hybridclr_unity.git

https://github.com/focus-creative-games/hybridclr_unity.git

  我自己尝试的结果是没办法通过Add package from git URL来安装,安装了GIT和加了环境变量PATH也不行。我自己用GIT手动克隆,却是没问题的,这一点很神奇。
  于是解决这个问题的方法是,可以手动把地址检出克隆到本地,然后把文件夹改名com.code-philosophy.hybridclr,并复制到项目里面和Assets文件夹同级的Packages文件夹
在这里插入图片描述

  复制后打开项目,会看到有华佗的菜单
在这里插入图片描述

  选择安装器,然后安装
在这里插入图片描述

  按照文档说明基本都可以自动安装成功,但我还是失败了,看报错还是GIT的问题,于是我根据报错,自己检出克隆https://gitee.com/focus-creative-games/hybridclr到项目的HybridCLRData/hybridclr_repo文件夹
在这里插入图片描述

  检出后再次点击Install按钮,就可以安装成功了。
在这里插入图片描述

  HybridCLR菜单下出现了所有的选项子菜单。

二、 浅尝华佗热更新

1、 一些概念

  在使用华佗热更新之前需要先了解一些概念

1. 程序集

  先来操作,最后再说为什么。在项目里面创建一个文件夹,叫做HotUpdate,或者叫其他都行,你自己喜欢:
在这里插入图片描述

  然后在这个文件夹里面,创建一个Assembly Definition文件:
在这里插入图片描述

  帮这个文件起个名字,比如我这里就叫做HotUpdate:
在这里插入图片描述

  注意要把Auto Referenced的勾选去掉。
  然后在这个文件夹里面创建一个C#脚本,我这里随便命名为Hello:
在这里插入图片描述

  创建完之后,点选这个Hello脚本,会看到里面多了一个Assembly信息,里面说明了,这个Hello的脚本,是属于HotUpdate.dll的。
在这里插入图片描述

  操作到此结束,下面解释一下:
  这个创建文件夹和Assembly Definition文件的过程,是Unity引擎的程序集功能,其实就是指定了某个文件夹作为一个程序集的范围。只要在这个文件夹下面的所有文件,包括子文件夹里面的文件,都属于当前这个Assembly Definition文件的程序集里面的内容。
  一个程序集,字面意思就是程序的集合了,可以理解成是把里面的代码都打包了,之后需要热更新代码,其实就是热更新这个程序集的dll文件了。

2. AOT程序集和热更新程序集

  使用Unity引擎制作游戏,各位肯定应该都会写C#。在项目里面所写的C#代码,就算我们不特意的打程序集,它们也会出现在一个程序集里面,就是Assembly-CSharp.dll,然后我们又可以根据自己的需要,创建一些程序集,所以最后打包的时候,除了Assembly-CSharp.dll,还会有一些自己的dll。这些多个程序集,之后会用于华佗热更新。
  这里有个问题,热更新是以dll为单位的,那些可以热更新的程序集,在使用华佗热更新的时候,是会剥离出去,不会包含在主工程包里面的。而我们需要写代码加载这些dll文件,就必须有一些代码是包含在主工程里面不能热更新的。
  所以在使用华佗热更新的时候,需要把程序集分成2部分,第一部分是包含在游戏主包里面不能热更新的,成为AOT程序集,第二部分是可以热更新的dll,成为热更新程序集。

3. 程序集的规划和程序集之间的引用关系

  由于程序集起码要有AOT和可热更两个,甚至更多,所以在做之前,我们必须先规划一下它们之间的关系。具体来说,就是总共需要多少个程序集才能满足我们需要,既能热更,又可以划分清楚模块,做到分块更新。
  程序集之间的引用,有2种方式,第一种,就是在程序集上面勾上Auto Referenced,这样它自动被其他程序集引用,可以互相调用里面的方法。
  另外一种,就是在程序集上面指定依赖关系,比如我再建一个HotUpdate2的程序集,不勾选Auto Referenced:
在这里插入图片描述

  这个时候如果HotUpdate程序集要访问HotUpdate2程序集,可以选择HotUpdate程序集,然后添加引用关系:
在这里插入图片描述

  只要在HotUpdate程序集的Assembly Definition References里面添加了HotUpdate2的引用,那么HotUpdate就能调用HotUpdate2里面的方法了。
  华佗热更新里面有一个规则,AOT程序集是不能直接引用热更新程序集的,不然在打包的时候会出错。所以,我们在创建自己的可热更程序集的时候,必须把Auto Referenced的勾选去掉,然后自己维护可热更新程序集之间的引用关系。

2、 尝试使用华佗热更新

1. 指定需要热更新的程序集

  在HybridCLR菜单下面选择Settings设置:
在这里插入图片描述

  然后添加可热更新的程序集:
在这里插入图片描述

  在这里设置了的程序集,在打主包的时候,程序集是不会包含在主包里面的。

2. 生成必须的东西

在这里插入图片描述

  在首次使用华佗热更新的时候,必须先选择Generate——All,生成所有必须的文件,其实就是All上面的哪些东西了。在之后的使用中,就不一定要生成All,可以根据实际需要来生成上面的内容。

3. 写热更新的测试代码

  首先,为了打包之后看到控制台的打印,先创建一个脚本:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class ConsoleToScreen : MonoBehaviour
{const int maxLines = 50;const int maxLineLength = 120;private string _logStr = "";private readonly List<string> _lines = new List<string>();public int fontSize = 15;void OnEnable() { Application.logMessageReceived += Log; }void OnDisable() { Application.logMessageReceived -= Log; }public void Log(string logString, string stackTrace, LogType type){foreach (var line in logString.Split('\n')){if (line.Length <= maxLineLength){_lines.Add(line);continue;}var lineCount = line.Length / maxLineLength + 1;for (int i = 0; i < lineCount; i++){if ((i + 1) * maxLineLength <= line.Length){_lines.Add(line.Substring(i * maxLineLength, maxLineLength));}else{_lines.Add(line.Substring(i * maxLineLength, line.Length - i * maxLineLength));}}}if (_lines.Count > maxLines){_lines.RemoveRange(0, _lines.Count - maxLines);}_logStr = string.Join("\n", _lines);}void OnGUI(){GUI.matrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity,new Vector3(Screen.width / 1200.0f, Screen.height / 800.0f, 1.0f));GUI.Label(new Rect(10, 10, 800, 370), _logStr, new GUIStyle() { fontSize = Math.Max(10, fontSize) });}
}

  在场景上面建个空物体,然后把脚本拖上去:
在这里插入图片描述

  这样做的目的只是为了让我们在接下来的测试中,把控制台打印输出到屏幕,让我们知道热更新有没有生效。
  然后给Hello脚本修改一下:

using UnityEngine;public class Hello 
{static public void Print(){Debug.Log("Hello World");}
}

  这里只有一个静态方法,如果执行了,会打印Hello World到控制台,通过上面的脚本,控制台的打印就会出现在屏幕。
  最后,要加一个AOT脚本,作为游戏启动、加载dll和调用dll。正常来说热更新的dll文件应该放在CDN上,然后下载到本地。这里为了测试,就写死放在StreamingAssets文件夹了。这里建一个叫做TestLoadDll的C#脚本:

using System;
using System.IO;
using System.Linq;
using System.Reflection;
using UnityEngine;public class TestLoadDll : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){Assembly dllLoader;
#if !UNITY_EDITORdllLoader = Assembly.Load(File.ReadAllBytes($"{Application.streamingAssetsPath}/HotUpdate.dll.bytes"));
#elsedllLoader = System.AppDomain.CurrentDomain.GetAssemblies().First(a => a.GetName().Name == "HotUpdate");        
#endifType type = dllLoader.GetType("Hello");type.GetMethod("Print").Invoke(null, null);}// Update is called once per framevoid Update(){}
}

  然后在场景里面建一个空物体,把脚本拖上去:
在这里插入图片描述

  这时候在编辑器里面运行,会看到Hello World打印出来了:
在这里插入图片描述

  脚本里面的内容很简单,只是规定了在编辑器就直接读取工程里面的HotUpdate程序集,在非编辑器的情况下,就读取StreamingAssets文件夹下面的HotUpdate.dll.bytes文件。由于Unity的诡异规定,所以dll文件是不能直接读取的,要把后缀改成bytes。
  然后后面的那段反射代码

Type type = dllLoader.GetType("Hello");
type.GetMethod("Print").Invoke(null, null);

  不用害怕,这是因为AOT程序集不能直接引用可热更新的HotUpdate程序集,所以才用反射调用一下,仅此而已,如果没有特殊情况,是不需要这样做的。

4. 打包热更新用的dll

  在HybridCLR菜单选择CompileDll——ActiveBuildTarget
在这里插入图片描述

  这时候会把对dll进行打包,打包的结果在
  项目文件夹\HybridCLRData\HotUpdateDlls\对应的平台文件夹\:
在这里插入图片描述

  由于我现在的平台是Windows,所以实际路径会在StandaloneWindows64文件夹下。这里会看到了项目里面所用到的所有程序集的dll文件,其中就有我们想要热更新的HotUpdate.dll。我们刚才也指定了HotUpdate2程序集,但由于里面一个脚本都没有,所以是不会有dll打出来的。
在这里插入图片描述

  把HotUpdate.dll复制到StreamingAssets文件夹并重命名为HotUpdate.dll.bytes

5. 打包测试

  选择一个文件夹,常规的打个PC包出来:
在这里插入图片描述

在这里插入图片描述

  发现打不出来,因为刚才指定了HotUpdate2程序集,但现在这个程序集是没有内容的
在这里插入图片描述

  去华佗设置里面把HotUpdate2程序集从可热更新的程序集里面去掉。这次就能正常打包了。
在这里插入图片描述

  运行打出来的包,能看到HelloWorld,证明打包成功,从刚才的读取dll的代码我们可以知道,现在是读取了StreamingAssets里面的HotUpdate.dll.bytes作为代码执行的。

6. 验证热更新修改代码

  回到Hello脚本,修改一下:

using UnityEngine;public class Hello 
{static public void Print(){Debug.Log("Hello Azhao");}
}

  把原来的Hello World改成Hello Azhao
  然后再次HybridCLR菜单选择CompileDll——ActiveBuildTarget,打包dll
在这里插入图片描述

  再次在HybridCLRData\HotUpdateDlls\StandaloneWindows64目录找到HotUpdate.dll文件,然后拷贝到之前打的PC包的StreamingAssets文件夹:
在这里插入图片描述

  这时候再次运行之前的PC包
在这里插入图片描述

  可以看到,现在PC包显示的内容已经变成了Hello Azhao。到此为止,华佗热更新的基本流程已经跑通了。

三、 华佗热更新的深入使用

1、 尝试AssetBundle加载资源

  接下来,尝试把C#脚本挂在GameObject上,并通过AssetBundle加载这个GameObject看看:
  在HotUpdate程序集建一个PrintObject的C#脚本:
在这里插入图片描述

using UnityEngine;public class PrintObject : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){Debug.Log("GameObject:" + gameObject.name);}// Update is called once per framevoid Update(){}
}

  然后建一个cube,把脚本挂上去:
在这里插入图片描述

  把这个Cube做成Prefab,并且设置AssetBundleName,打包AssetBundle:
在这里插入图片描述

  然后打包AssetBundle,把AssetBundle文件放到StreamingAssets文件夹:
在这里插入图片描述

  修改Hello脚本:

using UnityEngine;public class Hello 
{static public void Print(){string path = Application.streamingAssetsPath + "/ab/cube.unity3d";AssetBundle ab = AssetBundle.LoadFromFile(path);if(ab){Object obj = ab.LoadAsset("Cube");if(obj != null){GameObject.Instantiate(obj);}            }}
}

  生成dll,并且和AssetBundle一起拷贝到pc包的StreamingAssets文件夹:
在这里插入图片描述

  这时候,运行PC包,并没有出现我们想要的情况,而是有个报错:
在这里插入图片描述

  这是为什么呢?

2、关于代码裁剪

  如果在打包的时候没有用到某些Unity自带的API,但后期在热更新的代码上加上,就会出现报错,找不到方法。原因是IL2CPP的情况下,代码裁剪是不能被禁止的,而之前没有用过的API,在Unity打包的时候被裁剪掉了。
在这里插入图片描述

  一般来说,为了防止需要的Unity原生API代码被裁剪的问题,可以在项目里面建一个link.xml文件,然后把需要保留不被裁剪的内容填进去。不过这样手动收集是很麻烦的,华佗的工具里面自带了收集link.xml的功能
在这里插入图片描述

  只要点一下,就会把项目里面有调用过的API加入到link.xml里面。
这里还有2个问题
1、 需要保留的代码,除了加在link.xml之外,代码还要必须显式的引用过这些类或者函数,不然也还是会被裁剪。
2、 重新收集完link.xml之后,必须重新打包才能生效……
  这样似乎就回到了使用Lua时的导出接口的操作了,没有导出过接口的类和方法,不能热更新……关键这一步你在编辑器内还很难发现,毕竟编辑器内的Unity自带API是不会被裁剪的。
  这是一个我认为使用华佗热更新最大的问题。毕竟Unity很多API可能在一开始的时候没考虑到需要使用,后面用到才收集,就不能热更新了。
  既然是需要重新出包了,所以也就不止是点一下LinkXml了,直接Generate——All,生成所有,那样就稳妥了。
  全部重新生成之后,再次出包,就可以看到之前的报错没有了,可以加载AssetBundle里面的Cube,并且挂在上面的脚本也正常运行了:
在这里插入图片描述

3、 新增程序集的热更新

  之前的例子里面只有1个可热更新的程序集,叫做HotUpdate,现在我想在不重新出包的情况下,增加一个HotUpdate2的可热更新程序集,试试能不能热更新。
  由于之前是在AOT代码里面写死了需要加载HotUpdate.dll.bytes,所以如果增加新的程序集dll文件,肯定是不能加载的,所以要改成需要加载哪些dll文件要通过可热更的文件来决定。
  这里为了测试简单,我放一个dll.txt文本在StreamingAssets文件夹,然后在里面用逗号分隔需要加载的程序集名字。由于HotUpdate.dll需要通过反射来调用,所以我就不写在txt里面了,这也说明,如果需要有一个程序调用入口,那么至少有一个dll是需要写在代码里面加载的。于是加载dll的代码会变成这样:

using System;
using System.IO;
using System.Linq;
using System.Reflection;
using UnityEngine;public class TestLoadDll : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){Assembly dllLoader;
#if !UNITY_EDITORstring path = Application.streamingAssetsPath + "/dll.txt";string content = File.ReadAllText(path);if(string.IsNullOrEmpty(content)==false) {string[] fileNames = content.Trim().Split(",");for(int i = 0;i < fileNames.Length; i++) { string fileName = fileNames[i];if(string.IsNullOrEmpty(fileName)==false){Assembly.Load(File.ReadAllBytes($"{Application.streamingAssetsPath}/"+fileName+".dll.bytes"));}}}dllLoader = Assembly.Load(File.ReadAllBytes($"{Application.streamingAssetsPath}/HotUpdate.dll.bytes"));
#elsedllLoader = System.AppDomain.CurrentDomain.GetAssemblies().First(a => a.GetName().Name == "HotUpdate");        
#endifType type = dllLoader.GetType("Hello");type.GetMethod("Print").Invoke(null, null);}// Update is called once per framevoid Update(){}
}

  到现在为止,先打个PC包,作为热更新的基础包。
  接下来同样的手法,建立HotUpdate2文件夹和程序集,在里面添加一个PrintGameObject的脚本:
在这里插入图片描述

using UnityEngine;public class PrintGameObject : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){Debug.Log("HotUpdate2:" + gameObject.name);}// Update is called once per framevoid Update(){}static public void Run(){Debug.Log("This is HotUpdate2");}
}

  把这个PrintGameObject脚本挂在之前的Cube预设上,原来的PrintObject脚本就不挂了:
在这里插入图片描述

  在HotUpdate程序集添加HotUpdate2程序集的引用:
在这里插入图片描述

  修改Hello脚本:

using UnityEngine;public class Hello 
{static public void Print(){PrintGameObject.Run();string path = Application.streamingAssetsPath + "/ab/cube.unity3d";AssetBundle ab = AssetBundle.LoadFromFile(path);if(ab){Object obj = ab.LoadAsset("Cube");if(obj != null){GameObject.Instantiate(obj);}            }}
}

  主要是加了一句PrintGameObject.Run();
  接下来还是常规操作,把HotUpdate2加到可热更新的列表
在这里插入图片描述

  在dll.txt里面写入HotUpdate2。然后打包AssetBundle、打包Dll,把这些东西都拷贝到PC包的StreamingAssets,然后运行,会看到:
在这里插入图片描述

  发现一个神奇的事情,HotUpdate2的代码其实已经加载了,PrintGameObject里面的Run方法都打印出来This is HotUpdate2了,但挂在Cube上的PrintGameObject脚本却找不到……
  接下来改一下做法,把Cube上面的PrintGameObject脚本去掉,变成在实例化GameObject之后用AddComponent来添加脚本:

using UnityEngine;public class Hello 
{static public void Print(){PrintGameObject.Run();string path = Application.streamingAssetsPath + "/ab/cube.unity3d";AssetBundle ab = AssetBundle.LoadFromFile(path);if(ab){Object obj = ab.LoadAsset("Cube");if(obj != null){GameObject go = (GameObject)GameObject.Instantiate(obj);go.AddComponent<PrintGameObject>();}            }}
}

  再次打包AssetBundle,打包dll,拷贝到PC包的StreamingAssets文件夹,运行PC包:
在这里插入图片描述

  会看到,添加成功了,PrintGameObject脚本也运行成功了。
  关于新增的程序集挂到GameObject的AssetBundle热更的问题,我到最后都没有解决,不知道是不是有解决办法。我只能暂时得出结论,如果新增程序集,纯代码调用时没问题的,但如果挂在GameObject上通过AssetBundle加载,就会有问题。
  这就导致一个问题,我们如果想出了安装包之后可以长时间的热更新,不需要重新出包,就必须对可能用到的程序集做好规划,尽量不要去改变了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/897317.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek R1-7B 医疗大模型微调实战全流程分析(全码版)

DeepSeek R1-7B 医疗大模型微调实战全流程指南 目录 环境配置与硬件优化医疗数据工程微调策略详解训练监控与评估模型部署与安全持续优化与迭代多模态扩展伦理与合规体系故障排除与调试行业应用案例进阶调优技巧版本管理与迭代法律风险规避成本控制方案文档与知识传承1. 环境配…

“此电脑”中删除WPS云盘方法(百度网盘通用)

&#x1f4e3;此方法适用于卸载WPS云盘后&#xff0c;WPS云盘图标依然在此电脑中显示的问题。 原理&#xff1a;通过注册来进行删除 步骤&#xff1a; WIN键R,打开运行窗口&#xff0c;输入regedit命令&#xff0c;来打开【注册表编辑器】&#xff1b; 从左侧&#xff0c;依…

HTML-网页介绍

一、网页 1.什么是网页&#xff1a; 网站是指在因特网上根据一定的规则&#xff0c;使用 HTML 等制作的用于展示特定内容相关的网页集合。 网页是网站中的一“页”&#xff0c;通常是 HTML 格式的文件&#xff0c;它要通过浏览器来阅读。 网页是构成网站的基本元素&#xf…

MongoDB(一) - MongoDB安装教程(Windows + Linux)

文章目录 前言一、Windows安装单机MongoDB1. 下载并解压MongoDB安装包1.1 下载1.2 解压1.3 相关文件介绍 2. 配置2.1 配置环境变量2.1.1 打开系统属性设置2.1.2 编辑 PATH 环境变量2.1.3 验证环境变量是否配置成功 2.2 创建相关目录和文件2.3 修改MongoDB配置文件 mongodb.conf…

【算法学习之路】5.贪心算法

贪心算法 前言一.什么是贪心算法二.例题1.合并果子2.跳跳&#xff01;3. 老鼠和奶酪 前言 我会将一些常用的算法以及对应的题单给写完&#xff0c;形成一套完整的算法体系&#xff0c;以及大量的各个难度的题目&#xff0c;目前算法也写了几篇&#xff0c;题单正在更新&#xf…

C语言_数据结构总结5:顺序栈

纯C语言代码&#xff0c;不涉及C 想了解链式栈的实现&#xff0c;欢迎查看这篇文章&#xff1a;C语言_数据结构总结6&#xff1a;链式栈-CSDN博客 这里分享插入一下个人觉得很有用的习惯&#xff1a; 1. 就是遇到代码哪里不理解的&#xff0c;你就问豆包&#xff0c;C知道&a…

AI数字人| Fay开源项目、UE5数字人、本地大模型

数字人实践教程 本教程主要是讲如何在本地UE部署Fay数字人的开源框架。 最终效果可以与人进行自然语言的对话&#xff0c;花了大概10个h的时间到&#xff0c;踩了很多坑&#xff0c;同样想实现的朋友可以作为参考 参考文档&#xff1a;Fay 数字人开源框架 - 飞书云文档 官方的教…

网络版汉译英服务(muduo)

文章目录 网络版汉译英服务&#xff08;muduo&#xff09;muduo库muduo 库是什么muduo 库常见接口介绍muduo::net::EventLoopmuduo::net::TcpConnectionmuduo::net::TcpServermuduo::net::TcpClientmuduo::net::Buffer 汉译英服务服务端客户端 网络版汉译英服务&#xff08;mud…

在ArcMap中通过Python编写自定义工具(Python Toolbox)实现点转线工具

文章目录 一、需求二、实现过程2.1、创建Python工具箱&#xff08;.pyt&#xff09;2.2、使用catalog测试代码2.3、在ArcMap中使用工具 三、测试 一、需求 通过插件的形式将点转线功能嵌入ArcMap界面&#xff0c;如何从零开始创建一个插件&#xff0c;包括按钮的添加、工具的实…

C++之序列容器(vector,list,dueqe)

1.大体对比 在软件开发的漫长历程中&#xff0c;数据结构与算法始终占据着核心地位&#xff0c;犹如大厦的基石&#xff0c;稳固支撑着整个程序的运行。在众多编程语言中&#xff0c;数据的存储与管理方式各有千秋&#xff0c;而 C 凭借其丰富且强大的工具集脱颖而出&#xff…

Vercel Serverless

1. 引言 现代应用程序是为适应当前技术环境需求而设计的软件&#xff0c;采用现代开发工具和实践&#xff0c;针对云部署和可扩展性优化。它们由多个模块化小组件组成&#xff0c;便于集成和缩放&#xff0c;具有高度的敏捷性和适应性&#xff0c;能快速响应用户或业务需求变化…

字节码是由什么组成的?

Java字节码是Java程序编译后的中间产物&#xff0c;它是一种二进制格式的代码&#xff0c;可以在Java虚拟机&#xff08;JVM&#xff09;上运行。理解字节码的组成有助于我们更好地理解Java程序的运行机制。 1. Java字节码是什么&#xff1f; 定义 Java字节码是Java源代码经过…

function uuid_generate_v4()不存在(二)

说明&#xff1a;之前代码里用到了postgresql内嵌函数uid_generate_v4()生成记录的主键&#xff0c;提示该函数不存在&#xff0c;写了下面这篇博客记录了一下&#xff0c;今天又发现了新的问题&#xff0c;于是补充了这篇博客。 function uuid_generate_v4()不存在&#xff0…

HPC超算系列2——新手指南1

一&#xff0c;平台简介&#xff1a; 主要是官方手册指南、B站视频&#xff08;培训视频、软件视频&#xff09; 1&#xff0c;超算平台架构&#xff1a; 和普通的家用电脑的架构不同&#xff0c; 主要区别在于&#xff1a;层次化的结构 &#xff08;1&#xff09;超算是有…

【Java开发指南 | 第三十五篇】Maven + Tomcat Web应用程序搭建

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 前言Maven Tomcat Web应用程序搭建1、使用Maven构建新项目2、单击项目&#xff0c;连续按两次shift键&#xff0c;输入"添加"&#xff0c;选择"添加框架支持"3、选择Java Web程序4、点击&…

JAVA编程【jvm垃圾回收的差异】

jvm垃圾回收的差异 JVM&#xff08;Java Virtual Machine&#xff09;的垃圾回收&#xff08;GC&#xff09;机制是自动管理内存的一种方式&#xff0c;能够帮助开发者释放不再使用的内存&#xff0c;避免内存泄漏和溢出等问题。不同的垃圾回收器&#xff08;GC&#xff09;有…

亲测解决笔记本触摸板使用不了Touchpad not working

这个问题可以通过FnFxx来解决&#xff0c;笔记本键盘上Fxx会有一个触摸板图标。如果不行应该玉藻设置中关了&#xff0c;打开即可。 解决办法 在蓝牙&#xff0c;触摸板里打开即可。 Turn it on in settings。

数据结构篇——串(String)

一、引入 在计算机中的处理的数据内容大致可分为以整形、浮点型等的数值处理和字符、字符串等的非数值处理。 今天我们主要学习的就是字符串数据。本章主要围绕“串的定义、串的类型、串的结构及其运算”来进行串介绍与学习。 二、串的定义 2.1、串的基本定义 串&#xff08;s…

【智能体架构:Agent】LangChain智能体类型ReAct、Self-ASK的区别

1. 什么是智能体 将大语言模型作为一个推理引擎。给定一个任务&#xff0c; 智能体自动生成完成任务所需步骤&#xff0c; 执行相应动作&#xff08;例如选择并调用工具&#xff09;&#xff0c; 直到任务完成。 2. 先定义工具&#xff1a;Tools 可以是一个函数或三方 API也…

OmniParser技术分析(一)

1.引言 通过上篇文章介绍 OmniParser:下一代纯视觉UI自动化测试先驱相信大家已经对OmniParser有初步了解&#xff0c;接下来详细介绍下OmniParser使用了哪些技术模型实现了对UI纯视觉的检测和理解。 2.整体方案 通过阅读OmniParser提供的运行Demo代码知道&#xff0c;其实整…