NFT數藏系統開發詳細(邏輯功能)NFT實物數藏模式系統開發流程(原始碼搭建)

Tg_StPv888發表於2023-02-22

  NFT將成為元宇宙的關鍵基礎設施,元界悔成為NFT最實出的應用,NFT的獨特性和可替代性將為現實世界中的人類沉浸在元宇宙中提供可靠的墓礎元宇宙是線上線下世界的融合,物理與電子相結合的方式。元宇宙為虛擬世界深入現實世界鋪平了道路,無論是從虛擬到現實,還是從現實到虛擬,都致力於為使用者提供更真實的體驗。

  Image怎麼繪製的

  Unity中渲染的物體都是由網格(Mesh)構成的,而網格的繪製單元是圖元(點、線、三角面)

  繪製資訊都儲存在Vertexhelper類中,除了頂點外,還包括法線、UV、顏色、切線。

  Rebuild概念

  Canvas負責將子節點的UI元素的網格合併,並生成相應的渲染指令再傳送到Unity的圖形管道的過程。所以Canvas就是渲染UI的元件,當UI發生變化就要執行一次Batch,它是影響效能更大的元兇。注意Canvas的Batch只會影響其子節點,但不會影響其子Canvas。

  Rebuild的程式流程NFT鏈遊開發原始碼模式威:StPv888

  Image,Text都是繼承Graphic,Graphic有ICanvasElement介面,實現rebuild函式

  public interface ICanvasElement  {  ///<summary>  ///Rebuild the element for the given stage.  ///</summary>  ///<param name="executing">The current CanvasUpdate stage being rebuild.</param>  /////根據CanvasUpdate的不同階段重建元素  void Rebuild(CanvasUpdate executing);  CanvasUpdateRegistry監聽Canvas的willRenderCanvases事件,這個事件會在渲染前進行每幀呼叫
  public class CanvasUpdateRegistry  {  //佈局重建佇列,當UI元素的佈局需要更新時將其加入佇列  private readonly IndexedSet<ICanvasElement>m_LayoutRebuildQueue=new IndexedSet<ICanvasElement>();  //圖形重建佇列,當UI元素的影像需要更新時將其加入佇列  private readonly IndexedSet<ICanvasElement>m_GraphicRebuildQueue=new IndexedSet<ICanvasElement>();  protected CanvasUpdateRegistry()  {  //監聽了Canvas的willRenderCanvases事件,這個事件會在渲染前進行每幀呼叫  Canvas.willRenderCanvases+=PerformUpdate;  }
複製

  PerformUpdate收集佈局重建佇列,圖形重建佇列呼叫ICanvasElement.Rebuild完成重建

  何時加入重建

  透過設定“髒資料”實現的,包括佈局(Layout)、材質(Material)和頂點(Vertices)三部分,設定佈局為髒,將進行佈局重建,設定頂點或材質為髒,則進行圖形重建。佈局重建會將自身加入m_LayoutRebuildQueue中,圖形重建則會將自身加入m_GraphicRebuildQueue中,等待被呼叫。

  SetLayoutDirty:加入到佈局重建佇列

  SetVerticesDirty,SetMaterialDirty:材質,頂點變換加入到圖形重建佇列

  佈局重建:位置或者大小;

  影像重建:頂點變化,材質變化(大小,旋轉以及文字變化、圖片的修改)

  最佳化

  主要目標,把Profile裡Canvas.SendWillRenderCanv引數調小。透過限制頂點數量,頂點變化等。

  text屬性改變(“123”–>“1234”),觸發SetLayoutDirty:在做倒數計時相關,按照每1s改變,不要實時改變

  改文字,圖片顏色,觸發SetVerticesDirty(頂點改變),所以改圖片顏色最好是改材質球顏色

  layout元件引起重建問題

  text描邊,陰影效能問題

  一個字元產生4個頂點,

  如果再加上Shadow則相當於又把Text複製了一遍產生8個,

  Outline則會將Text複製4遍產生20個頂點。

  用相應的shader替換

  text漸變

  Image格式選擇

  Image:頂點數量取決於Image Type的選擇。

  ①Simple 4個頂點;

  ②Sliced勾選FillCenter的頂點數是36個,不勾選是32個;

  ③Tiled取決於Rectranform設定的大小和原圖大小,鋪開了N張圖就是4*N個;

  ④Filled選擇比較多,但最少也有4個。

  所以對於Image首選Simple模式其次則是Sliced模式且不勾選FillCenter

  動靜分離:Canvas.SendWillRenderCanvases()與Canvas.BuildBatch()的計算是以Canvas為根節點進行的,不同Canvas不會影響另外一個Canvas。但是,大量的動靜分離反而影響Canvas的合批,所以可以針對性的對戰鬥UI,主介面做分離

  原始碼中檢視影響重建因素

  觸發SetLayoutDirty

  Graphic:

  protected override void OnRectTransformDimensionsChange():當UI的RectTransform更改時的回撥,只要繼承UIBehavior即可獲取回撥

  Image:

  protected override void OnCanvasHierarchyChanged():父畫布的狀態改變

  Text:

  text屬性改變:在做倒數計時相關,按照每1s改變,不要實時改變

  public bool supportRichText:設定是否開啟富文字時,開關規則(只要狀態跟上次不同,SetLayoutDirty一下,而不是開啟後實時Dirty)

  public bool resizeTextForBestFit:設定是否允許文字自動調整大小時,開關規則

  public int resizeTextMinSize:允許的最小文字大小

  public int resizeTextMaxSize:設定最大文字大小

  public TextAnchor alignment:文字相對其RectTransform的定位。

  public int fontSize:文字大小

  public HorizontalWrapMode horizontalOverflow:水平溢位模式

  public VerticalWrapMode verticalOverflow:垂直溢位模式

  public float lineSpacing:行間距,指定為字型行高的一個因子。值為1時將生成標準行間距

  public FontStyle fontStyle:字型樣式

  觸發SetVerticesDirty:頂點變化

  Graphic:

  public virtual Color color:顏色,所以改圖片顏色最好是改材質球顏色

  protected override void OnRectTransformDimensionsChange():當UI的RectTransform更改時的回撥,只要繼承UIBehavior即可獲取回撥

  Image:

  public Type type:Simple,Sliced等

  public bool preserveAspect:是否保持高寬比,開關規則

  public bool fillCenter

  public FillMethod fillMethod:填充模式

  public float fillAmount

  public bool fillClockwise

  public int fillOrigin

  public bool useSpriteMesh:圖片透明部分裁剪

  protected override void OnCanvasHierarchyChanged():父畫布改變

  RawImage:

  public Texture texture

  public Rect uvRect

  Shadow:

  public Color effectColor

  public Vector2 effectDistance

  public bool useGraphicAlpha

  Text:

  public virtual string text

  public bool supportRichText

  public bool resizeTextForBestFit

  public int resizeTextMinSize

  public int resizeTextMaxSize

  public TextAnchor alignment

  public bool alignByGeometry:使用區段的字形幾何執行水平對齊,而不是字形指標。

  這可以導致更好的擬合左和右對齊,但可能會導致不正確的定位當試圖覆蓋多個字型(如專業輪廓字型)上

  public int fontSize

  public HorizontalWrapMode horizontalOverflow

  public VerticalWrapMode verticalOverflow

  public float lineSpacing

  public FontStyle fontStyle

  觸發SetMaterialDirty:材質改變

  Graphic:

  public virtual Material material

  Mask:

  public bool showMaskGraphic:

  protected override void OnEnable()

  protected override void OnDisable()

  protected override void OnValidate():編輯器用

  MaskableGraphic:

  public bool maskable

  protected override void OnTransformParentChanged()

  protected override void OnCanvasHierarchyChanged()

  public virtual void RecalculateMasking():為此元素和所有子元素重新計算遮罩。

  觸發SetAllDirty,全改變

  Image間接繼承自Graphic,當它的Sprite發生變化時,會呼叫SetAllDirty函式

  SetAllDirty改變時機

  Graphic:

  protected override void OnTransformParentChanged()父物體改變

  protected override void OnEnable()

  protected override void Reset():賦值預設值,只在編輯器下有用,可無視

  protected override void OnDidApplyAnimationProperties():動畫屬性改變

  protected override void OnValidate():指令碼載入或Inspector中的任何值被修改時會呼叫,只在編輯器下有用,可無視

  Image:

  static void RebuildImage(SpriteAtlas spriteAtlas)圖集改變

  sprite屬性改變

  overrideSprite臨時修改圖片

  public override void SetNativeSize()設定大小

  Text:

  public void FontTextureChanged():字型紋理被修改:TTF動態字型,Text每次賦值的時候Unity會生成貼圖,以及儲存每個字的UV資訊,那麼顯示字型的時候根據UV資訊去生成的貼圖裡取最終渲染在螢幕上。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70016646/viewspace-2936330/,如需轉載,請註明出處,否則將追究法律責任。

相關文章