c++ stl 관련 자료

|

http://www.hanb.co.kr/ebook/look.html?isbn=9788979149937#binfo2


무료입니다.

'잡다한것들전부 > C, C++, C#' 카테고리의 다른 글

추상 클래스 (C++)  (0) 2014.01.10
Duff's Device  (0) 2014.01.10
c++ 11 이란??  (0) 2014.01.09
strncpy 로 메모리 복사  (0) 2014.01.07
C언어 배열 초기화 방법  (0) 2014.01.07
c++ stl 관련 자료  (0) 2014.01.06
Trackback 0 And Comment 0

c# 책

|

C# 공부를 위해 봐야하는 일종의 정석(?)책이 있습니다.
하나는 Inside C# 이고 다른 하나는 C# in Depth 입니다.

Trackback 0 And Comment 0

[펌][C# 강좌] 직접 만들어보는 메모리 풀 클래스

|




MemoryPool.unitypackage


MemoryPool.cs

많은 량의 객체들을 실시간으로 생성하고, 삭제하는 코드로 인해서 메모리가 빠르게 고갈되고,

쌓인 가비지로 인해 버벅거리는 현상이 발생한다면 메모리 풀 시스템을 활용하는게 좋습니다.

에셋스토어에도 그런 시스템을 판매하는걸로 알고 있지만, 직접 만들어 보았습니다.

많이 써보시고, 조금씩 수정하면서 사용하셔도 됩니다.





using UnityEngine;

using System.Collections;

 

//-----------------------------------------------------------------------------------------

// 메모리 클래스

// 용도 : 특정 게임오브젝트를 실시간으로 생성과 삭제하지 않고,

//      : 미리 생성해 게임오브젝트를 재활용하는 클래스입니다.

//-----------------------------------------------------------------------------------------

//MonoBehaviour 상속 안받음. IEnumerable 상속시 foreach 사용 가능

//System.IDisposable 관리되지 않는 메모리(리소스) 해제

public class MemoryPool : IEnumerable, System.IDisposable {

    //-------------------------------------------------------------------------------------

    // 아이템 클래스

    //-------------------------------------------------------------------------------------

    class Item

    {

        public bool active; //사용중인지 여부

        public GameObject gameObject;

    }

    Item[] table;

 

    //------------------------------------------------------------------------------------

    // 열거자 기본 재정의

    //------------------------------------------------------------------------------------

    public IEnumerator GetEnumerator()

    {

        if (table == null)

            yield break;

 

        int count = table.Length;

 

        for (int i = 0; i < count; i++)

        {

            Item item = table[i];

            if (item.active)

                yield return item.gameObject;

        }

    }

    //-------------------------------------------------------------------------------------

    // 메모리 생성

    // original : 미리 생성해 원본소스

    // count : 최고 갯수

    //-------------------------------------------------------------------------------------

    public void Create(Object original, int count)

    {

        Dispose();

        table = new Item[count];

 

        for (int i = 0; i < count; i++)

        {

            Item item = new Item();

            item.active = false;

            item.gameObject = GameObject.Instantiate(original) as GameObject;

            item.gameObject.SetActive(false);

            table[i] = item;

        }

    }

    //-------------------------------------------------------------------------------------

    // 아이템 요청 - 쉬고 있는 객체를 반납한다.

    //-------------------------------------------------------------------------------------

    public GameObject NewItem()

    {

        if (table == null)

            return null;

        int count = table.Length;

        for (int i = 0; i < count; i++)

        {

            Item item = table[i];

            if (item.active == false)

            {

                item.active = true;

                item.gameObject.SetActive(true);

                return item.gameObject;

            }

        }

 

        return null;

    }

    //--------------------------------------------------------------------------------------

    // 아이템 사용종료 - 사용하던 객체를 쉬게한다.

    // gameOBject : NewItem으로 얻었던 객체

    //--------------------------------------------------------------------------------------

    public void RemoveItem(GameObject gameObject)

    {

        if (table == null || gameObject == null)

            return;

        int count = table.Length;

       

        for (int i = 0; i < count; i++)

        {

            Item item = table[i];

            if (item.gameObject == gameObject)

            {

                item.active = false;

                item.gameObject.SetActive(false);

                break;

            }

        }

    }

    //--------------------------------------------------------------------------------------

    // 모든 아이템 사용종료 - 모든 객체를 쉬게한다.

    //--------------------------------------------------------------------------------------

    public void ClearItem()

    {

        if (table == null)

            return;

        int count = table.Length;

 

        for (int i = 0; i < count; i++)

        {

            Item item = table[i];

            if (item != null && item.active)

            {

                item.active = false;

                item.gameObject.SetActive(false);

            }

        }

    }

    //--------------------------------------------------------------------------------------

    // 메모리 삭제

    //--------------------------------------------------------------------------------------

    public void Dispose()

    {

        if (table == null)

            return;

        int count = table.Length;

 

        for (int i = 0; i < count; i++)

        {

            Item item = table[i];

            GameObject.Destroy(item.gameObject);

        }

        table = null;

    }

 

}

 

 



using UnityEngine;

using System.Collections;

 

public class CsCube : MonoBehaviour {

 

    public float speed = 2.0f;

    public GameObject missilePrefab;

 

    //missile time

    float fireRate = 0.2f;

    float startTime;

    float shootTimeLeft;

 

    MemoryPool pool = new MemoryPool();

    GameObject[] missile;

 

    // Use this for initialization

                  void Start () {

        startTime = Time.time;

 

        int poolCount = 10;

        pool.Create(missilePrefab, poolCount);//메모리 사용

        missile = new GameObject[poolCount];

        for (int i = 0; i < missile.Length; i++)

        {

            missile[i] = null;

        }

                  }

    void OnApplicationQuit()

    {

        pool.Dispose();//메모리 삭제

    }

 

                  // Update is called once per frame

                  void Update () {

 

        float amtMove = speed * Time.deltaTime;

        float key = Input.GetAxis("Horizontal");

        transform.Translate(Vector3.right * key * amtMove);

 

 

        shootTimeLeft = Time.time - startTime;

        //발사

        if (Input.GetMouseButtonDown(0))

        {

            if (shootTimeLeft > fireRate)

            {

                for (int i = 0; i < missile.Length; i++)

                {

                    if (missile[i] == null)

                    {

                        missile[i] = pool.NewItem();

                        missile[i].transform.position = transform.position;

                        break;

                    }

                }

 

                startTime = Time.time;

                shootTimeLeft = 0.0f;

            }

        }

 

        //미사일삭제

        for (int i = 0; i < missile.Length; i++)

        {

            if (missile[i])

            {

                if (missile[i].transform.position.z > 20)

                {

                    pool.RemoveItem(missile[i]);

                   // missile[i].GetComponent<CsMissile>().init();

                    missile[i] = null;

                }

            }

        }

 

 

                  }

 

 

 

}

 

Trackback 0 And Comment 0