主頁 >  其他 > Bloom Filter演算法

Bloom Filter演算法

2021-10-19 06:24:10 其他

Bloom Filter演算法詳解

什么是布隆過濾器


布隆過濾器(Bloom Filter)是 1970 年由布隆提出的,它實際上是一個很長的二進制向量和一系列隨機映射函式 (下面詳細說),實際上你也可以把它簡單理解為一個不怎么精確的set結構,當你使用它的contains方法判斷某個物件是否存在時,它可能會誤判,但是布隆過濾器也不是特別不精確,只要引數設定的合理,它的精確度可以控制的相對足夠精確,只會有小小的誤判概率,

當布隆過濾器說某個值存在時,這個值可能不存在;但是當它說不存在時,那么這個值一定不存在,打個比方,當它說不認識你時,那就是真的不認識,但是當它說認識你時,可能是因為你長得像他認識的另一個朋友(臉長得有些相似),所以誤判認識你,

image

布隆過濾器的使用場景


在程式的世界中,布隆過濾器是程式員的一把利器,利用它可以快速地解決專案中一些比較棘手的問題,

如網頁URL的去重、垃圾郵件識別、大集合中重復元素的判斷和快取穿透等問題,

布隆過濾器的典型應用有:

  • 大資料判斷是否存在
    如果你的服務器記憶體足夠大的話,那么使用HashMap可能是一個不錯的解決方案,理論上時間復雜度可以達到O(1)級別,但是當資料量起來之后還是只能考慮布隆過濾器,
  • 解決快取穿透
    我們通常會把一些經常訪問的資料放在Redis中當作快取,例如產品詳情,通常一個請求過來之后,我們會先查詢快取,而不用直接讀取資料庫,這是提升性能最簡單,也是最普遍的做法,但是如果一直請求一個不存在的快取,那就會有大量的請求被直接打到資料庫上,造成快取穿透,布隆過濾器也可以用來解決此類問題,
  • 爬蟲|郵箱等系統的過濾
    對爬蟲網址進行過濾,已經存在布隆中的網址,不再爬取,
    對于垃圾郵件進行過濾,對每一個發送郵件的地址進行判斷是否在布隆的黑名單內,如果在就判斷為垃圾郵件,
  • 業務場景判斷
    判斷用戶是否閱讀過某視頻或文章,比如抖音或頭條,當然會導致一定的誤判,但不會讓用戶看到重復的內容,
  • Web攔截器
    如果是相同的請求則進行攔截,防止被重復攻擊,
    用戶第一次請求,將請求引數放入布隆過濾器中,當第二次請求時,先判斷請求引數是否被布隆過濾器命中,可以提高快取命中率,Squid 網頁代理快取服務器在 cache digests 中就使用了布隆過濾器,Google Chrome瀏覽器使用了布隆過濾器加速安全瀏覽服務

為什么使用布隆過濾器


下面舉一個實體說明我們為什么要學習BloomFilter

image

假設我們要寫一個爬蟲程式,由于網路間的鏈接錯綜復雜,蜘蛛在網路間爬行很可能會形成“環”,爬蟲就會進入一個無限怪圈,找不到出路,程式出現崩潰,

所以為了避免形成“環”,就需要知道蜘蛛已經訪問過那些URL,也就是如何判重,

給一個URL,怎樣知道蜘蛛是否已經訪問過呢?按照我們的常識,就會有如下幾種方案:
  1. 將訪問過的URL保存到資料庫,資料庫管理系統可以為你去重,
  2. 用Set將訪問過的URL保存起來,那只需接近O(1)的代價就可以查到一個URL是否被訪問過了,
  3. URL經過MD5SHA-1等單向哈希后再保存到Set資料庫
  4. Bit-Map方法,建立一個BitSet,將每個URL經過一個哈希函式映射到某一位,

方法1~3都是將訪問過的URL完整保存,方法4則只標記URL的一個映射位,

以上方法在資料量較小的情況下都能完美解決問題,但是當資料量變得非常龐大時問題就來了,

方法1的缺點:資料量變得非常龐大后關系型資料庫查詢的效率會變得很低,而且每來一個URL就啟動一次資料庫查詢是不是太小題大做了?

方法2的缺點:太消耗記憶體,隨著URL的增多,占用的記憶體會越來越多,就算只有1億個URL,每個URL只算50個字符,至少需要5GB記憶體,還不包括Set資料結構中的記憶體浪費,

方法3的缺點:由于字串經過MD5處理后的資訊摘要長度只有128Bit,SHA-1處理后也只有160Bit,因此方法3比方法2節省了好幾倍的記憶體,

方法4的缺點:消耗記憶體是相對較少的,但缺點是單一哈希函式發生沖突的概率太高,

若要降低沖突發生的概率到1%,有種辦法就是就要將BitSet的長度設定為URL個數的100倍,

假設一億條URL,就得把BitSet長度設為100億,過于稀疏也是很費記憶體的

實質上,上面的演算法都忽略了一個重要的隱含條件:允許小概率的出錯,不一定要100%準確!

也就是說少量URL實際上沒有沒被網路爬蟲訪問,而將它們錯判為已訪問的代價是很小的——大不了少抓幾個網頁唄,

Bloom Filter演算法原理


下面引入本篇的主角——Bloom Filter,其實上面方法4的思想已經很接近Bloom Filter了,

方法四的致命缺點是沖突概率高,為了降低沖突的概念,Bloom Filter使用了多個哈希函式,而不是一個,

為什么可以降低呢?我們知道Hash函式有一定幾率出現沖突,概率假設為 p1,我們知道p1是一個很小的幾率,但是在資料量大之后沖突就會變多,也就是上面第四種方法的問題,

BoomFilter使用 多個Hash函式 分別沖突概率為 p2 p3 p4 p5 … pn ,我們知道不同 Hash函式處理同一個字串彼此獨立,所以沖突概率通過乘法公式得到為: p1p2p3p4p5p6…pn,是相當相當小的了,

Bloom Filter演算法如下:

預操作
創建一個 m 位 BitSet(C++自帶,Python為bitarray),先將所有位初始化為0,然后選擇 k 個不同的哈希函式,第 i 個哈希函式對字串 str 哈希的結果記為h(i, str),且h(i,str)的范圍是 0 到 m-1 ,

image

Add操作
下面是每個字串處理的程序,首先是將字串str“記錄”到BitSet中的程序:

對于字串str,分別計算h(1,str),h(2,str)…… h(k,str),然后將BitSet的第h(1,str)、h(2,str)…… h(k,str)位設為1,

image

很簡單吧?這樣就將字串str映射到BitSet中的k個二進制位了,

Check操作
根據上圖,我們對每個字串采用同樣的演算法,

下面是檢查字串str是否被BitSet記錄過的程序:

  • 對于字串str,分別計算h(1,str),h(2,str)…… h(k,str),然后檢查BitSet的第h(1,str)、h(2,str)…… h(k,str)位是否為1,若其中任何一位不為1則可以判定str一定沒有被記錄過,若全部位都是1,則“認為”字串str存在,
  • 若一個字串對應的Bit不全為1,則可以肯定該字串一定沒有被Bloom Filter記錄過,(這是顯然的,因為字串被記錄過,其對應的二進制位肯定全部被設為1了)
  • 但是若一個字串對應的Bit全為1,實際上是不能100%的肯定該字串被Bloom Filter記錄過的,(因為有可能該字串的所有位都剛好是被其他字串所對應)這種將該字串劃分錯的情況,稱為wrong position,

Delete操作
字串加入了就被不能洗掉了,因為洗掉會影響到其他字串,實在需要洗掉字串的可以使用Counting bloomfilter(CBF),這是一種基本Bloom Filter的變體,CBF將基本Bloom Filter每一個Bit改為一個計數器,這樣就可以實作洗掉字串的功能了,

Bloom Filter跟單哈希函式Bit-Map不同之處在于:Bloom Filter使用了k個哈希函式,每個字串跟k個bit對應,從而降低了沖突的概率,

Bloom Filter 優化


image

考慮到BoomFilter上面的指標,總結一下有以下幾個

m : BitSet 位數

n : 插入字串個數

k :hash函式個數

當然,哈希函式也是影響的重要因素

從表格來看 m/n越大越準,k越大越準,

但是具體怎么設計呢?

哈希函式選擇

  • 哈希函式的選擇對性能的影回應該是很大的,一個好的哈希函式要能近似等概率的將字串映射到各個Bit,
  • 選擇k個不同的哈希函式比較麻煩,一種簡單的方法是選擇一個哈希函式,然后送入k個不同的引數,

引數設計
相信大家對于 Bloom Filter 的作業原理都有了一個基本的了解,現在我們來看看在Bloom Filter 中涉及到的一些引數指標:

  • 欲插入Bloom Filter中的元素數目: n
  • Bloom Filter誤判率: P(true)
  • BitArray陣列的大小: m
  • Hash Function的數目: k

欲插入Bloom Filter中的元素數目 n 是我們在實際應用中可以提前獲取或預估的;Bloom Filter的誤判率 P(true) 則是我們提前設定的可以接受的容錯率,所以在設計Bloom Filter程序中,最關鍵的引數就是BitArray陣列的大小 m 和 Hash Function的數目 k,下面將給出這兩個關鍵引數的設定依據、方法

誤判率P(true)

image

Hash Function的數目k

前文已經看到Hash Function數目k的增加可以減小誤判率P(true),但是隨著Hash Function數目k的繼續增加,反而會使誤判率P(true)上升,即誤判率是一個關于Hash Function數目k的凸函式,所以當k在極值點時,此時誤判率即為最小值

image

image

BitArray陣列的大小 m

image

如何解決布隆過濾器不支持洗掉的問題


(1)Counting Bloom Filter
Counting Bloom Filter將標準 Bloom Filter位陣列的每一位擴展為一個小的計數器(counter),在插入元素時給對應的k(k為哈希函式個數)個Counter的值分別加1,洗掉元素時給對應的k個Counter的值分別減1,Counting Bloom Filter通過多占用幾倍的存盤空間的代價,給Bloom Filter增加了洗掉操作,

image

(2)布谷鳥過濾器
對于這種方式有興趣的讀者可以閱讀這篇文章:https://juejin.cn/post/6924636027948630029#heading-1

Python 代碼簡單實作


主體

from bitarray import bitarray # 產生BitSet

import mmh3 # 產生Hash函式
 
 
class BloomFilter(set):
 
    def __init__(self, size, hash_count):
        super(BloomFilter, self).__init__()
        self.bit_array = bitarray(size)
        self.bit_array.setall(0)
        self.size = size
        self.hash_count = hash_count
 
    def __len__(self):
        return self.size
 
    def __iter__(self):
        return iter(self.bit_array)
 
    def add(self, item):
        for seed in range(self.hash_count):
            index = mmh3.hash(item, seed) % self.size
            self.bit_array[index] = 1
 
        return self
 
    def __contains__(self, item):
        out = True
        for seed in range(self.hash_count):
            index = mmh3.hash(item, seed) % self.size
            if self.bit_array[index] == 0:
                out = False
 
        return out

測驗

def main():
    bloom = BloomFilter(10000, 20)
    animals = ['dog', 'cat', 'giraffe', 'fly', 'mosquito', 'horse', 'eagle',
               'bird', 'bison', 'boar', 'butterfly', 'ant', 'anaconda', 'bear',
               'chicken', 'dolphin', 'donkey', 'crow', 'crocodile']
    # First insertion of animals into the bloom filter
    for animal in animals:
        bloom.add(animal)
 
    # Membership existence for already inserted animals
    # There should not be any false negatives
    for animal in animals:
        if animal in bloom:
            print('{} is in bloom filter as expected'.format(animal))
        else:
            print('Something is terribly went wrong for {}'.format(animal))
            print('FALSE NEGATIVE!')
 
    # Membership existence for not inserted animals
    # There could be false positives
    other_animals = ['badger', 'cow', 'pig', 'sheep', 'bee', 'wolf', 'fox',
                     'whale', 'shark', 'fish', 'turkey', 'duck', 'dove',
                     'deer', 'elephant', 'frog', 'falcon', 'goat', 'gorilla',
                     'hawk' ]
    for other_animal in other_animals:
        if other_animal in bloom:
            print('{} is not in the bloom, but a false positive'.format(other_animal))
        else:
            print('{} is not in the bloom filter as expected'.format(other_animal))
 
 
if __name__ == '__main__':
    main()

結果

dog is in bloom filter as expected
cat is in bloom filter as expected
giraffe is in bloom filter as expected
fly is in bloom filter as expected
mosquito is in bloom filter as expected
horse is in bloom filter as expected
eagle is in bloom filter as expected
bird is in bloom filter as expected
bison is in bloom filter as expected
boar is in bloom filter as expected
butterfly is in bloom filter as expected
ant is in bloom filter as expected
anaconda is in bloom filter as expected
bear is in bloom filter as expected
chicken is in bloom filter as expected
dolphin is in bloom filter as expected
donkey is in bloom filter as expected
crow is in bloom filter as expected
crocodile is in bloom filter as expected
badger is not in the bloom filter as expected
cow is not in the bloom filter as expected
pig is not in the bloom filter as expected
sheep is not in the bloom, but a false positive
bee is not in the bloom filter as expected
wolf is not in the bloom filter as expected
fox is not in the bloom filter as expected
whale is not in the bloom filter as expected
shark is not in the bloom, but a false positive
fish is not in the bloom, but a false positive
turkey is not in the bloom filter as expected
duck is not in the bloom filter as expected
dove is not in the bloom filter as expected
deer is not in the bloom filter as expected
elephant is not in the bloom, but a false positive
frog is not in the bloom filter as expected
falcon is not in the bloom filter as expected
goat is not in the bloom filter as expected
gorilla is not in the bloom filter as expected
hawk is not in the bloom filter as expected

從輸出結果可以發現,存在不少誤報樣本,但是并不存在假陰性,

不同于這段布隆過濾器的實作代碼,其它語言的多個實作版本并不提供哈希函式的引數,這是因為在實際應用中誤報比例這個指標比哈希函式更重要,用戶可以根據誤報比例的需求來調整哈希函式的個數,通常來說,sizeerror_rate是布隆過濾器的真正誤報比例,如果你在初始化階段減小了error_rate,它們會調整哈希函式的數量,

參考資料


https://cloud.tencent.com/developer/article/1731494 
https://blog.csdn.net/a745233700/article/details/113751718
https://juejin.cn/post/6924636027948630029#heading-1
https://www.wmyskxz.com/2020/03/11/redis-5-yi-ji-shu-ju-guo-lu-he-bu-long-guo-lu-qi/#%E4%B8%80%E3%80%81%E5%B8%83%E9%9A%86%E8%BF%87%E6%BB%A4%E5%99%A8%E7%AE%80%E4%BB%8B
https://segmentfault.com/a/1190000024566947
https://github.com/jaybaird/python-bloomfilter
https://blog.csdn.net/weixin_42081389/article/details/103137671

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

標籤:其他

上一篇:基于 KubeSphere 的 AI 平臺開發實踐

下一篇:FastAPI 學習之路(二十一)請求體 - 更新資料

標籤雲
其他(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