1. 程式人生 > >Unity設計模式:享元模式

Unity設計模式:享元模式

遊戲中經常需要用到大量只是引數(比如座標,旋轉角,尺寸,顏色等)有些不同的重複物體,如植物,子彈,粒子等。如果數量非常多,在一個場景中逐一繪製這些物件將會消耗大量的效能。在學習OpenGL的時候我們知道有個例項化的方式,可以在一瞬間繪製數十萬個僅僅位置不同的同一個物件而且並不會對GPU造成很高的負擔,在實際開發中怎麼使用這個方法來提升效能呢?享元模式可以做到這一點。

享元模式的基本思路儘量少向GPU傳送資料的數量,從而提升效能。為了做到這一點,我們需要將共享資料(如網格,紋理)單獨傳送到GPU,然後再將所有物件獨有的屬性(位置,顏色等)傳送的GPU。
由於這個模式相對簡單,所以先直接上程式碼:

using UnityEngine;
using System.Collections;
using System;

public class flyweightTerrain : MonoBehaviour {
    public Material redMat;
    public Material greenMat;

    flyweightTile redTile;
    flyweightTile greenTile;
    flyweightTile[,] tiles;
    int width = 5;
    int height = 5;
    int
[,] terrain = { { 0,1,0,0,0}, { 0,0,0,1,0}, { 1,0,0,1,0}, { 1,0,0,0,0}, { 0,0,1,0,0} }; void Start () { redTile = new flyweightTile(redMat, true); greenTile = new flyweightTile(greenMat, false); drawTerrain(); } void drawTerrain() { tiles = new
flyweightTile[width, height]; for (int i = 0; i < width; i++) for (int j = 0; j < height; j++) { if (terrain[i, j] == 0) tiles[i, j] = greenTile; else tiles[i, j] = redTile; } for (int i = 0; i < width; i++) for (int j = 0; j < height; j++) { GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube); obj.transform.position = new Vector3(i - 2, 0, j); obj.GetComponent<MeshRenderer>().material = tiles[i, j].mat; } } } class flyweightTile { public flyweightTile(Material mat, bool isHard=false){ this.mat = mat; _ishard = ishard; } public Material mat; bool _ishard = false; public bool ishard { get { return _ishard; } } }

上例中,flyweightTile是用來儲存物件差異屬性的類,在這裡僅僅需要材質和一個表示是否堅硬的布林值。通常為了我們需要將每個物體的屬性單獨儲存一份,但是這裡使用了享元模式,我們僅僅建立兩個flyweightTile物件redTile和greenTile作為元物件,其他所有物件通過引用元物件來實現共享資料。雖然這裡我們的元物件僅僅共享了材質資料,但是在實際操作中,材質可能會非常消耗效能,因為有可能會有很多貼圖和很複雜的特效在這個材質中,通過共享材質,我們就共享了這份效能消耗。
上述程式碼實際執行效果:
這裡寫圖片描述
可以看到,我們僅僅用兩個材質就繪製出了整個地面。
轉載請註明出處:http://blog.csdn.net/ylbs110/article/details/53862269

相關推薦

Unity設計模式模式

遊戲中經常需要用到大量只是引數(比如座標,旋轉角,尺寸,顏色等)有些不同的重複物體,如植物,子彈,粒子等。如果數量非常多,在一個場景中逐一繪製這些物件將會消耗大量的效能。在學習OpenGL的時候我們知道有個例項化的方式,可以在一瞬間繪製數十萬個僅僅位置不同的同一

我的設計模式模式

一個 ash 行為 定義 問題 出了 認知 為什麽 重寫 遇到的問題:new了太多對象,內存溢出了!!! 問題思考:為什麽new對象,new代表新的,但是新在哪裏呢?別告訴我new出來的東西地址值不一樣,new一個對象僅僅是為了獲得一個地址值不一樣的對象嗎?No 個人認知:

Java設計模式(十二)之結構型模式模式

一、定義: 享元模式,也就是說在一個系統中如果有多個相同的物件,那麼只共享一份就可以了,不必每個都去例項化一個物件。比如說一個文本系統,每個字母定一個物件,那麼大小寫字母一共就是52個,那麼就要定義52個物件。如果有一個1M的文字,那麼字母是何其的多,如果每個字母都定義一個

設計模式模式(Flyweight)

 運用共享技術有效地支援大量細粒度的物件。又名“蠅量模式”。  在Java語言中,String型別就是使用了享元模式。String物件是final型別,物件一旦建立就不可改變。在JAVA中字串常量都是存在常量池中的,Java會確保一個字串常量在常量池中只有一個

實現設計模式模式

享元模式其實類似於物件池。如果系統中有大量的細粒度物件,建立這些物件是不小的開銷。如果能共享和反覆使用這些物件,那麼就可以減少物件數量,提高系統性能。 下面實現了一個享元工廠,可以作為參考。 #include <map> #include <boost/

設計模式(FlyWeight)模式

例子 清理 什麽 public == lean http 變量 -- 設計模式:享元(FlyWeight)模式 一、前言 享元(FlyWeight)模式顧名思義,既是輕量級的,原因就是享元,共享元素,這裏的元素指的是對象。如何共享對象,那就是在檢測對象產生的時候,如

java設計模式(11)模式

java 設計模式之享元模式 當前咱們國家正在大力倡導構建和諧社會,其中一個很重要的組成部分就是建設資源節約型社會,“浪費可恥,節儉光榮”。在軟體系統中,有時候也會存在資源浪費的情況,例如在計算機記憶體中儲存了多個完全相同或者非常相似的物件,如果這些物件的數量太多將導致系統執行代價過高,記憶體屬

JAVA設計模式(12)模式

享元模式(Flyweight Pattern)主要用於減少建立的物件數量,並減少記憶體佔用並提高效能。 這種型別的設計模式屬於結構模式,因為該模式提供了減少物件計數的方法,從而改善應用的物件結構。享元模式(Flyweight Pattern)嘗試通過儲存已經存在的類似物件以重用,並在找不到匹

設計模式(十)模式

優點:   減少了系統中物件的數量,避免了大量細粒度物件給記憶體帶來的壓力,實現對細粒度物件的複用。 缺點:   此模式需要維護一個記錄了系統已有的所有享元物件的列表,本身就需要耗費資源。此外此模式需要將一些狀態外部化,也使得系統及邏輯更加複雜。 適用範圍:   一個系統中有大量的物件

設計模式系列之十二模式

1.定義 使用共享物件可有效的支援大量的細粒度的物件。 享元模式是池技術的重要實現方式,享元模式的定義為我們提出了兩個要求,細粒度物件和共享物件。我們知道分配太多的物件到以程式中將有損程式的效能,還會造成記憶體溢位,享元模式正是為此而生的。 說到細粒度物件

Java描述設計模式(18)模式

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、使用場景 應用程式碼 public class C01_InScene { public static void main(String[] args) { String c0 = "cicada" ; S

「補課」進行時設計模式(21)——模式

![](https://cdn.geekdigging.com/DesignPatterns/java_design_pattern.jpg) ## 1. 前文彙總 [「補課」進行時:設計模式系列](https://www.geekdigging.com/category/%e8%ae%be%e8%ae%

java設計模式模式

並不是 計算 lov 這一 返回 實例 map() 角色 ron 當前咱們國家正在大力倡導構建和諧社會,其中一個很重要的組成部分就是建設資源節約型社會,“浪費可恥,節儉光榮”。在軟件系統中,有時候也會存在資源浪費的情況,例如在計算機內存中存儲了多個完全相同或者非常相似的

Head First設計模式模式(蠅量模式

logs sign face isp ria reat 定義 ogr sans 一、定義 享元模式(Flyweight Pattern)主要用於減少創建對象的數量,以減少內存占用和提高性能。這種類型的設計模式屬於結構型模式,它提供了減少對象數量從而改善應用所需的對象結構的

12.設計模式_模式

足夠 狀態 提升 opera 構造 cnblogs 類圖 不同的 string 一、引言 在軟件開發過程,如果我們需要重復使用某個對象的時候,如果我們重復地使用new創建這個對象的話,這樣我們在內存就需要多次地去申請內存空間了,這樣可能會出現內存使用越來越多的情況,這樣的問

(@WhiteTaken)設計模式學習——模式

ken import 都是 什麽 com str 字段 浪費 -- 繼續學習享元模式。。。 乍一看到享元的名字,一頭霧水,學習了以後才覺得,這個名字確實比較適合這個模式。 享元,即共享對象的意思。   舉個例子,如果制作一個五子棋的遊戲,如果每次落子都實例化一個對象的話

設計模式模式(7)

turn actually 一個 享元模式 rom imp import pat 兩個 享元模式(Flyweight Pattern)主要用於減少創建對象的數量,以減少內存占用和提高性能。這種類型的設計模式屬於結構型模式,它提供了減少對象數量從而改善應用所需的對象結構的方式

4.泡妞與設計模式(四)模式

sage eight 客戶端 pms AI 一個 div 創建 stdlib.h FLYWEIGHT 享元模式 享元模式:FLYWEIGHT在拳擊比賽中指最輕量級。享元模式以共享的方式高效的支持大量的細粒度對象。享元模式能做到共享的關鍵是區分內蘊狀態和外蘊狀態。內蘊狀態存儲

Java設計模式模式實例詳解

AI ava flyweight lan trac home erro lin 代碼 本文實例講述了Java設計模式之享元模式。分享給大家供大家參考,具體如下: 解釋一下概念:也就是說在一個系統中如果有多個相同的對象,那麽只共享一份就可以了,不必每個都去實例化一個對象。比如

用最簡單的例子說明設計模式(三)之責任鏈、建造者、適配器、代理模式模式

def dap CA 抽象 創建 tcl cte clas eth 責任鏈模式 一個請求有多個對象來處理,這些對象是一條鏈,但具體由哪個對象來處理,根據條件判斷來確定,如果不能處理會傳遞給該鏈中的下一個對象,直到有對象處理它為止 使用場景 1)有多個對象可以處理同