草庐IT

Unity数字孪生教程:系统如何架构?

大智_Unity大玩家 2023-03-28 原文

你好,我是大智。

很多同学对数字孪生特别感兴趣,经常有同学问我:

  • 数据孪生系统怎么做?有没有教程?
  • 除了Unity开发,开发数字孪生还需要掌握什么技能?
  • 有人介绍了一个数字孪生的外包,从来没做过,能不能接?

有幸参与或指导过一些数字孪生的科研、商业项目,把我的一些经验分享一下。

如果独立开发数字孪生系统,对技术要求还是比较高的,具体要掌握哪些技能呢?

在数字孪生系统中,Unity用于前端呈现,是整个系统的一部分,可以称之为数字孪生中的“数字”。

数字孪生,更重要的是“孪生”。孪生代表了什么呢?是与现实世界的同步。

所以数字孪生系统除了前端可视化的展示,更重要的是数据的采集同步。

那么一个完整的数字孪生系统如何架构呢?最简单的系统架构是这样的。

最简单的数字孪生系统架构1.0

这种是最简单的数字孪生系统架构,用Unity开发可视化部分,需要啥数据从外部系统接入啥数据。有些小项目(外包10W以内)用这种架构完全就可以搞定。

这种架构的优点是简单,你只需要掌握Unity开发和一些网络开发的技能就可以。

缺点呢?有很多。

  • 安全性是个问题,客户端直接接入外部系统,相当于外部系统的口令全部存储在客户端中,很危险。
  • 性能是个问题,客户端直接连外部系统,当开n个客户端的时候,就会和外部系统有n个连接,特别是有的数据需要轮询去获取,可能会对外部系统造成比较大的压力
  • 灵活性是个问题,由于直接连接外部系统,外部系统一旦变化可能就会造成客户端宕机,就需要升级客户端
  • 有些功能实现不了,客户端在PC运行还好,如果客户端想要放到web/VR/MR上,一方面平台限制,很多操作是不支持的,比如连接数据库、UDP传输等等,另外一方面这些平台渲染压力已经很大了,很难支撑庞大的数据工作

针对上面这些问题,架构可以如何改进呢?

数字孪生架构演进2.0

这个架构引进了一个数据服务器,这个数据服务器在这是做什么的呢?

这个服务器主要是用来中转数据,与外部系统的数据连接都由这个服务器负责。但通常监控系统中的视频流还是客户端直接连接。

针对1.0架构中的几个问题,数据服务器可以解决:

  • 安全性:数据服务器负责中转外部系统中的数据,客户端只需要与数据服务器通信即可,避免了外部系统口令在客户端的暴露。
  • 性能:数据服务器只从外部系统采集一次数据,如果缓存在数据服务器上,不管有多少个客户端,只需要数据服务器能抗住并发压力即可,不会对外部已有系统造成影响。
  • 灵活性:客户端与服务器制定好数据协议即可,数据服务器负责处理与外部系统的数据对接,隔绝了客户端的频繁改动,也给客户端增加了一定的稳定性
  • 功能性:可以支持客户端在web平台运行,客户端与数据服务器通过HTTP或者TCP等支持的通信协议进行通信即可,由服务器去处理外部系统的数据对接。

但是2.0架构中也存在问题,那就是数据服务器的压力太大,职责太多,它需要负责:

  • 从外部系统采集、处理数据。原来数据都是由外部系统负责存储,不需要考虑数据存储的事情。但是引入数据服务器后,采集到的数据可能需要进行保存,到这全栈的技能中就得增加一个数据库了。
  • 响应客户端的数据请求
  • 后续可能需要添加的一系列业务功能也需要添加到这个服务器上,比如用户、权限等等

所以演化到3.0的架构时,提高服务端的并发能力,可以将数据服务器根据需要进行拆分,加入数据库,这里面没有一个固定的架构模式,初步是将数据、应用模块拆分开,有计算量较大的模块(比如AI预测、数据分析等等)可以单独再拆分出来。

比如:

数字孪生架构演进3.0

数字孪生全栈开发能架构到这一步基本上就能Hold住几十万的项目了。

这里面需要的技能主要包括:

  • Unity开发
  • 网络通信
  • 数据库
  • 服务器架构与开发
  • 服务器运维

3.0的架构再往后演进,就需要很强的服务器开发能力了,主要核心目标还是提高服务端的并发能力,加入分布式等等,此处就不再多说了。


对于Unity数字孪生全栈开发你还有什么想知道的?可以评论告诉我,下次继续分享。

有关Unity数字孪生教程:系统如何架构?的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  4. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  5. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  6. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  7. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  8. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  9. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  10. ruby - 如何使用文字标量样式在 YAML 中转储字符串? - 2

    我有一大串格式化数据(例如JSON),我想使用Psychinruby​​同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解

随机推荐