1. 程式人生 > >《Unity3d指令碼程式設計 使用C#語言開發跨平臺遊戲》讀書筆記1

《Unity3d指令碼程式設計 使用C#語言開發跨平臺遊戲》讀書筆記1

1.4指令碼程式設計的優勢


·易於學習,程式碼維護方便,適合快速開發
·開發成本低(因易於學習,所以可以啟用新人,同時開發速度快,這些都是降低成本的方法)


2.2.1以速度作為衡量語言級別的標準,那麼語言從低階到高階的大概排名如下


·組合語言
·C/C++,編譯型靜態不安全語言
·C#/JAVA,編譯型靜態安全語言
·Python、Perl、JavaScript,解釋型動態安全語言


2.2.2將Mono執行時嵌入應用,可以分為3個步驟


·編譯C++程式和連結Mono執行時
·初始化Mono執行時
·C/C++和C#/CIL的互動




2.3


·CIL(Common Intermediate Language,通用中間語言)是CLI(Common Language Infrastructure,通用語言基礎架構)標準定義的


一種可讀性較低的語言。
·以.net或Mono等實現CLI標準的執行環境為目標的語言要先編譯成CIL,然後CIL會被編譯,並且以位元碼的形式存在(原始碼到中間


語言的過程)
·這種位元碼執行在虛擬機器中(.net Mono的執行時)
·這種位元碼可以被進一步編譯成不同平臺的原生程式碼(中間語言到原生程式碼的過程)
·JIT編譯,Mono會有一部分程式碼通過AOT靜態編譯,以解決在程式執行時JIT動態編譯在效率上的問題
·AOT編譯,同樣使用了JIT編譯器在執行前編譯
過程:
    收集要被編譯的方法
    使用JIT編譯器進行編譯
    發射(Emitting)經JIT編譯過的程式碼和其它資訊
    直接生成檔案,或者呼叫本地彙編器或聯結器進行處理後生成檔案
Android使用JIT,iOS使用全AOT
·面向物件
·基於堆疊


2.4Unity Script
·靜態語言且需要編譯
·基於Boo語言
·和JavaScript除了名字以外沒有關係
2.4.2Unityscript和JS的區別


3.1C#的型別系統
·靜態型別(C#4中引入了動態型別,不影響Unity)
·大多數時候是顯式型別的
    由於動態型別並不限制變數使用特定的型別,因而區分顯式/隱式型別的不同,僅僅對使用靜態型別系統的語言有意義
    var關鍵字表示編譯器在編譯時需要對該變數進行型別推斷,並不是動態語言的標誌
·型別安全
    C#允許將物件轉換為它的實際型別或它的任何基類
    不允許的型別轉換會觸發編譯錯誤,Mono執行時會在程式執行的時候檢查型別轉換的操作,會丟擲異常


3.2值型別和引用型別
·儲存引用型別物件的記憶體空間要從託管堆上分配
·每一個物件都有一些額外的成員為Mono執行時提供操作該物件的資訊,因而堆上分配空間時也要考慮到這些成員的空間,同時這些成


員必須被初始化
·物件中的其他欄位的位元組總是0
·為新物件分配空間時可能會觸發GC
·引用型別包括類,介面,委託,Dynamic(U3D中沒有),Object,string
·引用型別的實際值只有一個例項,修改後會影響所有引用它的變數


·值型別例項一般分配線上程棧,並且不受GC影響
·值型別的優勢在於提升簡單型別的效能,緩解託管堆的壓力,減少GC次數
·值型別包括簡單結構,結構體,列舉
·對結構體使用new並不意味著要從堆上分配記憶體P71


·總結P72


·記憶體空間分配位置P67