UnLua解析(一)Object绑定lua

https://zhuanlan.zhihu.com/p/100058725

相关文章:

南京周润发:UnLua解析(二)使用Lua函数覆盖C++函数

南京周润发:UnLua解析(三)Lua访问Object的property和function

南京周润发:UnLua解析(四)数据在C++和lua间的相互传递

南京周润发:UnLua解析(五)Delegate实现

简介

UnLua是腾讯GCloud推出的lua组件,可以为UE4赋予luab脚本开发能力。目前已开源,地址为:https://github.com/Tencent/UnLua

本文作为UnLua分析的第一部分,将介绍Object创建后与lua的绑定过程,这可以作为理解UnLua的第一步,其中也包含了Class注册与Function覆盖等内容,这些是Object绑定的基础条件。

UnLuaInterface

UnLua插件比较干净,接入UnLua,蓝图只需实现GetModuleName函数即可,这个函数返回一个lua文件的路径,路径相对于'Content/Script'。

比如Weapon/BP_DefaultProjectile_C.lua就是"Weapon.BP_DefaultProjectile_C"

GetModuleName函数声明在UnLuaInterface中,可以用蓝图配置,也可以用C++类实现,UE中的类通过UnLuaInterface与lua进行关联。

UObject和lua绑定

UnLua中Object绑定lua非常早,早到UObject刚创建时就绑定了。

FLuaContext实现FUObjectArray::FUObjectCreateListener接口,每当有UObjectBase创建时,会通过NotifyUObjectCreated收到通知。更深入了解一步,我们知道UObjectBase创建时,会在全局GUObjectArray数组中加入一个元素,正是在这里发送的NotifyUObjectCreated通知。NotifyUObjectCreated中做的主要工作就是绑定lua,可以看FLuaContext::TryToBindLua函数。

首先做Editor中的判断,可见Editor中创建的UObject会直接略过,PIE中的才行。

#if WITH_EDITORif (GIsEditor && !bIsPIE){return false;}
#endif

对于一个UObject,首先需要判断它是否为CDO或ArchetypeObject,我们不需要为CDO和模板对象绑定lua。还要过滤掉UClass和UPackage,这些对象都不需要绑定lua。

绑定有两种方式,静态绑定和动态绑定,可以简单理解为如果该类实现了UnLuaInterface接口,就使用静态绑定;如果使用Lua中的"SpawnActor"或"NewObject"接口创建对象,就能在参数中指定ModuleName,之后使用动态绑定,可以使一个没有继承UnLuaInterface的类也可以使用lua扩展功能。

静态绑定

先看静态绑定,个人觉得静态绑定会更广泛。如果该类实现了UnLuaInterface,就走静态绑定。

首先,通过在CDO上调用ProcessEvent,实现调用GetModuleName方法,得到ModuleName。然后使用UUnLuaManager::Bind()函数进行绑定。

  • 注册Class

绑定第一步为注册该UClass,由RegisterClass()方法实现,需要创建一个重要数据结构FClassDesc,它储存了一些元信息,用于描述一个UClass/Ustruct/UEnum。

根据UStruct,ClassName信息创建FClassDesc,然后更新TMap<FName, FClassDesc*> Name2Classes和TMap<UStruct*, FClassDesc*> Struct2Classes,方便以后查询。

之后还要获取当前UStruct的所有父类,把这些父类都注册一遍,创建父类的FClassDesc。

以UClass为例,FClassDesc创建时,首先会设置关于UClass的基本信息,比如Name,Type,Size等。然后把该UClass实现的所有UInterface也通过RegisterClass注册一遍。之后再初始化该类的FunctionCollection数据结构,该数据结构用于lua调用C++函数时默认参数自动填充。

设置元表

注册Class时有一个重要的步骤,就是设置Class对应的元表信息,这样之后lua table就可以访问Uobject的属性和方法了。

  • UClass绑定Lua module (关键)

接着UnLua会在lua中找到我们定义的lua Module,使用GetFunctionList方法得到Module中定义的所有lua方法名。遍历也会包括Module的所有父类。得到的结果存储于 TMap<FString, TSet<FName>> ModuleFunctions容器中,它是ModuleName与FunctionList的键值对,方便以后查找。

然后遍历刚刚得到的所有lua函数,从中找出lua覆写C++UFunction的函数,目前包括"BlueprintEvent"和"RepNotifyFunc",也就是说,蓝图中无法覆写的RepNotify函数,在UnLua中可以直接覆写。

接下来是关键的”hook“这些C++中要被覆写的UFunction。

首先,需要判断这个UFunction是这个UClass的还是它父类的,是UClass的则替换UFunction,是父类的则添加UFunction。

子类添加Ufunction

void UUnLuaManager::AddFunction(UFunction *TemplateFunction, UClass *OuterClass, FName NewFuncName)
{UFunction *Func = OuterClass->FindFunctionByName(NewFuncName, EIncludeSuperFlag::ExcludeSuper);if (!Func){UFunction *NewFunc = DuplicateUFunction(TemplateFunction, OuterClass, NewFuncName); // duplicate a UFunctionif (!NewFunc->HasAnyFunctionFlags(FUNC_Native) && NewFunc->Script.Num() > 0){NewFunc->Script.Empty(3);                               // insert opcodes for non-native UFunction only}OverrideUFunction(NewFunc, (FNativeFuncPtr)&FLuaInvoker::execCallLua, GReflectionRegistry.RegisterFunction(NewFunc));   // replace thunk function and insert opcodesTArray<UFunction*> &DuplicatedFuncs = DuplicatedFunctions.FindOrAdd(OuterClass);DuplicatedFuncs.AddUnique(NewFunc);
#if ENABLE_CALL_OVERRIDDEN_FUNCTIONGReflectionRegistry.AddOverriddenFunction(NewFunc, TemplateFunction);
#endif}
}

UnLua先把要覆写的UFunction作为TemplateFunction,新建了NewFunction。新建NewFunction通过DuplicateUFunction函数完成,会把TemplateFunction的Property逐个复制过去,然后Class把NewFunction添加到自己的FuncMap中,以后就能访问了。

接下来会把NewFunc的字节码清空,这就意味之后该TemplateFunction对应的蓝图逻辑执行不到了。

再看下面GReflectionRegistry.RegisterFunction函数调用,从名称就能看出,是在注册UFunction。类似UClass,UnLua也会对UFunction进行注册,并创建FFunctionDesc作为描述数据。FFunctionDesc数据结构也很重要,它可以作为UFunction和LuaFunction之间的桥梁,Function指向UFunction,FunctionRef指向lua中的函数,还存有函数名,函数默认参数等信息。将来分析函数调用时会对它做详细介绍。所有UFunction注册信息位于GReflectionRegistry的Functions容器中。

UFunction逻辑覆盖

创建完NewFunction并注册后,需要进行UFunction覆盖操作了,这一步也是UnLua中很重要的一点,可见OverrideUFunction函数,添加UFunction时bInsertOpcodes为true,即总是添加字节码。

/*** 1. Replace thunk function* 2. Insert special opcodes if necessary*/
void OverrideUFunction(UFunction *Function, FNativeFuncPtr NativeFunc, void *Userdata, bool bInsertOpcodes)
{Function->SetNativeFunc(NativeFunc);if (Function->Script.Num() < 1){if (bInsertOpcodes){Function->Script.Add(EX_CallLua);int32 Index = Function->Script.AddZeroed(sizeof(Userdata));FMemory::Memcpy(Function->Script.GetData() + Index, &Userdata, sizeof(Userdata));Function->Script.Add(EX_Return);Function->Script.Add(EX_Nothing);}else{int32 Index = Function->Script.AddZeroed(sizeof(Userdata));FMemory::Memcpy(Function->Script.GetData() + Index, &Userdata, sizeof(Userdata));}}
}

这里会把UFunction的C++函数指针和蓝图字节码调用函数都指向FLuaInvoker::execCallLua函数,这样不管调用纯C++的RepNotify,还是blueprintevent,都能调用到execCallLua函数。在这里UnLua专门添加了一个字节码EX_CallLua,execCallLua则被声明为实现该字节码的函数,同时也能作为普通C++函数使用,可谓一举两得。execCallLua函数功能就和名字一样,用于调用覆写的lua函数,细节之后介绍。这里可以发现UnLua在SHIPPING版本中会把FFunctionDesc直接拷贝到字节码中作为数据,非SHIPPING版本需要在execCallLua中根据UFunction去GReflectionRegistry.RegisterFunction找FFunctionDesc,应该是为了在SHIPPING版本中加快运行速度,用空间换时间的思想。

子类替换Ufunction

/*** Replace thunk function and insert opcodes*/
void UUnLuaManager::ReplaceFunction(UFunction *TemplateFunction, UClass *OuterClass)
{FNativeFuncPtr *NativePtr = CachedNatives.Find(TemplateFunction);if (!NativePtr){
#if ENABLE_CALL_OVERRIDDEN_FUNCTIONFName NewFuncName(*FString::Printf(TEXT("%s%s"), *TemplateFunction->GetName(), TEXT("Copy")));UFunction *NewFunc = DuplicateUFunction(TemplateFunction, OuterClass, NewFuncName);GReflectionRegistry.AddOverriddenFunction(TemplateFunction, NewFunc);
#endifCachedNatives.Add(TemplateFunction, TemplateFunction->GetNativeFunc());if (!TemplateFunction->HasAnyFunctionFlags(FUNC_Native) && TemplateFunction->Script.Num() > 0){CachedScripts.Add(TemplateFunction, TemplateFunction->Script);TemplateFunction->Script.Empty(3);}OverrideUFunction(TemplateFunction, (FNativeFuncPtr)&FLuaInvoker::execCallLua, GReflectionRegistry.RegisterFunction(TemplateFunction));}
}

如果要lua要覆盖的UFunction就在子类中,则需要替换该UFunction的逻辑,不能再创建同名函数了。

首先会拷贝一个名称加上"Copy"后缀的NewFunc,NewFunc作为原UFunction的备份。然后把它们加到TMap<UFunction*, UFunction*> OverriddenFunctions容器中,该容器存储了原UFunction和CopyUFunction的键值对,之后有需要可以在里面查找并调用原UFunction。

接着如果原UFunction有NativeFunc指针和字节码,就把它保存到CachedNatives容器和CachedScripts中做记录,用于以后恢复UFunction。毕竟在直接修改UFunction实例,在Editor中PIE结束不恢复,会导致UFunction内存坏掉。

保存信息后,就可以使用和上面相同的UFunction逻辑覆盖步骤,修改NativeFunc指针和字节码了,只不过这次直接操作的原UFunction。

 

  • 创建UObject对应的luatable

首先需要创建一个lua table,把它称为"INSTANCE"。

然后创建一个userdata,类型为void*,其中存储了UObject的指针,并且把该userdata类型设置为twolevel_ptr。我们之前注册Class时已经在lua中创建了该Class关联的metatable,于是可以把刚创建的userdata的metatable设置上,这个userdata就能和UE对象系统相关联了。我们把该userdata称为"RAW_OBJECT"

创建并初始化好userdata后,会在lua table上创建名为"Object"的属性,值就是userdata,即INSTANCET.Object = RAW_UOBJECT。这样luatable就与UObject产生了关联。

接着,获取到Class对应的Module,就是GetModuleName()函数返回名称对应的Module,为Module创建"Overridden"属性,值为RAW_OBJECT的metatable。我们把该Module称为"REQUIRED_MODULE"。然后把REQUIRED_MODULE的metatable也设置为RAW_OBJECT的metatable。

处理完Module后,就可以把INSTANCE的metatable设置为REQUIRED_MODULE了。

这个流程有些复杂,光看文字叙述不太直接,下图详细展示了UObject和luatable的关系,以及如何产生联系的,主要方式就是metatable设置。

创建完lua table后,UnLua会在GObjectReferencer中记录该Object,从而对该Object添加引用。然后在AttachedObjects中记录Object与lua table的对应关系。

如果创建的是Actor,需要额外在AttachedActors中添加记录。在Actor被删除时会从AttachedActors里删除记录。

然后,会检查lua中是否有Initialize函数,lua中可以实现该函数做一些初始化工作,如果有就会调用。

动态绑定

如果在lua中使用"NewObject"和"SpawnActor",我们可以选择指定提供ModuleName,这样UnLua可以在运行时把一个UObject和ModuleName关联起来,因此称为“动态”。

UObject与ModuleName关联

以在lua中SpawnActor为例,我们看下UObject如何关联ModuleName。SpawnActor实现函数为Uworld_SpawnActor,有如下代码:

FScopedLuaDynamicBinding Binding(L, Class, ANSI_TO_TCHAR(ModuleName), TableRef);
AActor *NewActor = World->SpawnActor(Class, &Transform, SpawnParameters);
UnLua::PushUObject(L, NewActor);

可以看到,在创建Actor之前,创建了一个FScopedLuaDynamicBinding对象,会传入Class,ModuleName,可选的InitializerTable参数。

FScopedLuaDynamicBinding::FScopedLuaDynamicBinding(lua_State *InL, UClass *Class, const TCHAR *ModuleName, int32 InitializerTableRef): L(InL), bValid(false)
{if (L){bValid = GLuaDynamicBinding.Setup(Class, ModuleName, InitializerTableRef);}
}

接着看其构造函数,构造函数中会使用全局的GLuaDynamicBinding对象进行设置。

bool FLuaDynamicBinding::Setup(UClass *InClass, const TCHAR *InModuleName, int32 InInitializerTableRef)
{if (!InClass || (Class && Class != InClass) || (ModuleName.Len() > 0 && ModuleName != InModuleName) || (!InModuleName && InInitializerTableRef == INDEX_NONE)){return false;}Class = InClass;ModuleName = InModuleName;InitializerTableRef = InInitializerTableRef;return true;
}

看下Setup函数,主要工作还是设置一下自己的Class等对象属性。这样在Object创建后,执行TryToBindLua时,就会知道这个对象的ModuleName已经记录,可以动态绑定。

当然,从FScopedLuaDynamicBinding类的名称就可以推测,它只会在这个作用域有效,观察一下它的析构函数,会发现在其中做了GLuaDynamicBinding的清理,因此动态绑定只会对这个对象有效。

动态绑定剩下的流程与静态绑定相同,都是注册Class,绑定lua module,替换UFunction等。

编辑于 02-27

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

相关文章

  1. 集合 Set

    还是一样,和C++ STL中的 set 类似。 如果我们只需要存储不重复的key,并不需要存储映射的value,那么就可以使用Set。 Set:无顺序,不包含重复的元素 HashSet:为快速查找设计的Set。存入HashSet的对象必须定义hashCode()。 TreeSet: 保存次序的Set, 底层为树结构。使用它可以…...

    2024/5/1 14:23:57
  2. 易语言数据库操作的“是否已打开”命令详解

    如果指定数据库文件已经被打开,返回真,否则返回假。 语法: 逻辑型 是否已打开 (欲测试的数据库文件名) 参数名 描 述 欲测试的数据库文件名 必需的;文本型。 例程:说明: 当运行“全部关闭()”命令后,使用“是否已关闭 ()”命令来判断被关闭命令是否确实被关闭,如果都…...

    2024/4/30 18:44:36
  3. 桥接、nat、仅主机模式的分析

    平常我们在使用VMware时,会选择网络适配器。有三种模式可供选择。这里的是虚拟机 当我们在自己电脑上查看自己的网卡: 如图: 可看见环回网卡、无线网卡、以太网网卡、以及安装VMware时会自动生成的两个网卡。 一、桥接模式 逻辑上是虚拟机网卡与真机网卡之间连接的交换机。 …...

    2024/5/1 13:31:48
  4. Android 启动优化

    一、App启动有三种,冷启动、热启动、温启动。1、冷启动(耗时最多,衡量标准),冷启动之前(系统行为),有三个任务,启动App,加载空白的Window,创建进程。随后的任务(可以干涉)创建Application、启动主线程、创建MainActivity、加载布局、布置屏幕、首帧绘制 。以下是冷启…...

    2024/5/1 6:05:21
  5. 【Python】\ufeff

    问题:通过文件操作读入文本内容"English"后,内容前面多了 \ufeff 前缀方法:open方法内加上参数:encoding=UTF-8-sig f = open(path, encoding=UTF-8-sig)...

    2024/4/15 4:19:26
  6. Maven的下载与配置(含eclipse和idea配置)

    文章目录Maven 的下载与配置下载配置环境变量测试maven配置修改本地仓库位置配置国内镜像修改JDK版本eclipse的Maven配置idea的Maven配置 Maven 的下载与配置 下载maven官网http://maven.apache.org/点击download选择适合的版本进行下载官方推荐的是最新版本,如果想下载使用先…...

    2024/4/15 4:19:24
  7. 万门大学算法实习生课程学习第一天

    在经过漫长的实训课程后,发现了自己有很多的不足之处,尤其是算法和数学方面感觉特别薄弱,怎么办呢,当然是要学习了,准备刷一些算法,然后补一下数学方面的知识(逻辑思维薄弱真的是硬伤)。 为了补充自己的不足,现在准备开始第一天的学习啦,并且以后每天会上传一些学习笔…...

    2024/4/20 7:02:50
  8. python数据分析-第三章

    二分收索import bisect c = [1, 2, 2,2,3,4,5] bisect.bisect(c, 2)enumerate 遍历一个序列,同时需要序号some_list = [foo, bar, baz] mapping = {} for i, v in enumerate(some_list):mapping[v] = iout: {foo: 0, bar: 1, baz: 2}zip 将列表,元组或其他序列的元素配对,新…...

    2024/4/15 4:19:22
  9. 图像SIFI笔记

    Image/userl representation => down screen tasks 端到端的 文本领域 字典 visual word本质是 local feature handcraft feature 希望这个具有足够的泛华性 generalize 为了有交集 泛化性 clustering 聚类 Quantization 量化 每张图像有特征点 local feature sift(128d维度…...

    2024/5/1 11:19:21
  10. 使用 Django + Vue.js 开发个人博客网站(完整版附源码)—— Python-课程设计-期末项目

    页面展示: 源码首页不同板块注册页面登录页面个人信息写文章页面文章详情页面文章评论本文主要讲解 Python 后端部分,由于仅仅用到了 vue 作为 js 框架并非前后端分离项目,故前端不单独介绍。 一、项目内容(做什么) 本项目实现了一个网页端的 博客系统 ,该博客系统允许多…...

    2024/4/15 4:19:21
  11. 这是你的RNN

    图图告诉你RNN 首先,RNN是用来解决有时间序列问题的,考虑上下文联系的神经网络。 所以说网络需要记忆,上一个单词应该要对下一个单词的输出产生影响,于是RNN网络横空出世,下图的a1和a2就是RNN的主要特点,能够储存上一次的输出值。我们来看看RNN是…...

    2024/4/15 4:19:19
  12. python学习之正则表达式

    import reret = re.findall(w\w{2}l,hello world) print(ret)ret =re.findall(lzh,dsfsfsflzhfsfsffs) print(ret)元字符.通配符 ret = re.findall(w..l,hello world) # .只能代指任意一个字符 print(ret)^ ret = re.findall(^h...o,hlsaodfhello) print(ret)$ ret = re.finda…...

    2024/4/15 4:19:18
  13. Web 优化——资源加载优化

    阅前悉知:其一、本文是《Web 优化》系列的第三篇。该系列是我查阅了大量资料总结而来的。其中可能存在不足之处。希望大家在阅读时,抱着质疑的态度去阅读。其二、因为本文内容是承接本系列的第一篇文章所讲内容。所以阅读本文前,希望各位优先看下第一篇:《Web 优化——简述…...

    2024/4/24 12:55:06
  14. 选择排序_Java

    选择排序 使用索引为0的元素依次和后面索引对应的元素进行比较,将较小的值放到前面,第一次比较完毕最小值就在索引为0的位置;以此类推,就可以得到一个排好序的数组; 第一次比较是从0索引开始,一直与后面的进行比较,直到比较到最后一个索引; 第二次是从1索引开始,遇到小…...

    2024/4/24 12:55:05
  15. (通俗易懂)使用docker安装tomcat

    5.2.1 拉取tomcat的镜像docker pull tomcat:85.2.2 查看本地镜像docker images3.1.4 删除镜像docker rmi [镜像名称:tag]/[镜像ID] 参数介绍: -f 强制删除镜像 docker rmi tomact:lat 只要你拉取的版本不是latest 都要加那个版本标签(:lat) 如果这个镜像产生了容器也删不了…...

    2024/4/24 12:55:05
  16. Mac物理机安装ubuntu16.04

    写在前面的话 可能生命的意义在于折腾吧!其实也不算,(我是win装过mac,mac装过win,Linux装win,win装Linux,最后就是Mac装Linux),但是比较起来,安装操作系统和写操作系统,就不算折腾了!加油! 下面我的操作都是在Mac系统上完成的,记录一下,如果刚好你也有这个需求就可…...

    2024/4/24 12:55:03
  17. python常用时间格式转换

    #获取当前的时间 curr_time = datetime.datetime.now() #2020-06-13 22:06:25.393880 类型:<class datetime.datetime>格式化: #格式化(使用strftime()将datetime转换成为2020-06-13、2020/06/13等str目标形式) time_str = curr_time.strftime("%Y-%m-%d")…...

    2024/4/24 12:55:03
  18. Mysql开启慢查询及日志分析

    一、为什么要开启慢查询造成查询性能低下的原因多半是数据较多,开启mysql的慢查询,将查询所需时间较长的SQL语句记录到日志里,有利于我们更好的地位问题所在,并进行优化。二、造成mysql查询较慢几种常见的原因 2.1 查询所有的列 select *会给服务器带来额外的I/O、内存和cu…...

    2024/4/24 12:55:01
  19. (三)深度学习计算 -- 5

    5. GPU计算 截至目前为止,一直在使用CPU计算,这对于复杂神经网络和大规模数据来说,可能不够高效。 因此,本节将介绍如何使用GPU来进行计算。5.1 免费使用GPU 薅羊毛存在多种途径,若仅供个人学习使用,其中一种简便的方式为:Kaggle Notebooks。Kaggle 是什么? Kaggle is …...

    2024/4/24 12:55:00
  20. 随机过程中的功率谱密度

    背景 随机信号能量无限,不满足狄利克雷条件,故不能进行傅里叶变换。 基本概念平稳随机过程 统计特性与时间无关,所以利用其统计特性来分析问题,例如自相关系数是在各个样本上做的一个集合平均,只与时延τ\tauτ相关。 R(τ)=E[x(t)x(t+τ)]R(\tau)=E[x(t)x(t+\tau)]R(τ)=…...

    2024/4/24 12:54:59

最新文章

  1. uni框架下的前端小知识

    <movable-area> 和 <movable-view> 组件来创建一个可以移动的区域&#xff0c;这通常用于模拟地图或座位图等场景的拖动效果。 1、direction&#xff1a;移动方向&#xff0c;可选值为all、vertical、horizontal分别表示所有方向、垂直、水平方向。 2、inertia&am…...

    2024/5/1 19:31:29
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 探索进程控制第一弹(进程终止、进程等待)

    文章目录 进程创建初识fork函数fork函数返回值fork常规用法fork调用失败的原因 写时拷贝进程终止进程终止是在做什么&#xff1f;进程终止的情况代码跑完&#xff0c;结果正确/不正确代码异常终止 如何终止 进程等待概述进程等待方法wait方法waitpid 进程创建 初识fork函数 在…...

    2024/5/1 13:05:31
  4. 《c++》多态案例一.电脑组装

    一.代码展示 #include <iostream> using namespace std; class CPU { public://抽象计算函数virtual void calculate() 0;};class CVideoCard { public://抽象显示函数virtual void display() 0;}; class Memory { public://抽象存储函数virtual void storage() 0;};…...

    2024/4/30 4:16:58
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/30 18:14:14
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/30 18:21:48
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/30 9:43:22
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57