Unity2022接入Google广告与支付SDK、导出工程到Android Studio使用JDK17进行打包完整流程与过程中的相关错误及处理经验总结
注:因为本人也是第一次接入广告与支付SDK相关的操作,网上也查了很多教程,很多也都是只言片语或者缺少一些关键步骤的说明,导致本人也是花了很多时间与精力踩了很多的坑才搞定,发出来也是希望能帮助到其他人在遇到相似问题的时候能少踩坑少熬夜少加班,至少能提供一个解决问题的思路,理论上该经验可适用于任意版本的SDK接入,总归思路都是差不多的,文章内容可能会不定期修改,如果存在不准确或理解错误的地方,可评论区通知我进行修改
注意翻墙问题,毕竟国内对于国外的网站很多是没办法进行访问的。
文章中所使用的各软件及插件版本说明(可能存在遗留的地方,可能后期修改补档吧,大部分通用没问题大概率不会改了)
Unity:2022.3.15
Unity所使用的 Google SDK:9.0.0(一开始使用的8.5版本,结果刚好弄完的时候该版本弃用了,只能换成了9.0.0,但9.0中所使用的SDK版本是23版本的,23版本需要JDK17与Gradle8.0才能编译,所以只能导出到Android Studio进行编译)
Google Play 支付采用的是接入原生支付进行操作的,版本为6.0,文章中主要包含一些经验总结,因为思路总体也是参考了其他人的文章
1、广告SDK接入
Google SDK获取地址:Google 广告 SDK Mobile Ads SDK (Unity)
需要关注的点:
1、广告SDK弃用时间,相关链接:弃用和停用 | Unity | Google for Developers ,注意其中的版本信息对应的是Android原生SDK的版本信息,新手注意别搞混了,Unity所使用的插件中的版本信息需要从Github中对应版本的日志中进行查看
2、Android Gradle插件可使用的Gradle版本,相关链接:Android Gradle 插件 8.7 版本说明 | Android Studio | Android Developers,注意让看这个主要是为了后边使用Android Studio进行编译的时候,知道该用那个版本进行编译
3、广告SDK接入流程并不复杂,心平气和看完操作步骤就可以搞定,别像我一样的因为加班太多太过浮躁导致简单的问题复杂化,所以具体接入步骤不做详细说明,根据SDK获取的界面中按照官方的步骤进行接入即可,需注意的关注的是,SDK所使用的JDK版本、Gradle版本是否与当前Unity版本是否兼容,例如本人使用的是Unity2022.3.15+广告SDK的9.0版本,而Unity2022没有办法更换使用JDK17(至少我没找到办法),所以需要导出到Android Studio进行打包操作
4、打包时google Setting中的应用id一定要填写,不填写的话,就算打包成功了,进行安装后同样也会因为ID未找到从而无法成功运行应用
5、接入的SDK版本较低时,SDK被弃用后,可以在安卓日志中看到Google的通知,广告不会正常播放,效果就是点击后没有任何效果
6、成功接入广告并打包后,正常情况下就可以看到广告的内容
7、播放广告后的奖励回调函数,记得一定使用协程进行操作,也就说传入的回调函数可以是普通函数,但关于传入的回调函数的最终执行时一定使用一个协程去运行, 因为直接进行调用,会导致应用直接就给闪退了
关于广告的部分就先到这里,因为广告的接入不难,难点都在打包的过程中了
2、原生支付SDK接入
接入原生支付后(也就是加入jar包后),需要打包后才能看到效果在编辑器中是没有办法看到效果的
先说明一下思路来源相关链接:
Unity接入GooglePlay内购V4 V5 V6(源生Android方式)_unity接入google内购-CSDN博客
后台UnityPlayer.UnitySendMessage不生效(Android) | 梓喵出没
第一个链接为参考原生支付接入的方法,而第二个则是对UnityPlayer.UnitySendMessage调用一次后再次进行调用时,没有任何反应的处理,至于为什么没有反应,简单来说就是被sendMessage调用的函数代码所在的activity需要保持在前台,一旦被切换为其他activity后,再次调用代码就没有什么效果了,我解释的可能太过笼统或者不正确,详细的解释请自行百度吧,或者遇到了的时候自然就懂了,所以这里推荐对于Unity内部方法的调用采用第二个链接中的方法,直接一劳永逸,即编写一个C#脚本继承AndroidJavaProxy类,用于实现Java代码中的接口,在初始化java对象时,new一个实现了Java接口函数的类同时传递给java对象,并保存一下对对象的引用,然后呢,直接把收到的对象当成一个接口使用就好了例如下边实现
C#代码:
代码只有部分啊,别全抄了,只是做参考,因为该代码也只是对第一个链接中的代码修改后得到的
public class IAPMessage : AndroidJavaProxy{public IAPMessage() : base("com.XXX.unitytogoolgleplaylib.IAPMessage"){}#region callback from Objective-c/JAR//获取到产品列表回调public void RecieveProductInfos(string jsonData){if (string.IsNullOrEmpty(jsonData)) return;var infoData = JsonConvert.DeserializeObject<IAPProductInfoData>(jsonData);OnProductInfoReceived(infoData);}//产品列表请求失败public void ProductRequestFail(string message){OnProductInfoFail(message);}//购买成功回调public void ProductBuyComplete(string productId){OnProductBuyComplete(productId);}//购买失败回调public void ProductBuyFailed(string jsonData){var infoData = JsonConvert.DeserializeObject<BuyFailData>(jsonData);OnBuyProductFail(infoData.productId, infoData.error);}//获取商品回执回调public void ProvideContent(string msg) { }//购买取消回调public void ProductBuyCancled(string productId){OnBuyProductCancled(productId);}/// <summary>/// 恢复购买成功/// </summary>/// <param name="productId"></param>public void RestoreComplete(string productId){OnRestoreCompleted(productId);}public void ConnectTips(){Debug.LogWarning("Java Connect!");}public void ConnectTips1(string str){Debug.LogWarning($"Java Connect Test {str}!");}private void ClearCallback(){ProductBuyFailedCallback = null;ProductBuyCompleteCallback = null;ProductBuyCancledCallback = null;}#endregion//接收到产品信息void OnProductInfoReceived(IAPProductInfoData info){Debug.Log("[IAPMessage]Unity接收到商品信息:" + info.ToString());SDKGuanLiQi.SetInitShopState(true);}//接收到产品信息void OnProductInfoFail(string error){Debug.Log("[IAPMessage]Unity商品信息请求失败:" + error);SDKGuanLiQi.SetInitShopState(false);}//购买完成void OnProductBuyComplete(string productId){Debug.Log("[IAPMessage]购买完成" + productId);ProductBuyCompleteCallback?.Invoke();ClearCallback();}//购买失败void OnBuyProductFail(string productId, string error){Debug.Log(string.Format("[IAPMessage]购买失败:{0} 错误信息{1}", productId, error));ProductBuyFailedCallback?.Invoke();ClearCallback();}//购买取消void OnBuyProductCancled(string productId){Debug.Log("[IAPMessage]购买取消" + productId);ProductBuyCancledCallback?.Invoke();ClearCallback();}//恢复完成void OnRestoreCompleted(string productId){}}
Java代码:
package com.XXX.unitytogoolgleplaylib;// 与C#交互的接口
public interface IAPMessage
{//获取到产品列表回调public void RecieveProductInfos(String jsonData);//产品列表请求失败public void ProductRequestFail(String message);//购买成功回调public void ProductBuyComplete(String productId);//购买失败回调public void ProductBuyFailed(String jsonData);//获取商品回执回调public void ProvideContent(String msg);//购买取消回调public void ProductBuyCancled(String productId);/// <summary>/// 恢复购买成功/// </summary>/// <param name="productId"></param>public void RestoreComplete(String productId);
}
然后调用时赋值的方式参考图:
第一张图为Android Studio中的项目截图,第二张则是C#代码截图,演示一下的,没什么难度一试便会了,很简单
但需要注意的是接入的com.android.billingclient版本与JDK版本兼容性的问题,推荐接入6.0.1,因为本人接入的就是这个版本的,下面再附加上一张我的模块的build.gradle配置图
补档:第25行中的jar包实际上就是Unity的jar包,导入后可以通过import com.unity3d.player,直接使用UnityPlayer.UnitySendMessage方法,从而不用通过反射的方式去进行调用,该jar包的路径为:你的Unity安装路径\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes,
上方路径中的mono所在的位置中的il2cpp下相对于的位置也有一个jar包,这个jar包我没试过,有兴趣的可以试试。
注:因为考虑到兼容性的问题,所以对于插件的部分的指定的目标SDK我就设置为了32版本使用JDK进行构建,弄得太低了的话,担心在后期又要进行升级,就很麻烦,总之就是多一事不如少一事,总之具体设置为那个版本就看你的需求了
同时构建完成后jar包可在下图中的路径下边找到,就不用去解压aar包了,毕竟每次都去解压比较麻烦
这里补档说明一下, 因为是对支付模块的单独构建打包,在构建时可能会因为插件中所需要使用的其他插件的版本问题而导致构建失败,出现这些问题的时候,可以在下图中修改一下所使用的Gradle版本和其他模块的版本,修改为你构建时所需要的版本,同样的图中的内容仅作参考:
因为我使用的Android Studio版本是2024.2.1版本的,所以使用其他版本的配置方式可能存在一些细节上的不同
3、导出工程后再Android Studio中进行构建
这里是大头,因为这里边的坑才是最多的,导出的方法不做详细解释,只对使用Android Studio打开导出的项目包后的操作进行说明
1、修改Gradle版本
这里需要修改的为编译时使用的Gradle版本与Android Gradle 插件版本,修改编译时的Gradle版本路径如下图,直接修改配置文件中的版本号就好了,至于需要修改为那个版本,就需要查看Android Gradle插件版本所需要的版本了
修改Android Gradle插件版本,看下边截图了,也是直接修改版本号就行了:
修改Gradle方法(同时也是修改JDK、NDK的操作步骤之一)还有一个就是如下图,按照截图顺序操作修改为所需要的版本后应用一下就好了:
2、为build.gradle配置文件添加命名空间名称 namespace "com.XXX.XXX"
如下图,下图为unityLibary下的build.gradle配置文件添加命名空间,注意命名空间名称只能为namespace "com.unity3d.player",改成其他的都会出问题,然后记得删得NDK的配置路径,因为可能你所使用的插件所需的最低NDK版本比Unity所提供的NDK版本高,反正删了少一堆问题就对了,里边使用的JavaVersion版本也随手改一下,避免使用Android Studio修改Java 版本的时候,没有修改到的情况出现
删掉或者注释掉下图中框起来的部分可以加快打包的时间,之前百度优化包体时看到的其他的解释是,去掉再次进行il2cpp的编译过程还是什么的是,反正删掉了不影响编译结果,出现其他问题的话,再次加回来再次编译就行了
然后在其他的build.gradle文件中找到android {......}的内容块,并在android{.....}块中的第一行加入命名空间 namespace "这里修改为你的应用的包名",例如下图,包名可在下面第二张图中找到
3、修改JDK、NDK、Build Tools版本等
打开Project Structur窗口,操作步骤参考上方修改Gradle版本的第二个方法,然后根据下图中框选的部分,修改所需要的SDK、JDK、NDK、Build Tools等的版本后应用保存一下,如果没有所需要的版本的话,可以在File-》Settings打开Settings窗口后,看下边第二张图
没错就是这张图,注意如果要通过修改配置文件的方式配置修改Gradle版本版本的话,记得下图中的Distribution的配置就不要进行修改
然后SDK、NDK、Build Tools的安装看这张图,记得勾选右下角的show package details选项看到更多的内容
4、修改所有能找到的AndroidManifest.xml文件,注意是所有(主要是为了减小打包后的包体大小,不介意包体大小的可以不改)
在application后边加上android:extractNativeLibs="true"参考下图
如果已经存在android:extractNativeLibs配置并且为false,就修改为true,添加这段的具体原因则是为了启用压缩功能,详情自行百度,毕竟本人也不是做安卓开发的这段也只是搜索优化时偶然看到的
5、修改settings.gradle文件,如下图,非必要步骤
其实就是使用Unity原本的配置就好了,添加上这一步的主要原因是为了避免因为将maven仓库的源修改为使用国内镜像时,导致一些jar包下载搜索不到的问题,毕竟接入的是google的SDK,翻墙都没问题了,使用原本的配置也就不会出现对下载速度造成影响的问题了
结语
好了,恭喜你完成以上步骤后就可以同步一下然后进行apk的构建了,其中可能因为省略了一些步骤看着会比较迷茫,后期我不定时改改吧,因为连续加班也是弄得脑袋不舒服,详细步骤需要关注的点也可能少了一些,不过还是欢迎留言,看到了也都会第一时间进行回复的
最后2025年1月1日,元旦节快乐
祝大家都能拥有幸福开心满意的工作,并且每天都能不加班可以多陪陪家人
相关文章:
Unity2022接入Google广告与支付SDK、导出工程到Android Studio使用JDK17进行打包完整流程与过程中的相关错误及处理经验总结
注:因为本人也是第一次接入广告与支付SDK相关的操作,网上也查了很多教程,很多也都是只言片语或者缺少一些关键步骤的说明,导致本人也是花了很多时间与精力踩了很多的坑才搞定,发出来也是希望能帮助到其他人在遇到相似问…...
docker部署项目
docker部署项目 (加载tar包:docker image load -i mysql.tar) 一、jdk环境配置 1.jdk下载地址 --Java Archive | Oracle 中国 --选择好版本进入 --下载Linux x64 Compressed Archive的链接 2.解压 --创建文件夹:mkdir /ro…...
C# 设计模式(创建型模式):工厂模式
C# 设计模式(创建型模式):工厂模式 引言 在软件设计中,创建型模式是用来创建对象的设计模式,它们帮助我们将对象的创建过程从业务逻辑中分离出来,减少代码的重复性和耦合度。工厂模式作为创建型设计模式之…...
REMARK-LLM:用于生成大型语言模型的稳健且高效的水印框架
REMARK-LLM:用于生成大型语言模型的稳健且高效的水印框架 前言 提出这一模型的初衷为了应对大量计算资源和数据集出现伴随的知识产权问题。使用LLM合成类似人类的内容容易受到恶意利用,包括垃圾邮件和抄袭。 ChatGPT等大语言模型LLM的开发取得的进展标志着人机对话交互的范式…...
Lumos学习王佩丰Excel第二十三讲:Excel图表与PPT
一、双坐标柱形图的补充知识 1、主次坐标设置 2、主次坐标柱形避让(通过增加两个系列,挤压使得两个柱形挨在一起) 增加两个系列 将一个系列设置成主坐标轴,另一个设成次坐标轴 调整系列位置 二、饼图美化 1、饼图美化常见设置 …...
【Vue】v-if 和 :is 都是 Vue 中的指令,但它们用于不同的目的和场景
v-if v-if 是一个条件渲染指令,用于根据表达式的真假值来决定是否渲染一块内容。当 v-if 的表达式为真(truthy)时,Vue 会确保元素被渲染到 DOM 中;当表达式为假(falsy)时,元素不会被…...
private static final Logger log = LoggerFactory.getLogger()和@Slf4j的区别
一、代码方面 - private static final Logger log LoggerFactory.getLogger()方式 详细解释 这是一种传统的获取日志记录器(Logger)的方式。LoggerFactory是日志框架(如 Log4j、Logback 等)提供的工厂类,用于创建Lo…...
【项目】基于趋动云平台的Stable Diffusion开发
【项目】基于趋动云平台的Stable Diffusion开发 (一)登录趋动云(二)创建项目:(三)初始化开发环境:(四)运行代码(五)运行模型 …...
Git的.gitignore文件详解与常见用法
诸神缄默不语-个人CSDN博文目录 在日常使用 Git 进行版本控制时,我们经常会遇到一些不需要被提交到远程仓库的文件(例如日志文件、临时配置文件、环境变量文件等)。为了忽略这些文件的提交,Git 提供了一个非常有用的功能…...
客户端二维码优化居中和背景
原始 处理后...
Linux 安装运行gatk的教程
1.下载安装 wget https://github.com/broadinstitute/gatk/releases/download/4.1.8.1/gatk-4.1.8.1.zip2.解压 unzip *.zip3.查看 gatk --help 如下显示表示安装成功: 注意:仅限在该包所在位置的路径下能使用...
C++string类
1.为什么学习string类? 1.1C语言中的字符串 C语言中,字符串是以‘\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OO…...
下载linux aarch64版本的htop
htop代码网站似乎没有编译好的各平台的包,而自己编译需要下载一些工具,比较麻烦。这里找到了快速下载和使用的方法,记录一下。 先在linux电脑上执行: mkdir htop_exe cd htop_exe apt download htop:arm64 # 会直接下载到当前目…...
MYSQL---------支持数据类型
数值类型 整数类型 TINYINT:通常用于存储小范围的整数,范围是-128到127或0到255(无符号)。例如,存储年龄可以使用TINYINT类型。示例:CREATE TABLE users (age TINYINT);SMALLINT:范围比TINYINT…...
黑马JavaWeb开发跟学(十四).SpringBootWeb原理
黑马JavaWeb开发跟学 十四.SpringBootWeb原理 SpingBoot原理1. 配置优先级2. Bean管理2.1 获取Bean2.2 Bean作用域2.3 第三方Bean 3. SpringBoot原理3.1 起步依赖3.2 自动配置3.2.1 概述3.2.2 常见方案3.2.2.1 概述3.2.2.2 方案一3.2.2.3 方案二 3.2.3 原理分析3.2.3.1 源码跟踪…...
迅为RK3568开发板编译Android12源码包-设置屏幕配置
在源码编译之前首先要确定自己想要使用的屏幕并修改源码,在编译镜像,烧写镜像。如下图所示: 第一步:确定要使用的屏幕种类,屏幕种类选择如下所示: iTOP-3568 开发板支持以下种类屏幕: 迅为 LV…...
Spring Boot 中 TypeExcludeFilter 的作用及使用示例
在Spring Boot应用程序中,TypeExcludeFilter 是一个用于过滤特定类型的组件,使之不被Spring容器自动扫描和注册为bean的工具。这在你想要排除某些类或类型(如配置类、组件等)而不希望它们参与Spring的自动装配时非常有用。 作用 …...
Prometheus 采集 JVM 数据
Prometheus 采集 JVM 数据通常通过集成 JMX Exporter(Java Management Extensions Exporter)实现。以下是完整的介绍和操作步骤: 1. 原理概述 JVM 数据采集依赖于 JMX(Java Management Extensions),JVM 提…...
OpenNJet v3.2.0正式发布!
在这个版本中,NJet实现重大突破,提供了动态Upstream的能力。这是一个关键的特性,使得NJet可以按需动态管理上游服务器池,从而使得业务方可以按需配置资源池,实现业务分区、算法切换;结合动态路由技术&#…...
TinaCMS: 革命性的开源内容管理框架
在如今的数字时代,高效的内容管理系统(CMS)已成为构建内容丰富网站和应用程序的必需品。传统 CMS,如 WordPress 和 Drupal,功能丰富但复杂度高。而新一代 CMS,例如 TinaCMS,以其灵活性和开发者友…...
VuePress2配置unocss的闭坑指南
文章目录 1. 安装依赖:准备魔法材料2. 检查依赖版本一定要一致:确保魔法配方准确无误3. 新建uno.config.js:编写咒语书4. 配置config.js和client.js:完成仪式 1. 安装依赖:准备魔法材料 在开始我们的前端魔法之前&…...
SpringCloud(二)--SpringCloud服务注册与发现
一. 引言 前文简单介绍了SpringCloud的基本简介与特征,接下来介绍每个组成部分的功能以及经常使用的中间件。本文仅为学习所用,联系侵删。 二. SpringCloud概述 2.1 定义 Spring Cloud是一系列框架的有序集合,它巧妙地利用了Spring…...
JavaVue-Get请求 数组参数(qs格式化前端数据)
前言 现在管理系统,像若依,表格查询一般会用Get请求,把页面的查询条件传递给后台。其中大部分页面会有日期时间范围查询这时候,为了解决请求参数中的数组文件,前台就会在请求前拦截参数中的日期数组数据,然…...
Java-多种方法实现多线程卖票
Java多线程卖票是一个经典的并发编程问题,它展示了如何在多个线程之间安全地共享和修改资 源。以下是几种实现方式: 使用synchronized关键字: 使用synchronized修饰符来同步方法或代码块,确保同一时刻只有一个线程可以访问临界区(即操 作共享资源的代码)。 使用Reen…...
LLVM防忘录
目录 Windows中源码编译LLVMWindows下编译LLVM Pass DLL Windows中源码编译LLVM 直接从llvm-project下载源码, 然后解压后用VS2022打开该目录, 然后利用VS的开发终端执行: cmake -S llvm -B build -G "Visual Studio 17 2022" -DLLVM_ENABLE_PROJECTSclang -DLLVM_…...
Elasticsearch:基础概念
一、什么是Elasticsearch Elasticsearch是基于 Apache Lucene 构建的分布式搜索和分析引擎、可扩展数据存储和矢量数据库。它针对生产规模工作负载的速度和相关性进行了优化。使用 Elasticsearch 可以近乎实时地搜索、索引、存储和分析各种形状和大小的数据。Elasticsearch 是…...
【快速实践】类激活图(CAM,class activation map)可视化
类激活图可视化:有助于了解一张图像的哪一部分让卷积神经网络做出了最终的分类决策 对输入图像生成类激活热力图类激活热力图是与特定输出类别相关的二维分数网格:对任何输入图像的每个位置都要进行计算,它表示每个位置对该类别的重要程度 我…...
从零开始自搭SpringBoot项目 -- Qingluopay项目工程介绍
从零开始自搭项目 – QingLuoPay 一,为什么要从零开始自搭项目 首先在介绍这个项目之前先介绍一下我为什么要选择从零自搭项目,而不是跟着网上哪些视频等做项目。 之前的很长一段时间我也都是在网上找一些做项目的视频就包含黑马的(神领物…...
使用 Jupyter Notebook:安装与应用指南
文章目录 安装 Jupyter Notebook1. 准备环境2. 安装 Jupyter Notebook3. 启动 Jupyter Notebook4. 选择安装方式(可选) 二、Jupyter Notebook 的基本功能1. 单元格的类型与运行2. 可视化支持3. 内置魔法命令 三、Jupyter Notebook 的实际应用场景1. 数据…...
.NET框架用C#实现PDF转HTML
HTML作为一种开放标准的网页标记语言,具有跨平台、易于浏览和搜索引擎友好的特性,使得内容能够在多种设备上轻松访问并优化了在线分享与互动。通过将PDF文件转换为HTML格式,我们可以更方便地在浏览器中展示PDF文档内容,同时也更容…...
使用 httputils + chronicle-bytes 实现金融级 java rpc
1、认识 chronicle-bytes Chronicle-Bytes 是一个类似于 Java NIO 的 ByteBuffer 的高效字节操作库,但它提供了许多扩展功能。这个项目由 OpenHFT 开发并维护,旨在提供高性能、低延迟的数据处理解决方案。Chronicle-Bytes 设计用于高频率交易和其他对性…...
开源模型应用落地-Qwen2.5-7B-Instruct与vllm实现推理加速的正确姿势-利用KOR框架实现结构化输出(七)
一、前言 目前,大语言模型已升级至Qwen2.5版本。无论是语言模型还是多模态模型,均在大规模多语言和多模态数据上进行预训练,并通过高质量数据进行后期微调以贴近人类偏好。在本篇学习中,将集成vllm实现模型推理加速,现在,我们赶紧跟上技术发展的脚步,去体验一下新版本模…...
利用大语言模型解决推理任务
利用大语言模型(Large Language Models, LLMs)来解决推理任务是目前人工智能领域中的一个重要研究方向。大语言模型,如GPT系列(包括ChatGPT)和BERT等,具有强大的自然语言理解和生成能力,已经能够…...
修复OpenLinkSaas客户端在使用AtomGit账号时页面崩溃
问题描述:当一个新的AtomGit用户登录OpenLinkSaas客户端后出现了页面崩溃。 从浏览器控制台来看,是gitNoticeList出现了null。 查看代码后发现是请求atomGit api是返回的一个null的列表 接下来我们加下保护性的代码,来兼容null或undefine的情…...
如何使用大语言模型进行事件抽取与关系抽取
诸神缄默不语-个人CSDN博文目录 文章目录 1. 什么是事件抽取与关系抽取?2. 示例:使用大语言模型进行事件抽取与关系抽取 1. 什么是事件抽取与关系抽取? 事件抽取是指从文本中识别出与某些“事件”相关的信息。这些事件通常包括动作、参与者、…...
WebRTC线程的启动与运行
WebRTC线程运行的基本逻辑: while(true) {…Get(&msg, …);…Dispatch(&msg);… }Dispatch(Message *pmsg) {…pmsg->handler->OnMessage(pmsg);… }在执行函数内部,就是一个while死循环,只做两件事,从队列里Get取…...
Unity3D ILRuntime开发原则与接口绑定详解
引言 ILRuntime是一款基于C#的热更新框架,使用IL2CPP技术将C#代码转换成C代码,支持动态编译和执行代码,适用于Unity3D的所有平台,包括Android、iOS、Windows、Mac等。本文将详细介绍ILRuntime在Unity3D中的开发原则及接口绑定技术…...
grouped = df.drop(‘name‘, axis=1).groupby(‘team‘)
这行代码: grouped df.drop(name, axis1).groupby(team)的作用是首先删除 DataFrame 中的 name 列,然后按 team 列进行分组。以下是对每个部分的详细解释: 1. df.drop(name, axis1) df.drop(name, axis1) 这部分代码会从 DataFrame df 中…...
mysqll连接用时太长解决方法
1、连接用时太长分析 从客户端连接mysql服务器,时间长达10几秒,此为mysql的dns的反向解析造成,在局域网内如果都是用ip连接,可以通过在配置文件中添加skip-name-resolve,取消此功能,取消后,就不…...
Elasticsearch:利用 AutoOps 检测长时间运行的搜索查询
作者:来自 Elastic Valentin Crettaz 了解 AutoOps 如何帮助你调查困扰集群的长期搜索查询以提高搜索性能。 AutoOps 于 11 月初在 Elastic Cloud Hosted 上发布,它通过性能建议、资源利用率和成本洞察、实时问题检测和解决路径显著简化了集群管理。 Au…...
SpringCloud源码-Ribbon
一、Spring定制化RestTemplate,预留出RestTemplate定制化扩展点 org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration 二、Ribbon定义RestTemplate Ribbon扩展点功能 org.springframework.cloud.netflix.ribbon.RibbonAutoConfiguratio…...
使用Python,pypinyin将汉字转为带音调,首字母等多种风格的拼音,自动学习生字词
使用Python,pypinyin将汉字转为带音调,首字母等多种风格的拼音,自动学习生字词 1. 效果图2. 安装及支持的音调分类3. 源码参考 这篇博客将介绍如何使用Python,pypinyin将汉字转为带音调的拼音,自动学习生字词ÿ…...
消防设施操作员考试题库及答案
一、单选题 1.根据国家标准《防火门》(CB1295~2008)的规定,门扇上带防火玻璃的防火门的代号为()。 A.s B.bl C.b D.l 答案:C 解析:根据初级教材238页,门扇上带防火玻璃的防火门的代号为b。 2.关于彩…...
算法:IMPACT通过微生物特征分析可解释的微生物表型
文章目录 介绍框架代码参考 介绍 人类肠道微生物群由数万亿细菌组成,对健康和疾病有重大影响。通过现代技术的进步,高通量分析提供了增强我们对微生物组与复杂疾病结果之间联系的理解的潜力。然而,目前的微生物组模型缺乏微生物特征的可解释…...
2、zookeeper和kafka
zookeeper zookeeper基本知识 zookeeper:开源的分布式框架协调服务 zookeeper的工作机制 基于观察者模式设计的分布式结构,复制存储和管理架构当中的元信息,架构当中的应用接受观察者的监控,一旦数据有变化,通知对于…...
监控工具(Nagios)
2.4 Nagios 2.4.1 基础概念讲解 嘿,小伙伴们!我们已经见识过了Prometheus、Grafana和Zabbix的强大功能,现在是时候认识一下监控界的“老大哥”——Nagios了!Nagios是一款历史悠久的开源监控工具,虽然它可能没有像Zab…...
c++不够用知识补充-using namespace
感觉c的知识储备不够用了,忘记的再捡起来?! C之using namaspace;(未完)_namspace include-CSDN博客文章浏览阅读238次。初学C时,只要是程序都是用这个来打头。#includeusing namespace std;以前也不求甚解,知道随着对…...
奇异值分解SVD
线性变换 SVD在2*2矩阵 SVD推广到任意大小矩阵 去掉奇异值小的部分: 原始的时空矩阵模式1模式2模式3...
如何在 Windows 10/11 上录制带有音频的屏幕 [3 种简单方法]
无论您是在上在线课程还是参加在线会议,您都可能需要在 Windows 10/11 上录制带有音频的屏幕。互联网上提供了多种可选方法。在这里,本博客收集了 3 种最简单的方法来指导您如何在 Windows 10/11 上使用音频进行屏幕录制。请继续阅读以探索! …...
Linux centos7 docker安装 (yum快速安装)
Linux centos7 docker安装 (yum快速安装) 1. 查看内核1.1 内核升级操作(可选) 2. 部署docker2.1 卸载旧版本2.2 安装需要的软件包2.3 添加阿里云镜像源2.4 部署docker(可手动选择版本,默认安装最新版本&…...