此文为搬运帖,原帖地址https://www.cnblogs.com/zwywilliam/p/5999924.html

前言


在看了uwa之前发布的《Unity项目常见Lua解决方案性能比较》,决定动手写一篇关于lua+unity方案的性能优化文。
整合lua是目前最强大的unity热更新方案,毕竟这是唯一可以支持ios热更新的办法。然而作为一个重度ulua用户,我们踩过了很多的坑才将ulua上升到一个可以在项目中大规模使用的状态。事实上即使到现在lua+unity的方案仍不能轻易的说可以肆意使用,要用好,你需要知道很多。
因此,这篇文章是从一堆简单的优化建议里头,逐步挖掘出背后的原因。只有理解了原因,才能很清楚自己做的优化,到底是为了什么,有多大的效果。
 
从最早的lua纯反射调用c#,以及云风团队尝试的纯c#实现的lua虚拟机,一直发展到现在的各种luajit+c#静态lua导出方案,lua+unity才算达到了性能上实用的级别。
但即使这样,实际使用中我们会发现,比起cocos2dx时代luajit的发扬光大,现在lua+unity的性能依然存在着相当的瓶颈。仅从《性能比较》的test1就可以看到,iphone4s下二十万次position赋值就已经需要3000ms,如果是coc这样类型的游戏,不处理其他逻辑,一帧仅仅上千次位置赋值(比如数百的单位、特效和血条)就需要15ms,这显然有些偏高。
是什么导致lua+unity的性能并未达到极致,要如何才能更好的使用?我们会一些例子开始,逐步挖掘背后的细节。
 
由于我们项目主要使用的是ulua(集成了topameng的cstolua,但是由于持续的性能改进,后面已经做过大量的修改),本文的大部分结论都是基于ulua+cstolua的测试得出来的,slua都是基于其源码来分析(根据我们分析的情况来看,两者原理上基本一致,仅在实现细节上有一些区别),但没有做过深入测试,如有问题的话欢迎交流。
 
 
既然是lua+unity,那性能好不好,基本上要看两大点:
lua跟c#交互时的性能如何
纯lua代码本身的性能如何
因为这两部分都各有自己需要深入探讨的地方,所以我们会分为多篇去探讨整个lua+unity到底如何进行优化。
 
 
lua与c#交互篇
 
1.从致命的gameobj.transform.position = pos开始说起
像gameobj.transform.position = pos这样的写法,在unity中是再常见不过的事情
但是在ulua中,大量使用这种写法是非常糟糕的。为什么呢?
 
因为短短一行代码,却发生了非常非常多的事情,为了更直观一点,我们把这行代码调用过的关键luaapi以及ulua相关的关键步骤列出来(以ulua+cstolua导出为准,gameobj是GameObject类型,pos是Vector3):
第一步:
GameObjectWrap.get_transform    lua想从gameobj拿到transform,对应gameobj.transform
  LuaDLL.luanet_rawnetobj            把lua中的gameobj变成c#可以辨认的id
  ObjectTranslator.TryGetValue      用这个id,从ObjectTranslator中获取c#的gameobject对象
  gameobject.transform                 准备这么多,这里终于真正执行c#获取gameobject.transform了
  ObjectTranslator.AddObject         给transform分配一个id,这个id会在lua中用来代表这个transform,transform要保存到ObjectTranslator供未来查找
  LuaDLL.luanet_newudata            在lua分配一个userdata,把id存进去,用来表示即将返回给lua的transform
  LuaDLL.lua_setmetatable            给这个userdata附上metatable,让你可以transform.position这样使用它
  LuaDLL.lua_pushvalue                返回transform,后面做些收尾
  LuaDLL.lua_rawseti
  LuaDLL.lua_remove
第二步:
TransformWrap.set_position                     lua想把pos设置到transform.position
  LuaDLL.luanet_rawnetobj                       把lua中的transform变成c#可以辨认的id
  ObjectTranslator.TryGetValue                 用这个id,从ObjectTranslator中获取c#的transform对象
  LuaDLL.tolua_getfloat3                          从lua中拿到Vector3的3个float值返回给c#
     lua_getfield + lua_tonumber 3次         拿xyz的值,退栈
     lua_pop
  transform.position = new Vector3(x,y,z)  准备了这么多,终于执行transform.position = pos赋值了
就这么一行代码,竟然做了这么一大堆的事情!如果是c++,a.b.c = x这样经过优化后无非就是拿地址然后内存赋值的事。但是在这里,频繁的取值、入栈、c#到lua的类型转换,每一步都是满满的cpu时间,还不考虑中间产生了各种内存分配和后面的GC!
下面我们会逐步说明,其中有一些东西其实是不必要的,可以省略的。我们可以最终把他优化成:
lua_isnumber + lua_tonumber 4次,全部完成
 

2.在lua中引用c#的object,代价昂贵
从上面的例子可以看到,仅仅想从gameobj拿到一个transform,就已经有很昂贵的代价
c#的object,不能作为指针直接供c操作(其实可以通过GCHandle进行pinning来做到,不过性能如何未测试,而且被pinning的对象无法用gc管理),因此主流的lua+unity都是用一个id表示c#的对象,在c#中通过dictionary来对应id和object。同时因为有了这个dictionary的引用,也保证了c#的object在lua有引用的情况下不会被垃圾回收掉。
因此,每次参数中带有object,要从lua中的id表示转换回c#的object,就要做一次dictionary查找;每次调用一个object的成员方法,也要先找到这个object,也就要做dictionary查找。
如果之前这个对象在lua中有用过而且没被gc,那还就是查下dictionary的事情。但如果发现是一个新的在lua中没用过的对象,那就是上面例子中那一大串的准备工作了。
如果你返回的对象只是临时在lua中用一下,情况更糟糕!刚分配的userdata和dictionary索引可能会因为lua的引用被gc而删除掉,然后下次你用到这个对象又得再次做各种准备工作,导致反复的分配和gc,性能很差。
例子中的gameobj.transform就是一个巨大的陷阱,因为.transform只是临时返回一下,但是你后面根本没引用,又会很快被lua释放掉,导致你后面每次.transform一次,都可能意味着一次分配和gc。
 
 
3.在lua和c#间传递unity独有的值类型(Vector3/Quaternion等)更加昂贵
既然前面说了lua调用c#对象缓慢,如果每次vector3.x都要经过c#,那性能基本上就处于崩溃了,所以主流的方案都将Vector3等类型实现为纯lua代码,Vector3就是一个{x,y,z}的table,这样在lua中使用就快了。
但是这样做之后,c#和lua中对Vector3的表示就完全是两个东西了,所以传参就涉及到lua类型和c#类型的转换,例如c#将Vector3传给lua,整个流程如下:
1.c#中拿到Vector3的x,y,z三个值
2.push这3个float给lua栈
3.然后构造一个表,将表的x,y,z赋值
4.将这个表push到返回值里
一个简单的传参就要完成3次push参数、表内存分配、3次表插入,性能可想而知。
那么如何优化呢?我们的测试表明,直接在函数中传递三个float,要比传递Vector3要更快。
例如void SetPos(GameObject obj, Vector3 pos)改为void SetPos(GameObject obj, float x, float y, float z)
具体效果可以看后面的测试数据,提升十分明显。
 
 
 
4.lua和c#之间传参、返回时,尽可能不要传递以下类型:
严重类: Vector3/Quaternion等unity值类型,数组
次严重类:bool string 各种object
建议传递:int float double
虽然是lua和c#的传参,但是从传参这个角度讲,lua和c#中间其实还夹着一层c(毕竟lua本身也是c实现的),lua、c、c#由于在很多数据类型的表示以及内存分配策略都不同,因此这些数据在三者间传递,往往需要进行转换(术语parameter mashalling),这个转换消耗根据不同的类型会有很大的不同。
先说次严重类中的bool string类型,涉及到c和c#的交互性能消耗,根据微软官方文档,在数据类型的处理上,c#定义了Blittable Types和Non-Blittable Types,其中bool和string属于Non-Blittable Types,意思是他们在c和c#中的内存表示不一样,意味着从c传递到c#时需要进行类型转换,降低性能,而string还要考虑内存分配(将string的内存复制到托管堆,以及utf8和utf16互转)。
可以参考 https://msdn.microsoft.com/zh-cn/library/ms998551.aspx,这里有更详细的关于c和c#交互的性能优化指引。
而严重类,基本上是ulua等方案在尝试lua对象与c#对象对应时的瓶颈所致。
Vector3等值类型的消耗,前面已经有所提及。
而数组则更甚,因为lua中的数组只能以table表示,这和c#下完全是两码事,没有直接的对应关系,因此从c#的数组转换为lua table只能逐个复制,如果涉及object/string等,更是要逐个转换。
 
 
 
5.频繁调用的函数,参数的数量要控制
无论是lua的pushint/checkint,还是c到c#的参数传递,参数转换都是最主要的消耗,而且是逐个参数进行的,因此,lua调用c#的性能,除了跟参数类型相关外,也跟参数个数有很大关系。一般而言,频繁调用的函数不要超过4个参数,而动辄十几个参数的函数如果频繁调用,你会看到很明显的性能下降,手机上可能一帧调用数百次就可以看到10ms级别的时间。
 
 
6.优先使用static函数导出,减少使用成员方法导出
前面提到,一个object要访问成员方法或者成员变量,都需要查找lua userdata和c#对象的引用,或者查找metatable,耗时甚多。直接导出static函数,可以减少这样的消耗。
像obj.transform.position = pos。
我们建议的方法是,写成静态导出函数,类似
class LuaUtil{
  static void SetPos(GameObject obj, float x, float y, float z){obj.transform.position = new Vector3(x, y, z); }
}
然后在lua中LuaUtil.SetPos(obj, pos.x, pos.y, pos.z),这样的性能会好非常多,因为省掉了transform的频繁返回,而且还避免了transform经常临时返回引起lua的gc。
 
 
7.注意lua拿着c#对象的引用时会造成c#对象无法释放,这是内存泄漏常见的起因
前面说到,c# object返回给lua,是通过dictionary将lua的userdata和c# object关联起来,只要lua中的userdata没回收,c# object也就会被这个dictionary拿着引用,导致无法回收。
最常见的就是gameobject和component,如果lua里头引用了他们,即使你进行了Destroy,也会发现他们还残留在mono堆里。
不过,因为这个dictionary是lua跟c#的唯一关联,所以要发现这个问题也并不难,遍历一下这个dictionary就很容易发现。ulua下这个dictionary在ObjectTranslator类、slua则在ObjectCache类
 
 
8.考虑在lua中只使用自己管理的id,而不直接引用c#的object
想避免lua引用c# object带来的各种性能问题的其中一个方法就是自己分配id去索引object,同时相关c#导出函数不再传递object做参数,而是传递int。
这带来几个好处:
  1.函数调用的性能更好;
  2.明确地管理这些object的生命周期,避免让ulua自动管理这些对象的引用,如果在lua中错误地引用了这些对象会导致对象无法释放,从而内存泄露
  3.c#object返回到lua中,如果lua没有引用,又会很容易马上gc,并且删除ObjectTranslator对object的引用。自行管理这个引用关系,就不会频繁发生这样的gc行为和分配行为。
例如,上面的LuaUtil.SetPos(GameObject obj, float x, float y, float z)可以进一步优化为LuaUtil.SetPos(int objID, float x, float y, float z)。然后我们在自己的代码里头记录objID跟GameObject的对应关系,如果可以,用数组来记录而不是dictionary,则会有更快的查找效率。如此下来可以进一步省掉lua调用c#的时间,并且对象的管理也会更高效。
 
 
9.合理利用out关键字返回复杂的返回值
在c#向lua返回各种类型的东西跟传参类似,也是有各种消耗的。
比如
Vector3 GetPos(GameObject obj)
可以写成
void GetPos(GameObject obj, out float x, out float y, out float z)
表面上参数个数增多了,但是根据生成出来的导出代码(我们以ulua为准),会从:
LuaDLL.tolua_getfloat3(内含get_field + tonumber 3次)
变成
isnumber + tonumber 3次
get_field本质上是表查找,肯定比isnumber访问栈更慢,因此这样做会有更好的性能。
 
 
实测
好了,说了这么多,不拿点数据来看还是太晦涩
为了更真实地看到纯语言本身的消耗,我们直接没有使用例子中的gameobj.transform.position,因为这里头有一部分时间是浪费在unity内部的。
我们重写了一个简化版的GameObject2和Transform2。
class Transform2{
  public Vector3 position = new Vector3();
}
class GameObject2{
   public Transform2 transform = new Transform2();
}
然后我们用几个不同的调用方式来设置transform的position
方式1:gameobject.transform.position = Vector3.New(1,2,3)
方式2:gameobject:SetPos(Vector3.New(1,2,3))
方式3:gameobject:SetPos2(1,2,3)
方式4:GOUtil.SetPos(gameobject, Vector3.New(1,2,3))
方式5:GOUtil.SetPos2(gameobjectid, Vector3.New(1,2,3))
方式6:GOUtil.SetPos3(gameobjectid, 1,2,3)
分别进行1000000次,结果如下(测试环境是windows版本,cpu是i7-4770,luajit的jit模式关闭,手机上会因为luajit架构、il2cpp等因素干扰有所不同,但这点我们会在下一篇进一步阐述):
 

 

 方式1:903ms
方式2:539ms
方式3:343ms
方式4:559ms
方式5:470ms
方式6:304ms
 
 
可以看到,每一步优化,都是提升明显的,尤其是移除.transform获取以及Vector3转换提升更是巨大,我们仅仅只是改变了对外导出的方式,并不需要付出很高成本,就已经可以 节省66%的时间。
实际上能不能再进一步呢?还能!在方式6的基础上,我们可以再做到只有200ms!
这里卖个关子,下一篇luajit集成中我们进一步讲解。一般来说,我们推荐做到方式6的水平已经足够。
这只是一个最简单的案例,有很多各种各样的常用导出(例如GetComponentsInChildren这种性能大坑,或者一个函数传递十几个参数的情况)都需要大家根据自己使用的情况来进行优化,有了我们提供的lua集成方案背后的性能原理分析,应该就很容易去考虑怎么做了。
 
 
下一篇将会写lua+unity性能优化的第二部分,luajit集成的性能坑
相比起第一部分这种看导出代码就能大概知道性能消耗的问题,luajit集成的问题要复杂晦涩得多。
 
 
 
附测试用例的c#代码:
 

public class Transform2
{public Vector3 position = new Vector3();
}public class GameObject2
{public Transform2 transform = new Transform2();public void SetPos(Vector3 pos){transform.position = pos;}public void SetPos2(float x, float y, float z){transform.position.x = x;transform.position.y = y;transform.position.z = z;}
}public class GOUtil
{private static List<GameObject2> mObjs = new List<GameObject2>();public static GameObject2 GetByID(int id){if(mObjs.Count == 0){for (int i = 0; i < 1000; i++ ){mObjs.Add(new GameObject2());}}return mObjs[id];}public static void SetPos(GameObject2 go, Vector3 pos){go.transform.position = pos;}public static void SetPos2(int id, Vector3 pos){mObjs[id].transform.position = pos;}public static void SetPos3(int id, float x, float y ,float z){var t = mObjs[id].transform;t.position.x = x;t.position.y = y;t.position.z = z;}}

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

相关文章

  1. TCP握手图解

    三次握手图解以及各种状态&#xff1a; 四次分手图解&#xff1a; 三次握手和四次握手 【注意】 在TIME_WAIT状态中&#xff0c;如果TCP client端最后一次发送的ACK丢失了&#xff0c;它将重新发送。TIME_WAIT状态中所需要的时间是依赖于实现方法的。典型的值为30秒、1分钟…...

    2024/4/18 23:51:16
  2. Flutter 中 IndexedStack 的使用详解 _ Flutter Widgets

    | | | | 上面我们调整不同的 index 只显示出来了一个子项 Widget&#xff0c;如果我们把 IndexedStack 换成 Stack 则会显示成如下效果。 IndexedStack 源码 alignment 对齐方式sizing 填充方式index 显示子项索引children 子项集合 本篇主要聊 index 和 children &…...

    2024/4/13 20:15:10
  3. Flutter Android 端 FlutterInjector 及依赖流程源码分析

    } //步骤4、获取DeferredComponentManager实例&#xff0c;不分析&#xff0c;该特性在配合GP市场使用。 public DeferredComponentManager deferredComponentManager() { return deferredComponentManager; } //步骤5、常规的构造器模式。 public static final class Bu…...

    2024/4/17 0:54:56
  4. Scala(五)

    Scala 五模式匹配模式匹配-类型模式匹配-正则表达式模式匹配-对象样例类样例对象Option类型偏函数(PartialFunction)模式匹配 模式匹配时, 会从第一个 case分支开始, 如果匹配成功, 则执行对应的逻辑代码, 并结束当前模式匹配. 如果所有 case都不匹配, 那么会执行 case _分支,…...

    2024/4/17 17:39:52
  5. RabbitMQ学习笔记04--ttl--死信队列--集群搭建

    RabbitMQ学习笔记0401 过期时间TTL队列ttl消息ttl02 死信队列03 RabbitMQ内存磁盘的监控RabbitMQ集群搭建CentOS搭建rabbitmq集群docker搭建rabbitmq集群01 过期时间TTL 过期时间TTL表示可以对消息设置预期的时间&#xff0c;在这个时间内都可以被消费者接收获取&#xff1b;过…...

    2024/4/16 10:33:19
  6. 为了搞大创我都干了啥之MaskRCNN环境配置

    先搬运一下自己的文章。参考了很多巨佬的文章。 http://yourcarina.com/?id13 一、软件以及文件准备&#xff1a; 主要参考文章a&#xff1a;『深度应用』一小时教你上手MaskRCNNKeras开源实战&#xff08;Windows&amp;Linux&#xff09; https://www.baidu.com/link?…...

    2024/5/2 3:45:03
  7. 数仓 Kerberos 的部署

    文章目录Kerberos概述什么是KerberosKerberos术语Kerberos认证原理Kerberos安装安装Kerberos相关服务初始化KDC数据库修改管理员权限配置文件启动Kerberos相关服务创建Kerberos管理员用户Kerberos使用概述Kerberos数据库操作Kerberos认证操作Kerberos概述 什么是Kerberos Ker…...

    2024/4/20 2:52:20
  8. 中国乙烯-丙烯酸酯橡胶(AEM)市场调研报告(2022版)

    内容简介&#xff1a; AEM具有优异的耐热性能、耐液体性能、耐寒性能、耐臭氧性能和动态性能。 AEM主要应用于汽车配件领域&#xff0c;如前后曲轴油封、前后主轴油封、动力转向泵密封件、传动泵密封件、水泵密封胶、发动机气门阀杆油封、CVJ防尘罩、涡轮增压器胶管、动力转向…...

    2024/4/13 20:16:26
  9. 【django云服务器部署流程(1)】django+uwsgi+nginx:准备工作

    写在前面&#xff1a;近期参加比赛需要制作小程序&#xff0c;本人负责后端&#xff0c;所以在学习django的搭建和部署&#xff0c;前期还算顺利&#xff0c;但是在使用华为云(学校申请的代金券用不完了)的云耀云服务器部署的时候&#xff0c;静态文件没法在网页访问到&#xf…...

    2024/4/25 23:26:25
  10. [蓝桥杯]DS1302时钟芯片学习笔记

    目录1、DS1302简介1.1功能1.2通信方式1.3电路连接图2、DS1302通信时序3、编写读取函数3.1地址3.2BCD码与十进制互换3.2代码1、DS1302简介 1.1功能 DS1302滴充电计时芯片包含实时时钟/日历和31字节的静态RAM。它通过一个简单的串行接口与一个微处理器进行通信。实时时钟/日历提…...

    2024/5/5 4:25:07
  11. BIO、NIO、AIO 有什么区别?

    BIO&#xff1a;线程发起IO请求&#xff0c;不管内核是否准备好IO操作&#xff0c;从发起请求起&#xff0c;线程一直阻塞&#xff0c;直到操作完成。 NIO&#xff1a;线程发起IO请求&#xff0c;立即返回&#xff1b;内核在做好IO操作的准备之后&#xff0c;通过调用注册的回调…...

    2024/4/13 20:16:31
  12. QLV转MP4

    前段时间我一直在找TX的QLV转MP4软件&#xff0c;后来找到一款软件,分享给大家 https://ylsx.lanzouo.com/b030or8fi 密码:ffyu 时间&#xff1a;2022.1.31&#xff08;亲测有效&#xff09;...

    2024/4/13 20:16:21
  13. C51单片机输出pwm信号

    C51单片机&#xff0c;内部并没有输出pwm信号的模块只能通过&#xff0c;把软件写到硬件里面&#xff0c;实现输出pwm信号。 Pwm信号的产生方法很简单 任意引脚 void main(1){ while(1) { P0_0 1; P0_0 0; …...

    2024/5/5 9:34:15
  14. Techrxiv 预印本网站导入noteexpress/endnote

    techrxiv网站中&#xff0c;如果直接点cite&#xff0c;是不大好导入noteexpress的&#xff0c;点击exports&#xff0c;导出为bibtex等格式才好导入。...

    2024/5/5 6:38:28
  15. Context还有哪些你不知道的?,2021Android者未来的出路在哪里

    可以看到&#xff0c;代码很简单&#xff0c;只需要调用getApplication()方法就能拿到我们自定义的Application的实例了&#xff0c;打印结果如下所示&#xff1a; 那么除了getApplication()方法&#xff0c;其实还有一个getApplicationContext()方法&#xff0c;这两个方法看上…...

    2024/4/25 5:31:09
  16. 如何安全的从ubuntu16.04升级到18.04?

    如何安全的从ubuntu16.04升级到18.04&#xff1f;...

    2024/4/15 2:57:42
  17. 通用接口开放平台设计与实现——(13)消息服务端之消息处理器

    前面我们介绍了服务端的消息处理链条上各处理器的配置&#xff0c;这部分实际相当于技术框架&#xff0c;今天我们来介绍下处理具体业务消息的处理器。 ​ 处理框架由几个主要的部分组成&#xff1a; 1.消息主题&#xff1a;我们根据业务需求&#xff0c;将事件转换为消息主题…...

    2024/4/19 21:00:41
  18. java实现泛型动态数组源码小分享

    &#x1f64b;‍♀️日常小分享&#xff0c;欢迎参考 package com.xmonster.demo2;import java.util.Arrays;public class DynamicArray<E> {private static final int DEFAULT_CAPACITY 10;private int size;private Object[] elementData;public DynamicArray(){this…...

    2024/4/20 2:42:13
  19. ConstraintLayout2,金三银四大厂面经总结

    start next 如果start状态与该基本布局相对应&#xff0c;则previous的状态则应该表示为轮播项目向右移动一个。 例如&#xff0c;假设我们有5个视图&#xff1a;处于开始状态的A&#xff0c;B&#xff0c;C&#xff0c;D&#xff0c;E。 start时&#xff0c;B&#xff0c…...

    2024/5/1 12:48:51
  20. mvc设计模式与三层架构

    mvc与三层架构 1.什么是mvc设计模式 写Java Web项⽬时会发现&#xff0c;一个中型或者大型项目随着代码的增多&#xff0c;会发现&#xff1a;代码既可以写在src目录下&#xff0c;也可以写在WebContent目录下。src下可以建很多包&#xff0c;WebContent下可以建很多文件夹。…...

    2024/4/13 20:16:21

最新文章

  1. python 字典中按值的大小排序

    生成一个随机数d {x:randint(60,100)for x in ABCXYZ} {A: 91, B: 88, C: 100, X: 79, Y: 69, Z: 64} 要求按分数大小排序。 如果我们直接使用sorted(d)就会发现排序的结果是按健排序 [A, B, C, X, Y, Z] 方法一、是使用zip函数把数据转成元组&#xff08;91,A&#xff0…...

    2024/5/8 13:45:54
  2. 梯度消失和梯度爆炸的一些处理方法

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

    2024/5/7 10:36:02
  3. 前端开发攻略---Vue通过自定义指令实现元素平滑上升的动画效果(可以自定义动画时间、动画效果、动画速度等等)。

    1、演示 2、介绍 这个指令不是原生自带的&#xff0c;需要手动去书写&#xff0c;但是这辈子只需要编写这一次就好了&#xff0c;后边可以反复利用。 3、关键API IntersectionObserver IntersectionObserver 是一个用于监测元素是否进入或离开视口&#xff08;viewport&#x…...

    2024/5/7 13:42:30
  4. C# 构建可定时关闭的异步提示弹窗

    C# 构建可定时关闭的异步提示弹窗 引言1、调用接口的实现2、自动定时窗口的实现 引言 我们在最常用最简单的提示弹框莫过于MessageBox.Show( )的方法了&#xff0c;但是使用久了之后&#xff0c;你会发现这个MessageBox并不是万能的&#xff0c;有事后并不想客户去点击&#x…...

    2024/5/2 6:14:07
  5. 巨控科技新品发布:全方位升级,引领智能控制新纪元

    标签: #巨控科技 #智能控制 #新品发布 #GRM560 #OPC560 #NET400 在智能控制领域&#xff0c;巨控科技始终以其前沿技术和创新产品引领着市场的潮流。近日&#xff0c;巨控科技再次以其行业领先的研发实力&#xff0c;推出了三大系列的新产品&#xff0c;旨在为各行各业提供更…...

    2024/5/5 9:14:44
  6. 【外汇早评】美通胀数据走低,美元调整

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

    2024/5/8 6:01:22
  7. 【原油贵金属周评】原油多头拥挤,价格调整

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

    2024/5/7 9:45:25
  8. 【外汇周评】靓丽非农不及疲软通胀影响

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

    2024/5/4 23:54:56
  9. 【原油贵金属早评】库存继续增加,油价收跌

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

    2024/5/7 14:25:14
  10. 【外汇早评】日本央行会议纪要不改日元强势

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

    2024/5/4 23:54:56
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

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

    2024/5/4 23:55:05
  12. 【外汇早评】美欲与伊朗重谈协议

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

    2024/5/4 23:54:56
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

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

    2024/5/7 11:36:39
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

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

    2024/5/4 23:54:56
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

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

    2024/5/6 1:40:42
  16. 【外汇早评】美伊僵持,风险情绪继续升温

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

    2024/5/4 23:54:56
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

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

    2024/5/4 23:55:17
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

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

    2024/5/7 9:26:26
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

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

    2024/5/4 23:54:56
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

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

    2024/5/4 23:55:06
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

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

    2024/5/5 8:13:33
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

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

    2024/5/4 23:55:16
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

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

    2024/5/4 23:54:58
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

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

    2024/5/6 21:42:42
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

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

    2024/5/4 23:54:56
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

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

    2022/11/19 21:17:18
  27. 错误使用 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
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

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

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

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

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

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

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

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

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

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

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

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

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,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
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2022/11/19 21:16:58
  45. 如何在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