微軟MR技術專家分享:AR/VR多線程處理的八年經驗與技巧

2020-11-22 網易新聞

  原標題:微軟MR技術專家分享:AR/VR多線程處理的八年經驗與技巧

  (映維網 2020年11月17日)多線程(Multithreading)是指從軟體或者硬體實現多個線程並發執行的技術。具有多線程能力的計算機因有硬體支持而能夠在同一時間執行多於一個線程,進而提升整體處理性能。

  微軟混合現實技術專家賈裡德·拜恩茲(Jared Bienz)是一位著名的軟體架構師,有著20多年的從業經驗。日前,拜恩茲撰文分享了自己在AR/VR/MR多線程處理方面的八年經驗和技巧。下面是映維網的具體整理:

  要正確實現多線程並不容易,但它對於資源受限的行動裝置流暢運行模擬至關重要。在供職於微軟的生涯中,我有機會在四年多的時間裡幫助合作夥伴為HoloLens編寫高性能的應用程式。我另外有4年多的時間幫助合作夥伴為智慧型手機和平板電腦編寫高性能應用程式。

  我早已有意撰寫這篇文章。這基本上是我對AR/VR/MR模擬的多線程處理的8年經驗分享。儘管本文主要關注Unity和C#,但我希望其中介紹的概念依然能夠為所有語言和運行時的模擬開發者帶來價值。

  1. 什麼是線程?

  我知道這是一個基礎性的問題,但我從它開始寫起是有一個重要原因。這個理由會在本章後面變得清晰起來。

  維基百科將線程描述為:可以與其它指令並發執行的一系列指令。

  我強調並發執行是因為它對這次討論至關重要。並發運行多個任務的能力使得線程對於模擬至關重要。

  2. 關於內核與線程的簡要說明

  一個CPU可以有多個內核,而有些內核可以運行多個線程。例如,Ryzen Threadripper最多有64個內核,每個內核可以運行2個線程。這意味著,如果你編寫的模擬屬於高度多線程,你可能會有多達128個不同的任務同時發生。你可以用這些線程來運行NPC的人工智慧大腦,或者在物理模擬中製造碰撞。

  但請記住,大多數實際場景不會接近128個線程。即使是英特爾的旗艦i9 10900k都只是提供20個並發線程。不過,編寫多線程代碼意味著提供多個內核的設備可以同時發生多個任務。

  3. 線程如何影響應用程式

  即使你不依賴先進的人工智慧,但幾乎所有的MR應用都在某種程度上使用物理。例如,Hand Menu菜單中的按鈕會使用物理來檢測指尖何時接觸按鈕的表面。

  

  但遠比物理更重要的是渲染。

  幾乎所有的遊戲引擎(包括Unity)都依然依賴於單線程進行渲染。沒錯,只有一個線程可以在屏幕上繪製。即使是超底層的Directx API都只支持在輔助線程上排隊命令。相關命令依然需要發送到渲染線程進行繪製。這是一個特別的線程。

  

  正如你可以想像的那樣,從渲染線程獲取代碼可以釋放引擎以繪製內容。你將獲得更高的幀速率,看到更少的卡頓和頻閃。你的應用程式會感覺更加高響和穩定。

  

  4. 好吧,所以不要在Render Thread運行代碼嗎?

  這聽起來顯然像是在逃避,不是嗎?但事實證明,Render Thread是所有代碼運行的默認位置。不僅如此,在Render Thread運行代碼是不可避免的事情。為了說明原因,我們下面來看看一個基本的Unity立方體。

  

  使得立方體成為立方體的主要原因之一是稱為網格渲染器(Mesh Renderer)的行為。網格渲染器做什麼?當然,它繪製立方體。換句話說,為了使一個Unity立方體成為一個立方體,它必須存在於Render Thread之上。

  

Unity通常將Render Thread稱為主線程、應用線程、以及UI線程。請注意,它們都是同一個意思。

  5. coroutine(協程)與線程

  當Unity開發者發現coroutine時,大多數人認為他們已經發現了多線程。遺憾的是,事實遠非如此。

  Unity負責一位coroutine的博士指出:coroutine就像一個函數,它可以暫停執行並將控制權返回給Unity,但然後會在下一個幀中繼續執行。

  重要的是要意識到coroutine依然是在Render Thread上運行。

  想像一下一個簡單的Unity應用程式在這樣的循環中運行:

  

  如果行為A啟動兩個coroutine,則循環將簡單地更改為:

  

  coroutine和正則函數的唯一區別在於,coroutine的一部分可以在幀之間掛起。掛起時會包含存在關鍵字yield的任何行。儘管這可能會騰出時間讓其他任務運行,但編寫糟糕的coroutine依然非常容易給Render Thread造成巨大的負載。

  

coroutine異常:你知道在coroutine出現異常會發生什麼嗎?可能不是你想像的那樣。異常不會停止應用程式,甚至不會禁用Behavior。唯一發生的事情是,coroutine從更新循環中unscheduled。Behavior不會注意到錯誤,甚至不知道coroutine已經被unscheduled。

  由於coroutine不是並發運行,所以最好把它看作是一個時間切片機制。它們不是真正的多線程。

  6. Thread.Start又如何?

  我們終於聊到多線程的第一個實際選擇。System.Threading.Thread實際上代表一個線程,而調用Thread.Start將導致任務在所述線程並發運行。

  但對於Thread類,你需要理解Thread類的實例表示一個能夠執行工作的對象,而不是請求完成工作。許多函數可以安排在Thread上運行,而等待Thread完成並不一定意味著函數成功完成。例如,異常可能會發生。

  正是由於這些原因,通用Windows Platform(HoloLens運行的平臺)甚至不包括System.Threading.Thread。相反,UWP提供了一種名為ThreadPool的元素,其中各個工作項可以進行scheduled。

  在本文中,我不打算討論Thread或ThreadPool,因為我希望重點討論另一種方法。不過,我還是想簡單地講講這些問題,因為過去使用Thread的Unity開發者會由於代碼無法為HoloLens編譯感到困惑或沮喪。Thread類可能會被添加到UWP的未來版本中,但我希望證明即使它可用,我們仍然有更好的模式可以遵循。

  7. 回調中的「貓膩」

  什麼是回調?維基百科將回調定義為:作為參數傳遞給其他代碼的任何可執行代碼…這個執行…可能會在稍後的異步回調中發生。

  編寫「經典」多線程代碼的開發者非常熟悉回調,因為一旦你開始並發運行代碼,不知何故你需要知道它是於何時完成。

  下面是一些關於回調如何工作的偽代碼:

  

  但如果代碼永遠都沒有完成呢?如果因為文件被鎖定或數據損壞而在第9行引發異常怎麼辦呢?

  回調永遠不會被調用。

  如果沒有額外的編碼,應用程式將永遠不會知道發生了錯誤。就應用程式所知,LoadData已成功運行。這是因為異常沒有發生在LoadData中,而是發生在LoadData創建的線程中。

  對於嘗試編寫和調試多線程代碼的開發者來說,不停止(orphan)的回調一直是痛苦的根源。簡而言之,這是因為請求、工作和結果是完全分離的。

  

回調與事件:請注意,回調模式有時可以作為事件實現。Azure Spatial Anchors在搜索錨點時會執行這一操作。應用程式調用CreateWatcher開始搜索,當找到錨定時,結果將通過AnchorLocated事件傳回。這有時會導致意想不到的情況。例如,如果在伺服器上撤銷了錨定,則AnchorLocated事件將以NotLocateDanchordesNotExist的狀態觸發。另外,如果發生網絡錯誤,應用程式不會知道,除非它同時訂閱了Error事件。我並不是說這是一個糟糕的設計(見下文),但顯然,成功地使用基於事件的回調系統需要了解哪些情況會導致哪些事件。

  8. 什麼是跨線程調度(scheduling)?

  讓我們再看看之前的偽代碼:

  

  你注意到第12行對loadCompleted的調用實際上是在worker線程中執行的嗎?如果我們想在數據加載後可視化,這會成為一個問題。請記住,loadCompleted是在worker線程上運行的,但我們只能在Render Thread創建GameObject。這就需要跨線程scheduling。

  在Azure Spatial Anchors for Unity示例中,你可以找到一個名為UnityDispatcher的腳本。UnityDispatcher允許在任何線程上運行的代碼請求該代碼在Render Thread上運行。你甚至可能在沒有意識到的情況下看到了這一點。

  以下是OnCloudAnchorLocated handler的代碼片段:

  

  每當ASA定位到一個錨時,AnchorLocated事件將在worker線程上觸發。如果應用程式只需將消息寫入日誌,則可以接受這個worker線程。事實上這是更好的選擇。但這個應用程式需要生成一個GameObject或移動一個現有的GameObject,這兩個操作只能在Render Thread上進行。InvokeOnAppThread表示「我知道我已經在一個worker線程,但我需要調用在Render Thread運行的代碼」。

  9. Unity的跨線程調度

  儘管所有多線程系統都有自己的scheduling方式,但Unity的方法有點不尋常。據我所知,Unity沒有提供直接的API來調度渲染線程上的工作。他們提供的是一種間接的方式。

  UnityDispatcher保留了需要在Render Thread上運行的命令的列表。當一個worker線程調用InvokeOnAppThread時,這只會將代碼添加到列表中。當應用程式啟動時,UnityDispatcher將自己註冊為coroutine。然後在每個幀上,UnityDispatcher檢查列表中是否有任何內容。如果是這樣,所述代碼將作為UnityDispatcher的Update例程的一部分執行。

  UnityDispatcher沒有綁定到Azure空間錨,因此你可以複製該類並在任何項目中使用它。如果沒有ASA,你也可以從GitHub上的ThreadUtils項目中獲取這個類的副本。

  10. Task-based Programming

  

針對C++開發者的說明:我將要開始討論Task-based Programming。我將介紹一個名為Task的C#,但你不會在C++ / WinRT中找到Task。相反,C++開發者使用IasyccAct之類的接口,而當從C#調用時,這些接口會自動轉換為Task。更多信息請參閱這裡。

  如上所述,調試多線程代碼非常困難,因為請求、工作和結果都是相互分離的。但我向你承諾過一個更好的方法,我想現在是時候討論它了。

  許多開發者都知道Task-based Programming,但很少有人真正了解它在幕後的工作原理。Task-based Programming統一了我們前面討論過的概念,大大減少了多線程代碼中出錯的機會。下面我們來看看Task-based Programming是如何簡化線程、回調和跨線程scheduling。

  11. Auto Threading

  在C#中,每當一個函數被async關鍵字修飾時,我們告訴編譯器的是「這個代碼可以在另一個線程上運行」

  讓我們來看看將數據保存到文件中的一些偽代碼:

  

  在本例中,打開文件、寫入字節和關閉文件都將在worker線程上執行。

  這個神奇的worker線程是什麼時候創造出來的呢?它是在使用await操作符時創建的。

  如果我們的示例應用程式具有以下代碼行:

  

  這相當於:

  

  異步函數中的代碼確實在新線程上運行。但你的應用程式不需要知道這些細節,也不需要太多地關注。

  更妙的是,正如史蒂芬·圖布(Stephen Toub)常常說的:「等待的一個美妙之處就是它能把你帶回原來的地方」。讓我們看看這句話在另一個代碼示例中的含義吧:

  

  我們知道這段代碼是從Render Thread開始的,因為它是對按鈕點擊的響應。所以在第4行與GameObject交互是有意義的。但我們同時知道,第7行的await關鍵字啟動了一個新線程。所以,如何才能與第10行和第11行的GameObjects交互呢?

  答案是一個叫做SynchronizationContext的元素。簡而言之,無論何時使用await,編譯器都會記住在worker線程啟動之前有哪個線程正在運行。編譯器同時會在worker線程完成後立即處理返回Starting Thread的操作。是的,await自動處理跨線程scheduling。

  

重要提示:await永不加塞。看起來像是await妨礙了Starting Thread,但這只是編譯器的錯覺。await之前的所有內容都是內聯運行,而且await之後的所有內容都由調度程序運行。當Task在另一個線程中運行時,Render Thread就是這樣保持繪製的。

  12. 跟蹤工作

  正如我在Thread.Start一節指出地那樣:線程表示一個能夠執行工作的對象,而不是請求完成工作。這是Task-based Programming的另一個亮點。任何Task實例實際上都表示一個要完成的工作的請求。這正是Task類擁有IsCompleted和IsFaulted之類的屬性。

  13. 數據與異常

  我在上面提到回調和事件可以在worker線程完成時返回數據。我同時提到了worker線程上的異常通常意味著回調不運行或事件不觸發。Task-based Programming通過將數據作為請求本身的一部分來解決這個問題。

  讓我們來看看相同的LoadData函數,但我們將其作為Task而不是回調來實現:

  

  讓我們假設第7行執行一些數據反序列化。大多數時候,這一切都很好,但偶爾我們的應用程式會打開一個損壞的文件,第7行會出現一個異常。請記住,這個異常是在worker線程上引發的。那麼,Starting Thread如何處理這個異常呢?比你想像的要簡單:

  

  當我們等待一個Task並且該Task成功時,來自該Task的任何數據都將返回到Starting Thread。但是,如果我們等待一個Task,並且在Task內部發生了異常,該異常將傳播回Starting Thread,就像它是內聯發生一樣。換句話說,在Task中處理異常和在任何普通函數中處理異常都是一樣的。

  希望大家能夠開始明白為什麼Task-based Programming會使多線程變得更容易。Task-based Programming提供了一個單一的統一模型。在這個模型中,請求、工作和結果都真正地相互關聯。

  14. 當撤銷(Cancellation)非常重要的時候

  在某些情況下,Task可能會運行很長時間。例如,在慢速網絡上下載大文件時。在這些場景中,使Task變得可撤銷通常會很有幫助。可以通過將CancellationToken傳遞到異步函數來實現。然後,在運行一會後,所述函數可以在執行更多操作之前檢查Token是否已撤銷。

  下面是所述函數的可能樣子:

  

  儘可能頻繁地檢查CancellationToken非常重要,這樣可以快速撤銷Task。調用ThrowIfCancellationRequested時,如果Token已被撤銷,則整個Task以OperationCanceledException結束。

  既然我們已經看到Task可以撤銷,下面我們來想像一下使用Task的Azure Spatial Anchors:

  

  我並不是建議ASA應該停止使用事件而開始使用Task。ASA可以同時搜索多個錨,而ASA從不知道何時(甚至是否)定位錨。事件在這種情況下的效果很好,只要你知道什麼時候觸發了哪些事件。但是,除了事件之外,添加對Task的支持可以幫助簡化許多常見的場景。

  15. coroutine還是有一席之地的

  既然我們已經知道Task的作用,有人可能會問為什麼我們要用其他方式編寫代碼。但請記住,Task在worker線程上運行,而GameObject只存在於Render Thread上。這就是coroutine的意義所在。

  coroutine在Render Thread上運行,但可以將時間返回到渲染器。訣竅是在yielding之前確定工作量。太少會需要很長時間,而太多則會導致應用程式沒有響應。

  讓我們想像一個能夠接收數據並用GameObject可視化的coroutine吧:

  

  為了保持60 FPS,應用程式需要在大約16毫秒內渲染幀。我們假設我們的應用程式需要4毫秒來渲染。剩下的12毫秒可以用來創建GameObject。

  如果第10行需要2毫秒,我們就會剩下6毫秒的容量。不僅如此,我們的應用程式每幀只能創建一個GameObject。

  在本例中,更好的實現可能如下所示:

  

  在C#中,%運算符計算餘數。所以這裡我們說的是「每6個對象之後,把時間還給渲染器。」6個對象x每個對象2毫秒=12毫秒(正好是我們的預算)。

  顯然,這個數字對於每個應用程式而言都是獨一無二,並且會隨著時間的推移而變化。應用程式可能會變得更加複雜,需要更長的時間來渲染。或者每個單獨的GameObject可能會變得更複雜,需要更長的時間來創建。沒有神奇的數字。要達到正確的平衡,你需要花時間分析性能。

  16. 將coroutine視作Task

  所以coroutine有自己的用武之地,但現在我們有兩種不同的方法來處理長時間運行的代碼。不僅如此,除非我們實現某種回調,否則應用程式將不知道VisualizeRoutine何時完成(我們已經知道回調中的「貓膩」)。如果我們能把coroutine當作Task來對待,那不是很好嗎?

  有一個名為TaskCompletionSource的類允許你將任何長時間運行的進程表示為一個Task。具體如下:

  在一個長時間運行的流程開始時,創建TaskCompletionSource。

  使用TaskCompletionSource.Task表示長時間運行的過程。

  完成後,使用TaskCompletionSource.SetResult返回數據。

  如果進程遇到錯誤,請使用TaskCompletionSource.SetException來傳播異常。

  我們可以很容易地修改VisualizationRoutine以接收TaskCompletionSource,並在完成後返回一些數據:

  

  剩下的只是啟動coroutine並返回Task的helper函數:

  

  17. coroutine中的異常處理

  如果你仔細觀察,你可能已經注意到上面的coroutine中有一個非常重要的遺漏。如果在第26行之前產生異常會發生什麼事情呢?

  遺憾的是,coroutine不能提供與async相同的編譯器效果。coroutine中沒有自動異常傳播,這意味著如果我們不處理異常,我們將以產生一個不停止的Task。任何等待Task的代碼將永遠不會恢復。如果你認為這聽起來很像是一個不停止的回調,你絕對正確。

  你說:「沒問題。我把所有一切都打包到一個try/catch block中。」

  可能看起來像這樣:

  

  這正是你要做的事情,除了現在第24行生成了一個CS1626編譯器錯誤。

  

錯誤CS1626無法在帶有catch clause的try block中生成值。

  CS1626出現的原因非常複雜,但你只需知道你不能將try/catch放在任何使用yield的行中。這給我們留下了兩個可能的選擇:

  在任何非yield行周圍放置多個try/catch block。

  在IEnumerator周圍放置try/catch

  選項1最簡單,但並非所有情況下都有效。例如,你不能將try/catch放在foreach語句周圍,因為foreach語句包含一個yield。

  但我們如何實現選項2?通常,IEnumerator直接傳遞到startRoutine。

  遺憾的是,事情變得麻煩起來。IEnumerator接口有一個屬性和兩個函數。我們必須確保,若任何part-IEnumerator產生異常,我們就將結束Task。

  為了幫助解決這個問題,我創建了ExceptionSafeRoutine。你可以在GitHub的AsyncUtils.cs中找到它。ExceptionSafeRoutine接受一個IEnumerator和一個TaskCompletionSource。如果在IEnumerator中引發任何異常,則在TaskCompletionSource設置該異常。還有一個擴展方法可以將任何IEnumerator轉換為ExceptionSafeRoutine。

  最後,我們更新Visualization Async以確保Task始終完成:

  

  這種方法的酷炫之處在於,任何異常都會被傳播。即使協程沒有try/catch block。這使得coroutine的工作方式就像async一樣。我們唯一要記住的是,在開始一個coroutine時添加.WithExceptionHandling。

  18. 總結

  如果你看到最後,希望你能夠向我分享你的想法。你是否學到什麼呢?有什麼我需要補充或者遺漏的嗎?或者你有什麼其他更好的方案嗎?

相關焦點

  • 今日起,有關AI/AR/VR/MR的知識你一定要知道
    ar 其次,AR。Augmented Reality:增強現實的簡稱。 vr 第三,VR。Virtual Reality:虛擬實境的簡稱。
  • VR和AR的未來發展
    vr/ar的應用什麼是虛擬實境?虛擬實境技術(vr)是一種能夠創造和體驗虛擬世界的計算機仿真系統,它使用計算機生成一個模擬環境,它是多源信息融合、交互式三維動態場景和實體行為的系統仿真,使用戶能夠沉浸在環境中,什麼是AR?
  • vr又稱靈境技術,是模擬虛擬環境中角色的真實表現
    vr在虛擬環境中構建交互虛擬世界,運用真實的人機互動手段,創造和構建具有真實感和臨場感的虛擬世界。vr裝置類產品目前主要涉及電商,醫療健康,新零售,廣告,旅遊,房產等行業領域。通過vr設備獲取用戶的真實信息,並通過ar立體化技術將用戶的信息3d化,再根據需要列印成vr產品,產品可擺放在用戶面前就可以直接觀看和使用,用戶可根據需要進行身體和頭部的轉動和旋轉,且隨時可以攜帶。主要用戶可以在遊戲中打怪,聽音樂,與虛擬世界中的人進行交互,獲取虛擬世界的信息反饋等等。通過「vr+ar」這一創新營銷模式,可以實現消費者體驗到ar應用的內容,ar應用可使消費者感受到真實的虛擬的感覺。
  • 「軟帝學院」Java挑戰者專欄:多線程詳解2
    多線程的問題?我們也可以給線程設置分組B:案例演示MyRunnable mr = new MyRunnable();Thread t1 = new Thread(mr, "張三");Thread多線程(線程的五種狀態)(掌握)看圖說話新建,就緒,運行,阻塞,死亡多線程(線程池的概述和使用)(
  • VR,AR,MR傻傻分不清楚?驅動哥十分鐘教你區分
    VR是Virtual Reality的縮寫意思是虛擬實境指利用計算機圖形系統和現實及控制等接口設備,在計算機上生成的、可交互的三維環境中提供沉浸感覺的技術最早的 VR遊戲類似《峽谷過山車》對於所有VR愛好者,初學者和有經驗的用戶都是一個很好的VR體驗。
  • 技術科普:VR、AR、MR的區別
    原標題:技術科普:VR、AR、MR的區別 近日, 獲得谷歌5億美元融資的技術公司Magic Leap在WSJD展會中放出了一段實錄視頻,引起不小騷動。如今,也有媒體稱他們為MR公司,那麼VR、AR、MR之間到底有什麼區別呢。
  • 微軟HoloLens光學架構師詳述AR/VR/MR數字光學元件和技術
    來源:映維網 作者 吳羽樺 伯納德·克雷斯(Bernard Kress)是微軟HoloLens光學架構師(Partner職級)。他在10年代的初期主要是擔任谷歌眼鏡的首席光學架構師,但於2015年來到了微軟,並一直從事HoloLens混合現實智能頭顯的研發工作。
  • Linux多線程編程和Linux 2.6下的NPTL
    這幾天由於工作需要,琢磨了一下Linux下的多線程的相關資料。Linux下最常用的多線程支持庫為 Pthread庫,它是glibc庫的組成部分。但是關於Pthread的說明文檔非常缺乏,特別是對POSIX多線程規範的介紹以及pthread庫中多線程實現方式的介紹實在是少之又少。而多線程編程對於系統程式設計師而言是必須掌握的技術,因此總是讓學習中的程式設計師覺得頭痛不以。
  • 科普AI/AR/VR/MR,這些黑科技縮寫你要知道!
    vr自助機第三,VR。Virtual Reality:虛擬實境的簡稱。VR最先應用在遊戲、休閒娛樂領域,隨著技術被廣泛應用在更多的行業和領域:vr+安全、vr+教育、vr+黨建等。最後,MR。Mixed Reality:混合現實的簡稱。 利用MR技術,用戶可以看到真實世界,同時也會看到虛擬的物體。MR將虛擬物體置於真實世界中,並讓用戶可以與這些虛擬物體進行互動。
  • 科學網—微軟亞太研發集團與上海交大分享雲計算人才培養經驗
    本報訊 近日,由微軟亞太研發集團和上海交通大學共同舉辦的「微軟—上海交通大學雲計算培訓研討會」在上海閉幕。
  • 微軟MR 頭顯評測:即插即用的平民 VR 體驗到底如何?
    在 VR 隨著一度風生水起的線下體驗店一起徹底消失在大眾的視野前,微軟終於決定出手拯救這顆科技圈裡曾經的未來之星。只不過在微軟這裡,它把原來的 Holographic 改稱做 MR,Mixed Reality,虛擬實境就被囊括其中,和 AR 技術並列,終極目標是像 HoloLens 那樣,打破虛擬和現實的界限。
  • 解密顯示新視界:VR、AR與MR
    長久以來,虛擬實境(VR)不可避免地一直朝著商用化發展,因此,如今出現了商用VR也並不足為奇,或許只能說是消費者的預期心理期望更勝於技術本身。qYiednc而另一個不可避免的發展趨勢或許可說是市場的細分化,各種「現實」(Reality)顯示技術被區分為VR、增強現實(AR)、混合現實(MR),以及包括VR、AR和MR等各種相關技術的統稱——延展現實(XR)。
  • 經驗分享!資深程式設計師大佬告訴你,如何成為一個C++高級程式設計師
    我想把我自己的經驗分享給大家,希望幫助新人少走些彎路。在此我們不討論具體的技術細節,只說我們應該學習什麼東西。一、技術能力1. 語言我們要成為一個程式設計師,學的東西會很多很雜,但是最開始一定要從語言開始學習,而學習語言最關鍵的莫過於選好一本書,學校的教材就算了,根本沒 有寫得好的。
  • 超越現實 不僅遊戲 VR/AR/MR應用一覽
    而在MR(Mixed Reality,混合現實)領域,微軟Hololens為首的產品隨後又進一步推進了人類超越現實的腳步。但這並不代表行業式微,相反經過時間和市場的大浪淘沙,剩下的這些公司已真正將技術實用化,很多僅局限於遊戲娛樂領域或者賣概念的公司都已經消亡。在看似平靜的環境之下,VR、AR、MR三大技術其實愈加成熟。隨著HTC Vive、Facebook Oculus、索尼、微軟等軟硬體廠商共同發力,讓視界超越現實已不再僅僅局限於遊戲中,而是逐漸走向了人們生活的各個方面。
  • AI、AR、VR、MR 到底是什麼?
    它是研究、開發用於模擬、延伸和擴展人的智能的理論、方法、技術及應用系統的一門新的技術科學。 人工智慧是計算機科學的一個分支,它企圖了解智能的實質,並生產出一種新的能以人類智能相似的方式做出反應的智能機器,該領域的研究包括機器人、語言識別、圖像識別、自然語言處理和專家系統等。
  • vr全景技術是指什麼看了就知道
    打開APP vr全景技術是指什麼看了就知道 酷雷曼VR全景 發表於 2020-12-01 11:07:14   很多朋友剛接觸到vr全景時都會非常疑惑vr全景技術是指什麼,對於小白而言的確很難能夠搞明白。
  • 《AR/VR/MR光學元件和顯示器-2020版》
    、廠商和市場的最新報告,覆蓋了擴展現實產品中應用的所有光學元件和顯示技術。如今,它們已然成為真正面向未來的新技術。IDTechEx通過對AR/VR/MR光學元件和顯示市場關鍵廠商及技術的深入分析,在報告中為用戶提供了該領域未來十年的技術和市場趨勢。
  • 微軟的應用程式《Sketch 360》可以讓你快速原型化VR場景
    微軟的應用程式和服務孵化器看起來正在通過其最新項目《Sketch 360》再次成為熱門話題。新的應用程式《Sketch 360》是一個新的繪圖應用程式,它似乎利用了Windows 10和其他第三方對3D創作的支持。
  • 基於VR/AR/MR的複雜產品可視化平臺技術
    【試驗工程師·公益學習營】第九期第3講【試驗工程師·公益學習營】總第43講,於2020年11月6日如期舉行,本期講師是北京真景科技有限公司總經理兼創始人吳亞西,吳老師是計算機圖形學與虛擬實境技術專家,主要研究方向為虛擬實境技術在高端製造業的應用。