亚洲精品久久久久久久久久久,亚洲国产精品一区二区制服,亚洲精品午夜精品,国产成人精品综合在线观看,最近2019中文字幕一页二页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

NVIDIA Omniverse USD插件開發(fā)中的UI卡頓問題復(fù)現(xiàn)及分析

麗臺科技 ? 來源:麗臺科技 ? 2025-11-03 15:17 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

UI 卡頓問題復(fù)現(xiàn)及分析

在進行 NVIDIA Omniverse USD 插件開發(fā)的時候遇到了一個性能卡頓的問題,這個功能的初衷是通過路徑追蹤和原始的綠幕視頻,借助 Omniverse Farm 來實現(xiàn)高質(zhì)量的后期自動化流程,實現(xiàn)思路是記錄相機定位 FreeD 的運動軌跡,并記錄保存到一個 USD 的 sublayer 當(dāng)中,根據(jù)時間碼(Timecode)進行后期自動化合成的流程,流程圖如下:

dd8a5bde-b4ac-11f0-8c8f-92fbcf53809c.png

在外部攝影機記錄原始的綠幕影片素材的時候,點擊開始 / 結(jié)束分別會觸發(fā)一個時間碼 (Timecode)的信號,信號可以在 BMD 采集卡當(dāng)中通過 SDK 獲得,這樣我們把從開始到結(jié)束的相機定位軌跡記錄存至 buffer 中,然后更新到 USD 的 stage sublayer 中。

首先通過 Python API 創(chuàng)建一個 Sublayer,把記錄的 sequence 通過 USD time sampler 記錄到相機 prim 的 attribute 下面,僅對一萬個 time sampler 進行記錄并統(tǒng)一寫入該 sublayer,后觀察到該寫入過程耗時達數(shù)十秒,且造成 Omniverse 主線程 UI 出現(xiàn)卡頓。經(jīng)測試,無論采用同步、異步 AsyncIO 或線程方式執(zhí)行操作,均未使情況得到改善,UI 卡死現(xiàn)象始終存在。(可以查看代碼文件中注釋的 1、2、3)

Tracy.py 的源代碼如下:

importomni.kit.app
importtime
importasyncio
frompxrimportSdf, Usd, UsdGeom, Gf
fromomni.kit.usd.layersimportLayerUtils, get_layers, LayerEditMode
importomni.kit.commands
fromcollectionsimportdeque
importos
fromtypingimportList,Tuple
fromomni.kit.widget.layers.path_utilsimportPathUtils
importcarb
fromtypingimportList,Tuple
fromenumimportEnum
importasyncio
frompxrimportSdf, Usd, UsdGeom
frompxrimportUsd, UsdGeom, Gf
fromomni.kit.async_engineimportrun_coroutine
fromconcurrent.futuresimportALL_COMPLETED, ThreadPoolExecutor, wait


defcreate_prim(stage, prim_path="/World/Camera"):
  prim = stage.GetPrimAtPath(prim_path)
 ifprimandprim.GetTypeName() =="Camera":
    carb.log_info(f"Camera already exists at:{prim_path}")
   returnprim
 else:
    camera_prim = UsdGeom.Camera.Define(stage, prim_path)
    camera_prim.AddTranslateOp().Set(Gf.Vec3d(10,20,30))
    camera_prim.AddRotateXYZOp().Set(Gf.Vec3f(0,45,0))
    carb.log_info(f"Created new Camera at:{prim_path}")
   returncamera_prim.GetPrim()
 
classTestClass:
 def__init__(self):
    self._rotate_queue = deque()
    self._translate_queue = deque()
    self._pts_queue = deque()
    self._pts =0
    self._Layer_num =0


 defcreate_sublayer(self, _root_layer, strLayerName, orderIndex, bSetAuthoring):
   #layname =
    self._Layer_num +=1
    identifier1 = LayerUtils.create_sublayer(_root_layer, orderIndex, strLayerName).identifier
   #
   ifbSetAuthoring:
      omni.kit.commands.execute("SetEditTargetCommand", layer_identifier=identifier1)


 defprepare_data(self):
    begin = time.time()
    rotation_1 = Gf.Vec3f(0.0,0.0,0.0)
    _translate = Gf.Vec3d(0.0,0.0,0.0)
   for_inrange(10000):
      self._rotate_queue.append(rotation_1)
      self._translate_queue.append(_translate)
    end = time.time()


    carb.log_info(f"prepare_data elaspe:{end - begin}")


 asyncdefawait_flush_save(self):
    carb.log_info("before await_flush_save {time.time()}")
   awaitomni.kit.app.get_app().next_update_async()
    self.flush_save()
    carb.log_info("end await_flush_save {time.time()}")


 defflush_save(self):
    timecode =0
   whileself._rotate_queueorself._translate_queue:
     ifself._rotate_queue:
        f_val = self._rotate_queue.popleft()
        self._rotation_ops.Set(time = timecode, value = f_val)
     ifself._translate_queue:
        d_val = self._translate_queue.popleft()
        self._translate_ops.Set(time = timecode, value = d_val)


      timecode +=10


    self._render_update_sub =None


 asyncdefawaitflush(self):
   awaitomni.kit.app.get_app().next_update_async()
    self.flush_save(self)


 asyncdefflush_save_async(self):
    time0 = time.perf_counter()
    carb.log_info("flush_save_async begin")
    loop = asyncio.get_running_loop()
   # 直接調(diào)用同步函數(shù)(主線程),但用await asyncio.sleep(0)切分事件循環(huán)
   awaitloop.run_in_executor(None, self.flush_save)
    time1 = time.perf_counter()
    carb.log_info(f"flush_save_async end elaspe:{time1 - time0}")


 definit_stage_camera(self, stage, camera_prim_path):
    self._stage = stage
    self._camera_path = camera_prim_path
    self._camera_prim = UsdGeom.Camera.Get(stage, camera_prim_path).GetPrim()
    xform_ops = UsdGeom.Xformable(self._camera_prim).GetOrderedXformOps()


   foropinxform_ops:
       ifop.GetOpType()in[UsdGeom.XformOp.TypeRotateXYZ,
            UsdGeom.XformOp.TypeRotateXZY,
            UsdGeom.XformOp.TypeRotateYXZ,
            UsdGeom.XformOp.TypeRotateYZX,
            UsdGeom.XformOp.TypeRotateZXY,
            UsdGeom.XformOp.TypeRotateZYX]:
         #rotation = op.Get()
          self._rotation_type = op.GetOpType()
          self._rotation_ops = op
         #print(f"rotation is {rotation}")
       elifop.GetOpType() == UsdGeom.XformOp.TypeScale:
          self._scale_ops = op
       elifop.GetOpType() == UsdGeom.XformOp.TypeTranslate:
          self._translate_ops = op


if__name__ =="__main__":
  _stage = omni.usd.get_context().get_stage()
  root_layer = _stage.GetRootLayer()
  prim_path ="/World/Camera"
  new_layer_path ="d:/camera_sublayer.usd"
  runclass = TestClass()
 
  create_prim(_stage, prim_path)
  runclass.init_stage_camera(_stage, prim_path)
  runclass.create_sublayer(root_layer, new_layer_path,0,True)
  runclass.prepare_data()
 
  begin = time.time()
  carb.log_info(f"before run coroutine")
 #(1)Async block UI for about 50 seconds
  run_coroutine(runclass.await_flush_save())
 #(2)Also block UI about 50 seconds
 # with ThreadPoolExecutor() as executor:
 #   executor.submit(runclass.flush_save())
 #(3)Sync, same block
 #self.flush_save()


  end = time.time()
  carb.log_info(f"elaspe time is{end-begin}, 10000 ends")

* 附代碼鏈接:https://github.com/slayersong/OVPerf_Tracy/blob/main/tracy_profiler.py(復(fù)制鏈接至瀏覽器打開)

復(fù)現(xiàn)問題:打開菜單中的Developer --Script Editor,打開 tray_profiler.py 文件,然后點擊 Run,可以看到創(chuàng)建了一個 camera_sublayer,并且主 UI 卡住了幾十秒無響應(yīng)。

需要注意的是,在 Omniverse USD 的 layer 層級繼承覆蓋當(dāng)中,在上層的 Layer 的行為會覆蓋下層的 layer,關(guān)于 USD layer 層級的關(guān)系,請查看本文結(jié)尾提供的 DLI 課程鏈接。

dde56ed4-b4ac-11f0-8c8f-92fbcf53809c.png

然后在 Content Browser 中單擊鼠標(biāo)右鍵,選擇 Edit,可以看到數(shù)據(jù)成功寫入了 USD 文件,只是中間卡頓的時間過長。

de3a43b4-b4ac-11f0-8c8f-92fbcf53809c.png

分析:在遇到 Profiler 的時候不要盲猜,可能是 memory、IO Bound、Compute Bound 或者一些不太能想到的情況,這時候則需要利用專業(yè)化的工具進行分析定位,找到問題所在并解決,比如可以利用著名工具Tracy(https://github.com/wolfpld/tracy),該工具可以分析 CPU / GPU 性能瓶頸,并支持主流 Graphics API:DX、Vulkan、OpenGL、CUDA 等,且 Omniverse 已經(jīng)把該工具與 Omniverse Kit 進行了集成。因此可以利用 Tracy 去看底層的 CallStack 里什么影響了這個操作,在 Omniverse 當(dāng)中,Tracy 已經(jīng)配置好了 Symbol 符號表, 可以看到底層的代碼函數(shù)調(diào)用堆棧,后而尋找具體是什么情況卡住了不正常的幾十秒時間。

Tracy 的使用

2.1 操作介紹

Omniverse 已經(jīng)集成了 Tracy 的開發(fā)集成插件:https://docs.omniverse.nvidia.com/extensions/latest/ext_profiler_tracy.html

Tracy 本身是一個著名的分析工具,具體的菜單操作可以參考知乎這個帖子:https://zhuanlan.zhihu.com/p/1915041165033607442

UI 操作的詳細講解可參考如下視頻:

Tracy 講解文檔

視頻參考:

https://www.bilibili.com/video/BV1or421J7Du/?spm_id_from=333.337.search-card.all.click

文檔參考:

https://github.com/CppCon/CppCon2023/blob/main/Presentations/Tracy_Profiler_2024.pdf

2.2 安裝

首先打開菜單 Developer -- Extension 搜索,找到 Profiler Tracy 并且安裝。

de9610ea-b4ac-11f0-8c8f-92fbcf53809c.png

然后會出現(xiàn)一個新的 Profiler 菜單,點擊 Profiler --Tracy --Launch and Connect。

deea4f66-b4ac-11f0-8c8f-92fbcf53809c.png

Tracy 基本使用操作:

1. Pause:在實時監(jiān)測到發(fā)生性能瓶頸的事件以后要暫停,否則時間軸會一直向右走

2. 按住鼠標(biāo)右鍵可以拖動到你想要的位置

3. 鼠標(biāo)滾輪:Zoom in / out

2.3 分析問題

運行上述代碼,點擊 Tracy 中的 Pause 暫停(不暫停 Tracy 會一直記錄的一直滾動)。之后按住 Ctrl 和鼠標(biāo)中間的滾輪,Zoom 縮小操作,可以很容易找到一個最大的耗時,從 11 秒開始到 31 秒,這一個 Frame Render 用了二十幾秒(注意:函數(shù)的調(diào)用堆棧已經(jīng)正確顯示),可以發(fā)現(xiàn)卡在了 RenderThread 中的usd_mutex_wait函數(shù)上面:

df4b994c-b4ac-11f0-8c8f-92fbcf53809c.png

這樣通過 Tracy 的使用就明白了問題卡住的大致原因,簡而言之,渲染線程會等待 USD 寫入的結(jié)束,一直卡在usd_mutex_wait。

2.4 解決問題

分析:該問題的本質(zhì)其實是 USD 的寫入與修改會非常的慢,這是 USD 的基礎(chǔ)架構(gòu)造成的。

單單針對這個問題解決的方法不復(fù)雜,可以思考一下,寫入的 Sublayer 其實并不需要實時參與 USD Composite, 因為我們并不需要實時觀察到合成結(jié)果,可以創(chuàng)建離線的 Sublayer ,等待寫入結(jié)束以后再自動或者手動把 Sublayer 加入進來,代碼如下,看到并沒有卡頓這一個過程,那么問題就解決了。

針對此次問題的 Solution 如下:

importomni.kit.app
importtime
importasyncio
frompxrimportSdf, Usd, UsdGeom, Gf
fromomni.kit.usd.layersimportLayerUtils, get_layers, LayerEditMode
importomni.kit.commands
fromcollectionsimportdeque
importos
fromtypingimportList,Tuple
fromomni.kit.widget.layers.path_utilsimportPathUtils
importcarb
fromtypingimportList,Tuple
fromenumimportEnum
importasyncio
frompxrimportSdf, Usd, UsdGeom
frompxrimportUsd, UsdGeom, Gf
fromomni.kit.async_engineimportrun_coroutine
fromconcurrent.futuresimportALL_COMPLETED, ThreadPoolExecutor, wait


defcreate_prim(stage, prim_path="/World/Camera"):
  prim = stage.GetPrimAtPath(prim_path)
 ifprimandprim.GetTypeName() =="Camera":
    carb.log_info(f"Camera already exists at:{prim_path}")
   returnprim
 else:
    camera_prim = UsdGeom.Camera.Define(stage, prim_path)
    camera_prim.AddTranslateOp().Set(Gf.Vec3d(10,20,30))
    camera_prim.AddRotateXYZOp().Set(Gf.Vec3f(0,45,0))
    carb.log_info(f"Created new Camera at:{prim_path}")
   returncamera_prim.GetPrim()


classTestClass:
 def__init__(self):
    self._rotate_queue = deque()
    self._translate_queue = deque()
    self._pts_queue = deque()
    self._pts =0
 
 defregis(self):
    self._app = omni.kit.app.get_app()     
    self._render_update_sub = self._app.get_update_event_stream().create_subscription_to_pop(
    self.pre_frame_render, order=-10, name="gm_render_event")
 
 defpre_frame_render(self,e):
    self._pts +=1
    self.get_push_pos_rotate(self._pts)
   
   ifself._pts ==1000:
      begin = time.time()
      carb.log_info(f"before run coroutine")
      run_coroutine(self.await_flush_save())
     #self.flush_save()
      carb.log_info(f"end run coroutine")
      end = time.time()
      carb.log_info(f"elaspe time is{end-begin}")
      self._render_update_sub =None
 
 defget_push_pos_rotate(self, pts):
    rotae = self._rotation_ops.Get()
    translate = self._translate_ops.Get()
   
    self._rotate_queue.append(rotae)
    self._translate_queue.append(translate)
    self._pts_queue.append(pts)
 
 defprepare_data(self):
    begin = time.time()
   
    rotation_1 = Gf.Vec3f(0.0,0.0,0.0)
    _translate = Gf.Vec3d(0.0,0.0,0.0)
   foriinrange(500):
     # rotation_1 = Gf.Vec3f(0.0, 0.0, 0.0)
     # _translate = Gf.Vec3d(0.0, 0.0, 0.0)
      rotation_1 = Gf.Vec3f(-253.0, i * (360.0/499),93) # 99是為了最后一次達到360
     # _translate的xyz從0遞增到100
      _translate = Gf.Vec3d(2124.0, 2124.0, 104)
     
      self._rotate_queue.append(rotation_1)
      self._translate_queue.append(_translate)
    end = time.time()
   
    carb.log_info(f"prepare_data elaspe:{end - begin}")
 
 asyncdefawait_flush_save(self):
    carb.log_info("before await_flush_save {time.time()}")
   awaitomni.kit.app.get_app().next_update_async()
    self.flush_save()
    carb.log_info("end await_flush_save {time.time()}")
 
 defflush_save(self):
    timecode =0
   whileself._rotate_queueorself._translate_queue:
     ifself._rotate_queue:
        f_val = self._rotate_queue.popleft()
       #self._rotation_ops.Set(time = timecode, value = f_val)
        self.seq_write_rotate_op.Set(time = timecode, value = f_val)
     ifself._translate_queue:
        d_val = self._translate_queue.popleft()
        self.seq_write_translate_op.Set(time = timecode, value = d_val)
       #self._translate_ops.Set(time = timecode, value = d_val)
     
      timecode +=10
   
    self._sub_stage.GetRootLayer().Save()
    self._render_update_sub =None
 
 asyncdefawaitflush(self):
   awaitomni.kit.app.get_app().next_update_async()
    self.flush_save(self)
 
 asyncdefflush_save_async(self):
    time0 = time.perf_counter()
    carb.log_info("flush_save_async begin")
    loop = asyncio.get_running_loop()
   # 直接調(diào)用同步函數(shù)(主線程),但用await asyncio.sleep(0)切分事件循環(huán)
   awaitloop.run_in_executor(None, self.flush_save)
    time1 = time.perf_counter()
    carb.log_info(f"flush_save_async end elaspe:{time1 - time0}")
 
 defcreate_offline_layer(self, layer_base_path, prim_path, bOverride):
   # split name and ext
    name, ext = os.path.splitext(layer_base_path)
   
    index =1
    new_layer_path = layer_base_path
   
   #If exist create a new path such as basepath_1.usd
   whileos.path.exists(new_layer_path):
      new_layer_path =f"{name}_{index}{ext}"
      index +=1
   
    new_layer = Sdf.Layer.CreateNew(new_layer_path)
   
   # 2. 打開該layer對應(yīng)的Stage(編輯該layer)
    self._sub_stage = Usd.Stage.Open(new_layer)
   
   # 3. 以over方式定義相機Prim(覆蓋已有的/world/Camera)
   ifbOverride:
      self._seq_camera_prim = self._sub_stage.OverridePrim(prim_path)
      self._seq_camera_prim.SetSpecifier(Sdf.SpecifierOver)
   else:
      self._seq_camera_prim = self._sub_stage.DefinePrim(prim_path)
   
   # 4. 獲取或創(chuàng)建Xformable接口,用于添加變換操作
    xformable = UsdGeom.Xformable(self._seq_camera_prim)
   
   # 5. 添加translate和rotateXYZ操作
    self.seq_write_translate_op = xformable.AddTranslateOp()
    self.seq_write_rotate_op = xformable.AddRotateXYZOp()
   
 definit_stage_camera(self, stage, camera_prim_path):
    self._stage = stage
    self._camera_path = camera_prim_path
    self._camera_prim = UsdGeom.Camera.Get(stage, camera_prim_path).GetPrim()
    xform_ops = UsdGeom.Xformable(self._camera_prim).GetOrderedXformOps()
   
   foropinxform_ops:
       ifop.GetOpType()in[UsdGeom.XformOp.TypeRotateXYZ,
            UsdGeom.XformOp.TypeRotateXZY,
            UsdGeom.XformOp.TypeRotateYXZ,
            UsdGeom.XformOp.TypeRotateYZX,
            UsdGeom.XformOp.TypeRotateZXY,
            UsdGeom.XformOp.TypeRotateZYX]:
         #rotation = op.Get()
          self._rotation_type = op.GetOpType()
          self._rotation_ops = op
         #print(f"rotation is {rotation}")
       elifop.GetOpType() == UsdGeom.XformOp.TypeScale:
          self._scale_ops = op
       elifop.GetOpType() == UsdGeom.XformOp.TypeTranslate:
          self._translate_ops = op


if__name__ =="__main__":
  _stage = omni.usd.get_context().get_stage()
 
  prim_path ="/World/Camera"
  new_layer_path ="d:\tes303.usda"
 
  runclass = TestClass()
  create_prim(_stage, prim_path)
  runclass.init_stage_camera(_stage, prim_path)
 
  runclass.create_offline_layer(new_layer_path, prim_path,True)
  carb.log_info("create_offline_layer after")
 
 #runclass.regis()
  runclass.prepare_data()
  begin = time.time()
  carb.log_info(f"before run coroutine")
  run_coroutine(runclass.flush_save_async())
 #run_coroutine(runclass.await_flush_save())
 #runclass.flush_save()
  carb.log_info(f"end run coroutine")
 #runclass.flush_save()
 # with ThreadPoolExecutor() as executor:
 #   executor.submit(runclass.flush_save())
 
  end = time.time()
  carb.log_info(f"elaspe time is{end-begin}, 1000 ends")


# class YourClass:
#   def __init__(self):
#     # 初始化隊列等
#     pass


#   def flush_save(self):
#     # 這是同步函數(shù),不能改動
#     # 里面調(diào)用了Omniverse API,必須在主線程執(zhí)行
#     print("Begin flush save")
#     time.sleep(1)
#     print("end flush save")


#   async def flush_save_async(self):
#     time0 = time.perf_counter()
#     print("run task begin")
#     loop = asyncio.get_running_loop()
#     # 直接調(diào)用同步函數(shù)(主線程),但用await asyncio.sleep(0)切分事件循環(huán)
#     await loop.run_in_executor(None, self.flush_save)
#     time1 = time.perf_counter()
#     print(f"run task end elaspe:{time1 - time0}")
 
#   async def testawait():
#     pass




# # obj = YourClass()


# # run_coroutine(obj.flush_save_async())
# # print(f"run pass the async")
# # count = 0


# # def pre_frame_render(e):
# #   #print(f"Frame Begin: {app.get_update_number()} {e.payload}, event-type {e.type}, {time.time() * 1000 % 1000000} ")
# #   asyncio.ensure_future(obj.flush_save_async())
# # async def run_task():
# #   time0 = time.perf_counter()
# #   print("run task begin")
# #   await obj.flush_save_async()
# #   print("run task end")
# #   time1 = time.perf_counter()


# #   elapse_time = time1 - time0
# #   print(f"run taks elapse is {elapse_time}")


# # def frame_render(e):
# #   print(f"Frame Render: {app.get_update_number()} {e.payload}, event-type {e.type}, {time.time() * 1000 % 1000000}")


# # def post_frame_render(e):
# #   print(f"Frame End: {app.get_update_number()} {e.payload}, event-type {e.type}, {time.time() * 1000 % 1000000}")


# first_last_event = 1000000


# # pre_update_sub = app.get_pre_update_event_stream().create_subscription_to_pop(
# #   pre_frame_render, order=-first_last_event, name="gm_frame_begin")


# #asyncio.ensure_future(obj.flush_save_async())

* 附代碼鏈接:https://github.com/slayersong/OVPerf_Tracy/blob/main/solution_%20tracy_profiler.py

但是在一些項目當(dāng)中一定要實時觀察到結(jié)果。比如,有很多的數(shù)字孿生的工業(yè)場景中會存在小車傳送帶,各種物品都是實時進入到場景管線當(dāng)中,這其中必定要參與 USD 合成。

所以這里介紹一個 Omniverse 對 USD 進行重構(gòu)的基本概念 Fabric,USDRT(USDRT 是 Fabric 的 API),NVIDIA 在 Omniverse 當(dāng)中開發(fā)了 Fabric 組件專門處理 USD 實時更改緩慢的問題:

https://docs.omniverse.nvidia.com/kit/docs/usdrt/latest/docs/usd_fabric_usdrt.html

通過這個官方文檔的圖也驗證了剛才的結(jié)論:Render 線程會等待 USD 的合成結(jié)果 Composed 后進行渲染。

dfa0bd8c-b4ac-11f0-8c8f-92fbcf53809c.png

結(jié)束:如果單解決這個問題其實并不復(fù)雜,但是其中需要用到很多的基礎(chǔ)知識,包括 USD 的合成機制、多線程開發(fā)、遇到問題如何去利用工具定位分析等。后面我們將會對 USDRT 與 Fabric 進行更細致的講解,包括代碼的開發(fā)使用和 Omniverse 中其他性能工具的使用教程。也希望更多的朋友可以分享在 USD 開發(fā)過程當(dāng)中的心得體會。

附錄:

關(guān)于前面提到的 USD 的基本開發(fā)教程,包括 USD 合成機制,USD 基本動畫 TimeSampler 等:

文案提供和技術(shù)支持:

宋毅明

NVIDIA Omniverse & OpenUSD 開發(fā)者關(guān)系經(jīng)理

*與 NVIDIA 產(chǎn)品相關(guān)的圖片或視頻(完整或部分)的版權(quán)均歸 NVIDIA Corporation 所有。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • NVIDIA
    +關(guān)注

    關(guān)注

    14

    文章

    5464

    瀏覽量

    108761
  • 攝影機
    +關(guān)注

    關(guān)注

    0

    文章

    73

    瀏覽量

    10886
  • 插件
    +關(guān)注

    關(guān)注

    0

    文章

    344

    瀏覽量

    23359

原文標(biāo)題:Omniverse 性能優(yōu)化系列(一):Tracy Profiler

文章出處:【微信號:Leadtek,微信公眾號:麗臺科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    LabviewUI無法刷新

    Labview調(diào)用C的DLL,這個過程沒有問題。但執(zhí)行其中一個函數(shù)時,不但UI,而且整個labview都卡住了。這有解嗎?跑到ConnectDevice時,卡住了,只有連上了手機,
    發(fā)表于 03-27 11:38

    NVIDIA透露即將發(fā)布的Blender 3.0將包括USD支持

    在SIGGRAPH的特別演講, NVIDIA透露即將發(fā)布的Blender 3.0將包括USD支持。 新版本
    的頭像 發(fā)表于 08-16 15:56 ?2298次閱讀

    NVIDIANVIDIA Omniverse帶給全球超過250萬的開發(fā)

    NVIDIA開發(fā)者計劃現(xiàn)將NVIDIA Omniverse帶給全球超過250萬的開發(fā)者。在SIGGRAPH大會,
    的頭像 發(fā)表于 08-16 16:08 ?1945次閱讀

    利用NVIDIA Omniverse加速游戲開發(fā)管線

      對于沒有豐富腳本或編碼經(jīng)驗的團隊成員,Omni.UI Graph 是一個易于使用的圖形編輯框架,用于為擴展程序或應(yīng)用程序開發(fā)自定義行為。借助 Omni.UI Graph、Omniverse
    的頭像 發(fā)表于 04-22 09:44 ?1710次閱讀
    利用<b class='flag-5'>NVIDIA</b> <b class='flag-5'>Omniverse</b>加速游戲<b class='flag-5'>開發(fā)</b>管線

    NVIDIA USD是什么 有哪些功能

    USDNVIDIA Omniverse 的基礎(chǔ),這個實時協(xié)作平臺可讓各種內(nèi)容創(chuàng)作工具相互連接。
    的頭像 發(fā)表于 06-21 09:30 ?2276次閱讀

    NVIDIA SIGGRAPH的最新發(fā)布與重要更新

    在今年的 SIGGRAPH 2022 上,NVIDIA 宣布,為基于通用場景描述(USD)連接和構(gòu)建元宇宙世界的平臺——NVIDIA Omniverse 提供一系列新的
    的頭像 發(fā)表于 08-12 11:14 ?1170次閱讀

    Omniverse 中文課程系列 1: 開發(fā) Extensions 來自定義 Omniverse 功能與 UI

    Omniverse 定制化開發(fā)和發(fā)布 Extensions 學(xué)習(xí)目標(biāo) 想要根據(jù)自己的喜好更改 Omniverse 的功能和用戶界面(UI
    的頭像 發(fā)表于 05-27 17:45 ?1265次閱讀
    <b class='flag-5'>Omniverse</b> 中文課程系列 1: <b class='flag-5'>開發(fā)</b> Extensions 來自定義 <b class='flag-5'>Omniverse</b> 功能與 <b class='flag-5'>UI</b>

    奧比光將接入 NVIDIA Omniverse開發(fā)平臺

    ,作為其合作伙伴,奧比光正式宣布將Femto Mega和其它3D相機集成到NVIDIA Omniverse生態(tài)開發(fā)平臺中。 NVIDIA
    的頭像 發(fā)表于 05-31 09:03 ?1337次閱讀

    Omniverse 中文課程系列 2:USD 入門、基礎(chǔ)與進階 — 賦能協(xié)同 3D 工作流

    Omniverse 中文課程系列 現(xiàn) 已上線 NVIDIA 深度學(xué)習(xí)培訓(xùn)中心(DLI)! 跟隨 官方中文講解視頻 、 詳細的圖文說明 和 代碼演示 等,一起玩轉(zhuǎn) Omniverse! 適用于協(xié)同
    的頭像 發(fā)表于 06-04 02:25 ?1449次閱讀
    <b class='flag-5'>Omniverse</b> 中文課程系列 2:<b class='flag-5'>USD</b> 入門、基礎(chǔ)與進階 — 賦能協(xié)同 3D 工作流

    Omniverse 中文課程系列 3:實戰(zhàn)練習(xí)如何成為自定義 UI 界面大師

    Omniverse 為 3D 工具構(gòu)建漂亮的自定義 UI 界面 學(xué)習(xí)目標(biāo) 如果您是虛擬世界的構(gòu)建者和創(chuàng)作者,那么您一定不能錯過親身體驗 NVIDIA Omniverse 套件
    的頭像 發(fā)表于 06-09 20:45 ?1264次閱讀
    <b class='flag-5'>Omniverse</b> 中文課程系列 3:實戰(zhàn)練習(xí)如何成為自定義 <b class='flag-5'>UI</b> 界面大師

    NVIDIA 知乎精彩問答甄選 | 查看 NVIDIA Omniverse 相關(guān)精彩問答

    Omniverse 的應(yīng)用,可提供適用于完整的 USD 工作流程的新協(xié)作界面,讓藝術(shù)家在創(chuàng)作時更加自由。 OmniLive Workflows 可以對 Omniverse
    的頭像 發(fā)表于 08-01 19:55 ?926次閱讀
    <b class='flag-5'>NVIDIA</b> 知乎精彩問答甄選 | 查看 <b class='flag-5'>NVIDIA</b> <b class='flag-5'>Omniverse</b> 相關(guān)精彩問答

    SIGGRAPH 2023 | NVIDIA Omniverse 開啟通往 OpenUSD 廣闊天地的大門

    全新 Omniverse Cloud API 幫助開發(fā)者采用 OpenUSD;生成式 AI 模型 ChatUSD LLM 使用 USD 進行對話;RunUSD 將 USD 轉(zhuǎn)換成交互式
    的頭像 發(fā)表于 08-09 19:10 ?672次閱讀

    NVIDIA Omniverse的物理模擬功能

    NVIDIA Omniverse? Simulation 作為 NVIDIA Omniverse? 平臺的關(guān)鍵組件之一,由 NVIDIA
    的頭像 發(fā)表于 03-08 11:30 ?2424次閱讀
    <b class='flag-5'>NVIDIA</b> <b class='flag-5'>Omniverse</b><b class='flag-5'>中</b>的物理模擬功能

    NVIDIA Omniverse USD Composer能用來做什么?如何獲取呢?

    NVIDIA Omniverse? USD Composer(以前稱為 Create)是 NVIDIA Omniverse? 中用于構(gòu)建虛擬
    的頭像 發(fā)表于 05-20 10:07 ?1907次閱讀
    <b class='flag-5'>NVIDIA</b> <b class='flag-5'>Omniverse</b> <b class='flag-5'>USD</b> Composer能用來做什么?如何獲取呢?

    Omniverse教程(12):NVIDIA Omniverse USD Presenter的基礎(chǔ)應(yīng)用

    如前所述,NVIDIA Omniverse? 是一個參考開發(fā)平臺,通過模塊化的開發(fā)框架能夠輕松擴展和自定義。
    的頭像 發(fā)表于 05-20 10:09 ?1595次閱讀
    <b class='flag-5'>Omniverse</b>教程(12):<b class='flag-5'>NVIDIA</b> <b class='flag-5'>Omniverse</b> <b class='flag-5'>USD</b> Presenter的基礎(chǔ)應(yīng)用