主頁 >  其他 > Unity3D高級編程主程手記 學習筆記二:C#技術要點

Unity3D高級編程主程手記 學習筆記二:C#技術要點

2023-05-23 12:06:58 其他

1.Untiy3D中C#的底層原理

Unity底層在運行C#程式時有兩種機制:一種是Mono,另一種是IL2CPP,Mono存在的目的是為了跨平臺,因為最初C#只支持Windows,而IL可以看成是一種匯編語言且完全基于堆疊,必須運行在虛擬機上,也就是說C#會被編譯器編譯成IL,當需要他們時就會被實時的加載到運行庫中,由虛擬機動態的編譯成匯編代碼(JIT)再進行執行,

注:Unity中其他的兩門腳本語言Boo,Untiy Script(這兩暫時還沒接觸到)也是被編譯成IL后再由Mono虛擬機解釋并執行的,

IL有三種轉譯模式:

  1、Just-in-time(JIT)模式:在程式運行程序中將CIL(IL)轉譯為機器碼,

  2、Ahead-of-Time(AOT)模式:將IL轉譯成機器碼并存盤在檔案中,此檔案并不能完全獨立運行,通常此種模式可產生出絕大部分JIT模式所產生的機器碼,只有部分例外,例如trampolines或是控制監督相關的代碼任然需要JIT來運行,

  3、完全靜態編譯:這種模式只支持少數平臺,它基于AOT編譯模式更進一步所產生的機器碼,完全靜態編譯可以使得程式在運行期間不需要JIT,這種做法適用于IOS,PS3,Xbox360等不允許使用JIT的作業系統

 

Mono使用垃圾回識訓制來管理記憶體,應用程式向垃圾回收器申請記憶體,最終由垃圾回收器決定是否回收,當我們向垃圾回收器申請記憶體時,如果發現記憶體不足,就會自動出發垃圾回收(也可以主動觸發),垃圾回收器會遍歷記憶體中所有物件的參考關系,如果沒有被任務物件參考則會釋放記憶體,

3.1.1之后Mono正式將(Simple Generational GC)SGen-GC設定為默認的垃圾回收器,這種方式的主要思想是將物件分給兩個記憶體池,一個新的一個老的,那些存活時間長的物件都會放到較老的物件池中,這種設計基于一個事實,程式經常會申請一些小的臨時物件,用完了馬上釋放,而如果某個物件一直不釋放則,往往以后的很長時間內也不會被釋放

此外,我們稱IL編碼為托管代碼,這部分代碼由C#自動生成,由虛擬機JIT編譯執行,且其中的物件由GC管理,而使用C++或C#以不安全型別寫的代碼稱為非托管代碼,虛擬機無法追蹤到這類代碼物件,故程式員需要對這部分代碼的物件手動進行管理避免記憶體泄漏的問題,(一般情況下,我們使用托管代碼來撰寫游戲邏輯,非托管代碼用于更底層的架構、第三方庫或者是作業系統相關介面)

 

(中間一部分為 List與Dictionary的原始碼剖析,可自行查閱原始碼進行學習)

這里只對部分函式做結論和總結:

List:

List使用Array陣列作為底層資料結構,優點是隨機存盤,索引快,缺點是擴容時會很糟糕,每次針對陣列進行new操作都會造成記憶體垃圾,會給GC帶來負擔,

Remove()函式,原理是使用Array.Copy()對陣列進行覆寫,復雜度為O(N).

Clear()函式,并不會對記憶體進行操作真正的洗掉元素,而是將物件內的count置0,因為對記憶體進行操作會產生極大的性能消耗,

Enumerator()介面,這是列舉迭代部分細節的介面,其中Enumerator這個結構,每次在獲取迭代器時都會被創建出來,如果大量使用迭代器,例如 foreach陳述句,就會產生大量的垃圾,這也就是為什么我們常常說要避免在Update()中使用foreach的底層原因, 

Sort()函式,內部使用Array.Sort()介面,使用快速排序進行排序,

總結:

1.List的效率并不是很高,只是通用性強,底層使用的大部分演算法都是線性演算法,

2.同時其記憶體分配方式也是不合理的,當增加元素需要對陣列進行擴充時,原陣列會被拋棄,這會給GC帶來很大的壓力,

3.內部代碼是執行緒不安全的,底層沒有對多執行緒做任何加鎖和限制,如實作需要多執行緒操作需要手動加鎖,

 

Dictionary:

private struct Entry{
    public int hashCode; // 低31位哈希值,如果未使用則為-1
    public int next; // 下一個實體索引,如果是最后一個則為-1
    public Tkey key; // 實體的Key
    public TValue value; // 實體的Value
}

Dictionary使用鏈地址法來解決哈希沖突,內部有兩個陣列一個int型別的bucket,還有一個Entry型別(如上)的entries,

 其中bucket就是下圖中的紫色部分,也就是哈希表,

Entry代表了下圖中綠色部分,每一個Entry保存自己的Key,Value,以及哈希值,并且可以索引到下一個實體(如果有),

總結:

1. Dictionary在效率上與List一樣,最好在實體化物件時就確定大致的數量,這樣會減少分配記憶體的頻率,另外,使用值作為鍵值比使用物件要更高效,因為類物件的Hash值通常都是由地址記憶體再計算得到的,

2.從記憶體操作上看,Dictionary增長速度大約是兩倍,洗掉資料時,同List一樣不對記憶體進行操作

3.Dictionary是執行緒不安全的,需要自己進行lock操作

2.浮點數精度問題

在實際使用程序中,許多人都會想要使用double型別來代替float從而解決精度問題,但最后往往以失敗告終,

因為無論是double型別還是float型別,在計算機底層存盤都是以二進制的形式存盤的,并且存盤的位數有限(32位/64位),所以十進制在轉為二進制時很多數字會丟失精度,

2.1精度問題可能會發生的情況?

(1)數值比較不相等

  撰寫代碼時通常會遇到數值觸及閾值從而觸發邏輯的情景,例如某一個變數,從0開始,每次加一個小于0.01的數,加到剛好0.23時觸發事件,但是我們不能確定每次加多少,所以結果會出現要么比0.23大,要么比0.23小,很難會出現剛好等于0.23的情況,這時使用>,<,==等這些符號就不好處理,如果一定要比較,可以使用ABS()<0.001這樣的方式解決,

(2)數值計算不確定

  例如x=1f, y=2f, z = (1f/5555f)* 11110f, 我們預期x/y應當是等于z的,但是由于精度問題,z結果可能為0.4999999,這樣x/y與z就不會相等,

(3)不同設備計算結果不同

  不同計算機上作業系統,CPU暫存器都不同,計算時會有一定的精度偏差

2.2如何解決精度問題?

(1)由一臺計算機進行運算

  在網路同步方面,可以使用一臺計算機,例如特定的一臺服務器用來進行計算,

(2)改用int,long型別來替代浮點數

  例如,4080,與4.08*1000在數學中是完全成立的,我們可以使用4080當做4.08進行存盤,從而避免把資料放在小數點后面(精度截斷),

(3)用定點數保持一致性并縮小精度問題

  定點數就是,小數部分與整數部分分開存盤,從而與方法二一樣,其小數部分可以使用int或long來存盤,避免小數截斷的問題,

struct MyNum{
    int Interger; 
    int Decimal; 
}

(4)用字串代替浮點數

  當精度要求特別高時,可以使用字串來代替浮點數,這種方式不用擔心越界問題,并且還可以自由的控制精度,缺點是很消耗CPU和記憶體,使用字串代替浮點數,一次計算量相當于好幾萬次普通浮點數,所以當精度要求特別高,且計算次數不多時可以考慮這種方法,

3.委托、事件、裝箱、拆箱

3.1委托與事件

  C#中指標被封裝進了底層類中,絕大多數的情況都看不到指標,但回呼函式依然存在,于是C#中多了委托這一概念,委托可以看成是一種更高級的函式指標,它不僅會把地址指向另一個函式,而且還能傳遞引數、獲取回傳值等多個資訊,此外,系統還會為委托物件自動生成同步、異步的呼叫方法,開發人員可以使用BeginInvoke(),EndInvoke()來避開Thread類,從而直接使用多執行緒呼叫,

  委托(delegate)不是一個語言的基本型別,在創建委托的時候實際上就是在創建一個delegate類的實體,這個delegate類繼承了Sysytem.MulticastDeleate類,類實體中有BeginInvoke(),EndInvoke(),Invoke()三個函式,分別表示異步呼叫開始,結束,以及直接呼叫,

  注:我們不能直接寫一個類來繼承Sysytem.MulticastDeleate類,和它的父類Delegate類,官方檔案中的解釋是這兩個類是特殊的類,編輯器或其他工具可以從他這里繼承,但是你不能直接繼承它,

  Delegate中有一個變數用來存盤函式地址可以認為是一個鏈表,重寫了+=,-=運算子,用來向這個鏈表中添加或者洗掉元素,也就是把函式地址加入或者洗掉到鏈表中,

  所以delegate關鍵字只是一個修飾用詞,背后C#編輯器會重寫代碼,我們可以認為編譯程序把delegate關鍵字識別的物件轉譯成為Delegate類物件

  事件(event)則是在delegate上又做了一層封裝,這次封裝的意義是,限制用戶直接操作delegate實體中的變數的權限,封裝后,用戶不再能通過直接賦值的方式(=運算子)來改變委托變數,只能通過注冊或者注銷委托的方式來增減委托函式的數量,通過這樣的方式更好的維護了委托的秩序,增加了系統穩定性,

3.2裝箱與拆箱   

  裝箱:把值型別實體轉換成為參考型別實體,拆箱:把參考型別實體轉為成為值型別實體,(參考物件有:string型別,class實體,陣列)(值物件有:所有整數,浮點數,bool,struct實體)

 

int a = 5;
object obj = a;

上面就是一個簡單的裝箱程序,因為a是一個值型別,是直接有資料的變數,obj為參考變數,指標與記憶體拆分開來,把a賦值給obj,實際上就是obj為自己創建了一個指標,并指向a的資料空間,

a = (int)obj

而這段代碼就是一個簡單的拆箱的程序,相當于把obj指向的記憶體空間復制一份給了a,因為a是值參考,所以它不允許指向某個記憶體空間,只能靠復制資料來傳遞資料,

3.3為何需要裝箱?

  值型別是在宣告之后就立即被初始化的了的,因為它一旦宣告,就有了自己的空間,因此它不可能為null,也不能為null,而參考型別在分配記憶體以后,只是一個空殼子,可以認為是指標,初始化后不指向任何空間,因此默認為null

  這里要注意Struct部分,很多人會把它當成是類,而類是參考型別,結構體是值型別,所以a,b同是結構的實體,a賦值給了b,而b更改資料之后a的數值并沒有改變,這是因為a,b是值型別,各自占用了一片記憶體空間,修改b物件不會對a有影響,在a賦值給b的程序實際上是將資料原封不動復制一份給了b,

  后面涉及到了堆疊記憶體,所以來說說堆疊記憶體是怎么回事?

  堆疊是存放物件的一種特殊的容器,它是最基本的資料結構之一,遵循先進后出的原則它是一段連續的記憶體,所以對堆疊資料定位比較快速;堆則是隨機分布的空間,定位資料時需要堆記憶體的創建和洗掉節點時間復雜度是O(logN),顯然堆疊的速度更快,但是堆疊物件有嚴格的宣告周期,并且堆疊空間有限,會有堆疊溢位的問題;而堆物件宣告周期不確定,空間也幾乎沒有限制,所以并不是所有情況都應該使用堆疊,

  那值型別和參考型別就是堆和堆疊記憶體分配的區別嗎?不是!

  參考型別指向的記憶體塊都在堆內,一般這些記憶體塊都在委托堆內,這樣便于記憶體塊的回收和控制,GC會對這些堆進行回收和整理,也有非委托記憶體不歸委托堆管理的部分,這些部分需要自行管理,

  大部分時候,只有當程式邏輯和介面需要更加通用的時候才需要裝箱,比如一個含型別為object的引數的方法,該object可支持任意型別,以便通用,當你需要一個值型別為(如nt32)傳入時,就需要裝箱,又比如一個非泛型的容器為了保證通用,而將元素型別定義為object,當值型別資料加入容器時,就需要裝箱,

3.4裝箱的優化

  由于裝箱拆箱的程序,都是生成全新的物件,不斷地分配和銷毀記憶體不但會大量消耗CPU,同時也會增加記憶體碎片,降低性能,所以我們要盡可能的減少裝箱拆箱,Struct型別比較特殊,它即是值型別,又可以繼承介面,用途多,稍不留神就會增加性能消耗,以下為Struct的優化技巧:

  1)Struct通過多載函式來避免拆箱,裝箱

    如果Strcut沒有多載一些函式,實體呼叫它們的時候就會先裝箱在呼叫,所以對于用到的那些需要呼叫的參考方法時,必須多載,

  2)通過泛型來避免拆箱、裝箱

    Struct可以繼承Interface介面,我們可以利用Interface做泛型介面,使用泛型來傳遞引數,這樣就不會在裝箱后再傳遞值了,比如B,C繼承A,就有了這個泛型反復方法 Void Test(T t) where T : A, 以避免使用object參考型別來傳遞引數,

  3)通過繼承統一介面提前拆箱、裝箱,避免多次重復拆箱、裝箱

    比如Struct A和Struct B都繼承了介面1,我們呼叫的方法時void Test(I i),當呼叫Test方法時,傳進去的Struct A或 Struct B的實體相當于提前執行了裝箱操作,Test方法拿到了引數后就不用擔心后面會進行裝箱拆箱操作了,

4.業務邏輯優化技巧

4.1使用List和Dictionary時提高效率 

   每次使用List的Insert,Contain,Remove函式時,都是會順序遍歷List的,如果經常用到他們就會有比較大的性能消耗,

  Dictionary也有很多問題,它使用一個Hash沖突方案來解決關鍵字的字典組件,因此Hash值與容器中陣列的映射和獲取Hash值的函式GetHashCode()比較關鍵,Hash沖突與陣列大小有很大關系,陣列越大,哈希沖突率越小,在實際使用程序中應當初始化一個合理的大小,使得Hash沖突不那么頻繁,且放任其自由擴容也會增加GC負擔;GetHashCode()繼承自基類Object類中的方法,用來獲取類實體的Hash值,這個函式實質是用演算法將記憶體地址轉化成哈希值的程序,不會有任何快取的程序,如果頻繁的使用GetHashCode(),我們應當要關注此時這個函式的算力損耗,并確認是否可以作為唯一ID,

4.2巧用struct

   由于struct是一個值參考物件,所以傳遞struct時,其實是在不斷地克隆資料,

struct A{
    public int gold;
}

public void main(){
    A a = new A();
    a.gold = 1;
    A b = a;
    b.gold =2;
}

  舉這個例子,上述struct中有一個整數變數gold,實體a的gold值為1,將a賦值給b后,b的gold設定為2,此時a中的gold仍為1,因為a和b是兩個不同的記憶體,

  struct這樣的值變數對性能優化有什么好處呢,如果在函式中被定義成區域變數,則struct的值型別變數分配的記憶體是在堆疊上的,堆疊是連續記憶體,并且在函式呼叫結束后,堆疊的回收非常快速和簡單,只有將尾指標置零就可以了,這樣既不會產生記憶體碎片,又不需要記憶體垃圾回收,CPU讀取資料對連續記憶體也非常高效

  除了以上,struct陣列對提高記憶體訪問速度也有所幫助,因為內部存盤時連續存盤的,CPU在讀取資料時,連續記憶體可以幫助我們提高CPU的快取命中率,因為CPU在讀取記憶體時會把一個大塊記憶體放入快取,當下次讀取時先從快取中查詢,如果命中則不需要再向記憶體讀取資料(快取比記憶體塊100倍),非連續記憶體的快取命中率比較低,而CPU快取命中率的高低很影響CPU的效率

4.3盡可能得使用物件池

  物件的創建與銷毀都會引起記憶體分配時的性能損耗以及垃圾回收時的艱難,尤其是當業務邏輯大,資料量多的時,垃圾回收需要檢查的記憶體也越多,如果回收后依然記憶體不足,就得向系統請求分配更多記憶體,物件池的使用并不麻煩,我們是需要在創建銷毀物件的時候呼叫物件池管理物件即可,關于物件池的代碼有很多讀者可自行查找相關代碼,

4.4字串導致的性能問題

   在C#中由于string是參考型別變數,每次動態創建一個string,C#都會在堆記憶體中分配一個記憶體用于存放字串,

sting strA = "test";
for(int i=0;i<100;i++){
    string strB = strA + i.ToString();
    string[] strC = strB.Split('e');
    strB = strB + strC[0];
    string strD = string.Format("Hello{0}, this is {1} and {2}."strB,strC[0],strC[1]);  
}

4.5字串隱藏問題

   字串隱藏問題,當兩個字符比較時,首先會比較兩個字串的地址是否一致(參考變數),如果不一致才會遍歷字串各個字符,如果都一致則回傳true,

  該問題涉及到ToCharArray(),Clone(),Compare()函式,string.ToCharArray()回傳的char []陣列是一個新創建的字串陣列,與原有的string無關,我們修改回傳的字串時不會影響原來的string物件,而Clone和ToString介面則是直接回傳該物件,并不會重新創建一個新物件, 

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

標籤:其他

上一篇:Serverless冷擴機器在壓測中被擊穿問題

下一篇:返回列表

標籤雲
其他(159537) Python(38162) JavaScript(25443) Java(18101) C(15231) 區塊鏈(8267) C#(7972) AI(7469) 爪哇(7425) MySQL(7207) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5340) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4575) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2433) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1976) 功能(1967) Web開發(1951) HtmlCss(1940) C++(1920) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1878) .NETCore(1861) 谷歌表格(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
最新发布
  • Unity3D高級編程主程手記 學習筆記二:C#技術要點

    1.Untiy3D中C#的底層原理 Unity底層在運行C#程式時有兩種機制:一種是Mono,另一種是IL2CPP。Mono存在的目的是為了跨平臺,因為最初C#只支持Windows。而IL可以看成是一種匯編語言且完全基于堆疊,必須運行在虛擬機上。也就是說C#會被編譯器編譯成IL,當需要他們時就會被實 ......

    uj5u.com 2023-05-23 12:06:58 more
  • Serverless冷擴機器在壓測中被擊穿問題

    有次全鏈路壓測中,有位同事負責的服務做Serverless擴容(負載達到50%之后自動擴容并上線接入流量)中,發現新擴容的機器被擊穿,理論分析之后我們重新進行現象回放,模擬問題重現 ......

    uj5u.com 2023-05-23 12:01:33 more
  • 子母鐘系統(網路時鐘系統)助力高考精準計時作業建設

    子母鐘系統(網路時鐘系統)助力高考精準計時作業建設 子母鐘系統(網路時鐘系統)助力高考精準計時作業建設 京準電子科技官微——ahjzsz 【摘要】時鐘系統是校園網路中一個重要的精準計時系統,隨著網路的普及,許多校園都建了自己的校園專網,使用的網路設備和服務器也日益增多,這些設備都有自己的時鐘,而且是 ......

    uj5u.com 2023-05-23 11:54:38 more
  • 猴子摘香蕉問題

    ### 簡介 一個房間里,天花板上掛有一串香蕉,有一只猴子可在房間里任意活動(到處走動,推移箱子,攀登箱子等)。設房間里還有一只可被猴子移動的箱子,且猴子登上箱子時才能摘到香蕉,問猴子在某一狀態下(設**猴子**位置為**A**,**香蕉**位置在**B**,**箱子**位置為**C**),如何行動 ......

    uj5u.com 2023-05-23 11:49:08 more
  • 天涯神帖合集,建議收藏!

    最近幾天大家應該發現天涯社區網站打不開了。 ![](http://img.topjavaer.cn/img/202305190848117.png) 天涯社區創辦于1999年,此時的中國,互聯網產業方興未艾,那時天涯社區相當火爆。 2007年時,天涯社區的注冊用戶就突破了2000萬,號稱是全球最大的 ......

    uj5u.com 2023-05-23 11:49:00 more
  • 子母鐘系統(網路時鐘系統)助力高考精準計時作業建設

    子母鐘系統(網路時鐘系統)助力高考精準計時作業建設 子母鐘系統(網路時鐘系統)助力高考精準計時作業建設 京準電子科技官微——ahjzsz 【摘要】時鐘系統是校園網路中一個重要的精準計時系統,隨著網路的普及,許多校園都建了自己的校園專網,使用的網路設備和服務器也日益增多,這些設備都有自己的時鐘,而且是 ......

    uj5u.com 2023-05-23 11:43:20 more
  • 云計算遇上電動車,跑出新模式的數智化轉型

    摘要:臺鈴集團依托華為云開放能力,與華為云開發者技術服務DTSE團隊進行了產品方案的聯合構建,顯著提高了自身的抗風險能力、數字化運營效率以及資料價值發掘能力。 本文分享自華為云社區《臺鈴數智化轉型成效明顯,華為云DTSE賦能新能源電動車行業加速發展》,作者:華為云賦能云團隊 江蘇錫山工業云。 隨著經 ......

    uj5u.com 2023-05-23 11:37:05 more
  • Serverless冷擴機器在壓測中被擊穿問題

    有次全鏈路壓測中,有位同事負責的服務做Serverless擴容(負載達到50%之后自動擴容并上線接入流量)中,發現新擴容的機器被擊穿,理論分析之后我們重新進行現象回放,模擬問題重現 ......

    uj5u.com 2023-05-23 11:37:00 more
  • Unity3D高級編程主程手記 學習筆記二:C#技術要點

    1.Untiy3D中C#的底層原理 Unity底層在運行C#程式時有兩種機制:一種是Mono,另一種是IL2CPP。Mono存在的目的是為了跨平臺,因為最初C#只支持Windows。而IL可以看成是一種匯編語言且完全基于堆疊,必須運行在虛擬機上。也就是說C#會被編譯器編譯成IL,當需要他們時就會被實 ......

    uj5u.com 2023-05-23 11:31:38 more
  • 猴子摘香蕉問題

    ### 簡介 一個房間里,天花板上掛有一串香蕉,有一只猴子可在房間里任意活動(到處走動,推移箱子,攀登箱子等)。設房間里還有一只可被猴子移動的箱子,且猴子登上箱子時才能摘到香蕉,問猴子在某一狀態下(設**猴子**位置為**A**,**香蕉**位置在**B**,**箱子**位置為**C**),如何行動 ......

    uj5u.com 2023-05-23 11:25:49 more