我發現真的是好多東西 腦子里知道這個東西的大致,但是如果讓你說出來 真的半句話憋不出來
所以我們還是得腳踏實地的一個問題一個問題的看 不能好高騖遠
面相物件和面相程序的區別
1.面相程序是以程序為中心的編程思想,面相物件是以物件為基本程式結構單位的程式語言
2.面相程序是分析出解決問題的步驟,然后一步一步實作,一次一次呼叫
面相物件是物件具有唯一的靜態型別,和有可能的多個動態型別,共享資料和操作
3.面相程序不支持面相物件的特性(多型,繼承) 不允許混合持久化狀態和邏輯
面相物件 在內部被表示為一個指標,任何對這個物件的操作 都是通過這個指標操作物件的屬性和方法的
多型是什么 怎么實作的
多型就是: 父型別的參考指向子型別的物件
通俗版: 同一操作作用于不同的物件,產生不同的效果
好處: 1.提高程式的復用性(修改父類可以使得派生類發生改變)
2.提高擴充性和可維護性(派生類的功能可以被基類呼叫)
怎么實作的?
在基類的函式前加上virtual關鍵字,派生類中重寫該函式,運行時將會根據物件的實際型別來呼叫函式
如果物件時派生類,就用派生類的函式,如果是基類 就用基類的函式
GC
GC 就是垃圾回收器
作用:
1.提高軟體開發抽象度
2.程式員可以不用費心在記憶體管理的問題上
3.使得模塊之間更加清晰,減少耦合性
4.減少認為處理不當造成的 bug
5.記憶體使用更加高效
常見的設計模式以及應用場景
單例模式
單例模式是一種常用的設計模式
它的核心結構質保含一個被稱為單例類的特殊類,通過單例模式可以保證系統中有一個類只有一個實體
而且該實體易于外界訪問,從而方便對這個實體的控制,從而控制并節約資源
場景 :如果希望系統中某個類的物件只存在一個,單例模式就是很好的解決方案
工廠模式
工廠模式就是主要為創建物件提供介面
場景: 在編碼時不能預見需要創建哪種類的實體
系統不應該依賴于產品類實體如何被創建,組合和表達的細節
策略模式
定義了演算法族,分別封裝起來,讓他們之間可以相互替換,此模式的演算法的變化獨立于使用演算法的客戶
場景:
一件事情,有很多方案可以實作
我可以在任何時候決定采用哪一種方式實作
未來可能增加很多的方案
策略模式可以讓方案的變化不會影響到使用方案的客戶
觀察者模式
又稱發布/訂閱模式 定義了物件間一對多依賴
當一個物件發生改變的時候,所有依賴者的狀態都會收到通知,并自動更新
場景
對一個物件狀態的更新,需要其他物件同步更新,而且其他物件的數量動態可變
物件僅需要將自己的更新通知給其他物件而不需要知道其他物件的細節
迭代器模式
提供一種方法順序訪問一個聚合物件的各個元素,而不暴露該物件的內部表示
場景
當你需要訪問一個聚合物件的時候,不管這些物件是什么都需要遍歷的時候,就用那個該考慮迭代器模式
stl容器就是很好的迭代器模式的例子
行程,執行緒,協程的區別
行程:擁有自己獨立的堆疊,既不共享堆疊,也不共享堆,由作業系統調度
執行緒:擁有自己獨立的堆疊,共享的堆,由作業系統調度
協程:同執行緒一樣共享堆,獨立的堆疊,由程式員手動調度協程
一個應用程式一般有一個主執行緒,多個輔助執行緒,執行緒之間是平行運行的,執行緒里面可以開啟協程,讓程式在特定的時間運行
行程和執行緒區別
1.行程是資源分配的最小單位,執行緒是程式執行的最小單位
2.行程有獨立空間,執行緒沒有,行程的資源獨立,執行緒是共享的
3.行程執行開銷大,執行緒執行開銷小
4.執行緒是處理機調度的基本單位 行程不是
協程和執行緒的區別: 協程避免了無意義的調度,由此可以提高性能,程式員必須自己承擔調度的責任,
同時執行緒失去了標準執行緒的多CPU的能力
協程原理:
unity中執行協程程序中,通過yield return xxx,將程式掛起,執行接下來的內容,
注意協程不是執行緒,在遇到yield return xxx 之前,協程方法和一般的方法是相同的,也就是程式執行遇到yield return xxx 之后
才會執行startcontinue()方法之后的程式,走的還是單執行緒模式,僅僅是將yield return xxx 之后的內容暫時掛起,等到特定的時間執行
動態合批,靜態合批
動態合批:
unity自帶動態合批,需要在unity中開啟 會導致CPU的消耗
限制:
物體的transform必須由相同的縮放系數
使用相同材質
一起逐個渲染
靜態合批
unity中把物體標記為static 然后開啟靜態合批
限制:
需要保持static 不能改變transform
使用相同材質的物體才能合批
一個批次上線為~15K個頂點
記憶體區域有哪幾塊,分別存放了什么東西
記憶體區域共有五塊:
1.堆疊區:主要是編譯器自動分配釋放,存放函式的引數值,區域變數,操作方式類似于資料結構中的堆疊
2.堆區:由程式員分配釋放,存放new或者malloc出來的實體 由程式員負責釋放(分配方式類似鏈表)
3.全域區(靜態區):全域變數和靜態變數存放在一起,初始化全域變數和靜態變數放在RW
未初始化的全域變數和靜態變數在ZI 程式結束后自動釋放
4.文字常量區 :存放常量字串,程式結束后自動釋放
5.程式代碼區:存放二進制代碼
static全域變數和全域變數的區別
1.兩者的存盤區相同 都是全域區(靜態區)
2.普通的全域變數作用整個源程式,如果一個源程式有多個源檔案,那這個全域變數對所有源檔案都有效
3.static全域變數限制了它的作用域只能在該變數定義的源檔案內,只能此檔案的函式使用,其他源檔案不能使用這個static的變數
協程的原理
unity在運行的時候,呼叫協程就是開啟一個IEnumerator(迭代器),協程開始執行,
執行到yield return 之前協程和其他正常的應用程式沒有任何差別,但是遇到yield return 之后就會立刻回傳
并且將該函式暫時掛起,在下一幀遇到FixedUpdate或者Update之后判斷yield return 條件是否滿足
如果滿足 則向下執行,否則繼續掛起
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/266980.html
標籤:其他
上一篇:將ShaderToy中的Shader搬運到Unity
下一篇:演算法模板:并合集
