主頁 >  其他 > Godot游戲開發實踐之四:搬運Unity的Pluggable AI教程

Godot游戲開發實踐之四:搬運Unity的Pluggable AI教程

2020-09-13 19:36:57 其他

Godot游戲開發實踐之四

一、前言

在之前的幾篇文章里我簡單地介紹了 AI 尋路方式以及 Resource 的相關應用,那其實都是為這篇文章做鋪墊的,本篇的內容是基于油管上一個比較老的 Unity AI 系列教程: Unity tutorial: Pluggable AI With Scriptable Objects ,教程詳細介紹了 Unity 中如何實作可插撥式 AI 的功能,在我的一番苦苦研究下,硬生生地把它給搬運到了 Godot 中,搬運程序可謂是費了九牛二虎之力,這其中一部分原因是由于自己對 Godot API 的熟練程度不夠,另一方面則是 Godot 本身的一些缺陷,這些我都會在本文中提出來,

Unity tutorial: Pluggable AI With Scriptable Objects

因為 Unity 中的 ScriptObject 在 Godot 中相當于 Resource ,如果不是很熟悉,推薦大家閱讀我的上一篇文章: Godot游戲開發實踐之三:容易被忽視的Resource ,另外,搬用并等于照抄,本 Demo 實作的部分 AI 功能使用的是我自己的方式,這也在我之前的文章里有詳細介紹: Godot游戲開發實踐之二:AI之尋路新方式,

說明:我不會很詳細的講述如何實作某些特定功能,所以推薦大家觀看原 Unity 視頻,如果上油管不方便,也請放心,視頻教程我已經搬運到我的網盤,分享鏈接請關注我的公眾號,回復 AI教程 即可(友情提示:套路……),哈哈,

主要內容: 無
閱讀時間: 12 分鐘
永久鏈接: http://liuqingwen.me/2020/09/08/godot-game-devLog-4-translate-pluggable-AI-tutorial-from-unity-to-godot/
系列主頁: http://liuqingwen.me/introduction-of-godot-series/

二、正文

除了參考原視頻教程,也可以克隆本 Demo 的原始碼,我已經上傳到 Github ,供有興趣的同學參考,

Godot Pluggable AI

什么是可插撥AI

所謂可插撥其實和安裝插件、熱插撥等概念類似,就是可以隨意添加或者洗掉某個功能,通過直接拖拽就能組成復雜的 AI 體系而無須手動重復撰寫代碼,在 Unity 中使用的是 ScriptableObject 而 Godot 中即 Resource :

拖拽賦值

其實在編輯器方面, Unity 使用起來比 Godot 舒服多了, 😂

先說Godot的問題

搬運這個 AI 教程的時候,我反反復復、仔仔細細研究了很多次,在按步照搬的程序中出現了一個非常奇怪且頭疼的問題:游戲無癥狀、無征兆地閃退

代碼看上去沒問題,按下 F5 運行游戲,視窗還沒顯示就馬上停止運行,連錯誤提示都沒有,曾經因為這個錯誤我一度想著放棄算了,但是轉念一想, Godot 開發者豈能低頭?! 所以我繼續嘗試,尋找錯誤原因,探索可行的解決方案,從至少能正常運行開始一步一步添加相關功能,最終發現了閃退的罪魁禍首: Circular reference to resource回圈參考報錯,這在我之前的文章中已經聊過,也有朋友遇到過類似的問題,錯誤資訊大概是:

“scene/resources/resource_format_text.cpp:1387 - Circular reference to resource being saved found: ‘res://src/Resources/States/???.tres’ will be null next time it’s loaded.”

哪來的回圈參考呢?熟悉游戲結構你就會感覺到這是很顯然的:在我的游戲中有很多 Resource 資源類,比如 Action/Decision/State/Transitions 等,而這些資源相互之間或多或少發生了一些參考,就像 PatrolChaser 中參考了 ChaseChaser ,反過來 ChaseChaser 又參考 PatrolChaser 從而造成回圈參考鏈,甚至還有更加復雜的、難以發覺的、千絲萬縷的參考關系蘊含其中:

Alert Scanner -> Patrol Scanner -> Chase Scanner -> Alert Scanner -> Chase Scanner -> Alert Scanner -> …

在編程語言里這些參考再正常不過,但是 Godot 3 還不能正常處理回圈參考,這會在 4.0 中進行修復,我可不想等到明年春天了,最終解決方式是放棄部分插撥功能,對一些引數不采用推拽賦值的方式,取而代之的是在運行時判斷對應資源是否為 null 再決定動態加載進行賦值,這就造成了需要額外的一個變數用來指向對應 Resource 檔案的路徑:

使用路徑動態賦值

主要代碼如下:

# trueState 和 falseState 可以為 null
# 如果為 null 則使用對應的檔案路徑進行動態加載
func _checkTransitions(controller : StateController) -> void:
    for transition in transitions:
    var decisionSucceeded : bool = transition.decision.decide(controller)
    if decisionSucceeded:
        var trueState = transition.trueState
        if trueState == null:  # 如果置空則動態加載一次
            trueState = load(transition.trueStateResource)
            transition.trueState = trueState
        controller.transitionToState(trueState)
    else:
        var falseState = transition.falseState
        if falseState == null:  # 如果置空則動態加載一次
            falseState = load(transition.falseStateResource)
            transition.falseState = falseState
        controller.transitionToState(falseState)

除此之外,還有一個不忍直視的問題是在編輯器中顯示資源值的視圖,一旦涉及多個引數、多種型別、多個級別的資源混合在一起,那么他們之間的層級關系在屬性面板中變得極其難以辨別,感同身受一下這張慢動圖所帶來的崩潰心情吧:

復雜的變數關系屬性圖

嗯,此刻的我心中萬馬奔騰,無限次奔潰閃退并自動重啟中……

AI結構分析

如果你看完了整個視頻教程,你會發現這個 AI 系統的幾個重要部件:

  • Action 表示動作,比如巡邏、射擊等動作的控制實作
  • Decision 表示策略行為的決定,即狀態之間進行切換的依據
  • State 表示狀態,一個狀態即一種 AI 行為,不同狀態之間根據決定進行切換
  • Transition 包裝了兩個狀態(正反狀態),以及狀態發生轉換的決定

他們之間的關系圖,以及主要的行為類:

AI關系圖

Action 父類代碼:

extends Resource
class_name AbstractAction, 'res://assets/icons/action-icon.svg'

export var debugDrawColor := Color.black # 顏色顯示,Debug用
export var resourceName := 'Action'      # 名字,Debug用

# 動作的行為方法,每幀都會呼叫
func act(controller : StateController) -> void:
  pass

Decision 父類代碼:

extends Resource
class_name AbstractDecision, 'res://assets/icons/decision-icon.svg'

export var debugDrawColor := Color.white # 顏色顯示,Debug用
export var resourceName := 'Decision'    # 名字,Debug用

# 決定的方法,包裝在 Transition 中,每幀都會呼叫
# 回傳結果決定了切換到的狀態
func decide(controller : StateController) -> bool:
  return false

State 狀態類代碼:

extends Resource
class_name State, 'res://assets/icons/state-icon.svg'

export(Array, Resource) var actions = []       # 當前狀態下所有動作集合
export(Array, Resource) var transitions = []   # 所有的狀態轉換機制集合
export var debugStateColor := Color.green      # 顏色顯示,Debug用

# 每幀執行狀態更新
func updateState(controller : StateController) -> void:
  _doActions(controller)
  _checkTransitions(controller)

# 回圈執行所有動作
func _doActions(controller : StateController) -> void:
  for action in actions:
    action.act(controller)

# 檢查每一個轉換機制,是否可以進行狀態轉換
func _checkTransitions(controller : StateController) -> void:
  # 代碼參考上文
  # 省略……

控制器 Controller 和過渡機制 Transition 的代碼就不貼了,控制器中代碼都是一些基本狀態和控制操作的實作,這里我把視頻中介紹的所有 AI 型別例舉如下:

Chase Chaser: {
  Actions: [ChaseAction, AttackAction],
  Transitions: {Decision: ActiveStateDecision, TrueState: Remain State, FalseState: Patrol Chaser}
}
Patrol Chaser: {
  Actions: [PatrolAction],
  Transitions: {Decision: LookDecision, TrueState: Chase Chaser, FalseState: Remain State}
}
Chase Scanner: {
  Actions: [ChaseAction, AttackAction],
  Transitions: {Decision: LookDecision, TrueState: Remain State, FalseState: Alert Scanner}
}
Patrol Scanner: {
  Actions: [PatrolAction],
  Transitions: {Decision: LookDecision, TrueState: Chase Scanner, FalseState: Remain State}
}
Alert Scanner: {
  Actions: [],
  Transitions: [{Decision: ScanDecision, TrueState: Patrol Scanner, FalseState: Remain State}, {Decision: LookDecision, TrueState: Chase Scanner, FalseState: Remain State}]
}

當然,這個 AI 系統絕不局限于此,你完全可以組合出更多 AI 狀態,也可以添加你心目中所要實作的其他動作、決定、過渡和狀態類,豐富這個強大的 AI 系統,

其他小功能簡介

最后,游戲中使用的一些小技巧我也在本篇中簡單介紹一下,包括:炸彈的范圍傷害、相機自動跟蹤、子彈高度模擬等,

炸彈范圍傷害

炸彈范圍傷害

從圖中可以看出,我使用了指數級的衰減函式,也就是說距離炸彈爆炸中心越遠,傷害衰減的越厲害,個人認為要符合現實一些,當然你完全可以使用簡單的線性函式,傷害和距離成反比,這取決于你自己以及游戲機制的設計:

# 傷害最大范圍
onready var damageRange : float = $CollisionShape2D.shape.radius

func _on_Explosion_body_entered(body: Node) -> void:
    if body.has_method('damaged'):
      var vector : Vector2 = body.global_position - self.global_position
      # 指數系數
      var ratio : float = 1.0 - pow(vector.length() / damageRange, 0.6)
      # 傷害和沖擊力
      var damage := ceil(maxDamage * ratio)
      var force : Vector2 = maxForce * ratio * vector.normalized()
      body.damaged(damage, force)

相機自動跟蹤

在本示例中我使用了相機自動跟蹤的效果,

因為類似于多人游戲,使用相機進行跟蹤是有必要的,這樣可以保證所有的坦克、玩家都在當前視野中,實作起來不難,根據當前玩家數量以及玩家的位置計算最大邊距以及中心點,然后移動并設定相機的縮放即可:

# 視窗大小
onready var _windowSize := self.get_viewport_rect().size
# 跟蹤的目標
var targets := []

func _process(delta: float) -> void:
  if targets.size() <= 1:
    _camera.zoom = lerp(_camera.zoom, Vector2.ONE, 2.0 * delta)
    return
  
  var minPos := _windowSize  # 最小位置點
  var maxPos := Vector2.ZERO # 最大位置點
  for target in targets:
    if ! is_instance_valid(target):
      continue
    if target.global_position.x < minPos.x:
      minPos.x = target.global_position.x
    if target.global_position.x > maxPos.x:
      maxPos.x = target.global_position.x
    if target.global_position.y < minPos.y:
      minPos.y = target.global_position.y
    if target.global_position.y > maxPos.y:
      maxPos.y = target.global_position.y
  # 移動到中心點
  self.global_position = lerp(self.global_position, (maxPos + minPos) / 2, 2.0 * delta)
  
  # 計算縮放比例,相對于游戲主視窗
  var zoom = 2.0 * max((maxPos.x - minPos.x) / _windowSize.x, (maxPos.y - minPos.y) / _windowSize.y)
  zoom = clamp(zoom, 0.5, 1.0)
  _camera.zoom = lerp(_camera.zoom, Vector2.ONE * zoom, 2.0 * delta)

子彈高度模擬

原 Unity 視頻中的 Tank 是一個 3D 游戲,所以子彈也就有射程(落地)和高度之分,如果在 2D 場景中不設定高度,炸彈只要碰上其他炸彈或者靜態物體都會直接爆炸,那么游戲中的發射力(射程)也就毫無意義了,所以我使用代碼簡單地實作了子彈高度的模擬,

子彈高度模擬

思路大概是這樣的:給子彈添加一個陰影,陰影大小和透明度隨子彈高度發生變化,飛行中的子彈在垂直方向上偏移一定位置表示高度,最后把碰撞體設定在陰影上,這里的變化都使用了線性比例,實作方式也相對簡單,從上圖也可以看出來:

export var missileBodyMaxOffset := 60.0            # 最高時子彈視覺偏移
export(float, 1.0, 10.0) var shadowMaxScale := 1.5 # 陰影最大縮放,即子彈離地最低點
export(float, 0.0, 1.0) var shadowMinScale := 0.5  # 陰影最小縮放,即子彈離地最高點
export(float, 0.0, 1.0) var shadowMinAlpha := 0.25 # 陰影最小透明度,最高點
export(float, 1.0, 2.0) var shadowMaxAlpha := 2.5  # 陰影最大透明度,最低點

func init(force : float, maxSpeed : int, resistance : int, dir : Vector2) -> void:
  _direction = dir
  _fullSpeed = maxSpeed
  _moveResistance = resistance # 阻力,即重力加速度
  
  # 計算能達到的最大高度
  _maxFlyHeight = 0.5 * maxSpeed * maxSpeed / resistance
  # 計算線性關系系數a和b:y=ax+b
  _paramScaleA = (shadowMinScale - shadowMaxScale) / _maxFlyHeight
  _paramScaleB = shadowMaxScale
  _paramAlphaA = (shadowMaxAlpha - shadowMinAlpha) / (shadowMinScale - shadowMaxScale)
  _paramAlphaB = shadowMaxAlpha - shadowMinScale * _paramAlphaA
  
  # 保證炸彈總是往上方偏移,不然看起來奇怪
  var angle = fmod(dir.angle(), 2 * PI)
  if angle > PI * 0.5 || angle < - PI * 0.5:
    missileBodyMaxOffset = -missileBodyMaxOffset
  
  # 水平和垂直初始速度一樣,模擬45度發射導彈
  _velocityX = force * maxSpeed
  _velocityY = force * maxSpeed

# 計算水平和垂直位移
func _physics_process(delta: float) -> void:
  self.position += _direction * _velocityX * delta
  _velocityY -= _moveResistance * delta
  currentHeight += _velocityY * delta
  _adjustHeight(currentHeight)
  if currentHeight <= 0.0:
    explode()

# 根據高度調整陰影大小、透明度、子彈垂直偏移
func _adjustHeight(height : float) -> void:
  _body.position.y = - height / _maxFlyHeight * missileBodyMaxOffset
  var shadowScale = _paramScaleA * height + _paramScaleB
  _shadow.scale = Vector2.ONE * shadowScale
  var shadowAlpha = _paramAlphaA * shadowScale + _paramAlphaB
  _shadow.modulate.a = shadowAlpha

嗯,我就想弱弱問一句:現實生活中物體越高其陰影是越大還是越小呢?……

三、總結

這種 AI 系統具有比較強的擴展性和易用性,有點復雜問題簡單模塊化的思維,用起來應該會相當爽,當然我也沒有具體專案案例,另外也有一些不足之,個人經驗主要概括為這兩點:

  1. Pluggable AI 確實比較強大,使用非常方便,因為是可插撥,即使配置復雜的 AI 都只要輕輕一拖一拽一松手就完成了
  2. 但是這種方式也有令人不爽的地方,比如耦合還是比較厲害的,代碼中需要訪問、修改很多玩家相關資料,依然需要一番精心的設計

好在 Unity 中具有更加成熟的碰撞檢測相關 API ,比如 SphereCast 還有 Navigator 都是極好用的 AI 輔助工具, Godot 中就只能手動實作了, 😂

最后,務必關注我的公眾號,回復 AI教程 我會送上本套視頻以及非常棒的一套 AStar 講解視頻(毫無疑問也是在 Unity 中實作,但是原理通用),本篇的 Demo 以及相關代碼已經上傳到 Github ,地址: https://github.com/spkingr/Godot-Pluggable-AI , 后續繼續更新,原創不易,希望大家喜歡! 😄

我的博客地址: http://liuqingwen.me ,我的博客即將同步至騰訊云+社區,邀請大家一同入駐: https://cloud.tencent.com/developer/support-plan?invite_code=3sg12o13bvwgc ,歡迎關注我的微信公眾號(第一時間更新+游戲開發資源+相關資訊):IT自學不成才

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/26941.html

標籤:其他

上一篇:2020.9.12 SSL普及組模擬(總結)

下一篇:暴力DP背包問題巧解...2020數學建模大賽B題...穿越沙漠

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more