[re] [질문] 힙메모리 라이브러리에대해서.

조회 수 30327 추천 수 208 2004.08.08 21:42:04
여치 *.207.64.167
기본적으로 new,delete와 같다고 생각하시면 됩니다. new, malloc처럼 가변적인 사이즈로 메모리를 할당할 수 있습니다. 리얼타임에서 사용하려고 만든거니까 속도는 물론 얘네들보단 한참 빠릅니다만.

차이점이라면 실제로는 어드레스만 할당해주고 물리 메모리를 사용하지 않는다는 점입니다.

실제로 D3D를 다루다보면 버텍스 버퍼따위를 힙처럼 써야할 때가 있는데요.요샌 드라이버가 꽤 안정되었지만 1년전만 해도 버텍스 버퍼를 수천개씩 만들어대면 E_OUTOFMEMORY를 뱉거나 블루스크린이 뜨곤 했습니다.
이럴때 쉽게 생각할 수 있는 해결책은 버텍스 버퍼를 크게 한덩어리 잡아놓고 맥시멈 사이즈 단위로 잘라 쓰는 방법이죠.
그런데 필요로 하는 가장 작은 블럭은 4바이트 가장 큰 블럭은 102400바이트. 이런식이라면 낭비가 굉장히 심할겁니다. 이런때 버텍스 버퍼를 new나 malloc처럼 쓸 수 없을까 생각하게 되죠.

그 외에도 일전에 게시판에 올렸던 버텍스 버퍼 캐쉬의 경우가 그렇습니다.캐쉬 사이즈는 제한되어있는데 그 안에서 가능한 많은 개체들을 수용하려면 버텍스 버퍼를 최대한 알뜰하게 사용해야합니다. 고정 사이즈 블럭을 남발할 수 없죠.

그럼 어떻게 할까요.
일단 힙 메모리 라이브러리를 만듭니다. 이 녀석은 위에서 적은대로 주소만 뱉어주고 실제로 물리 메모리를 소모하지 않습니다.베이스 어드레스는 바깥에서 지정할 수 있습니다. 편하게 0을 지정하면 0에 대한 인덱스가 리턴되겠죠.

힙 메모리 라이브러리 상위 계층에 버텍스 버퍼 힙이 있습니다.할당받은 어드레스는 실제 버텍스 버퍼 한덩어리에서의 인덱스가 됩니다
.
힙라이브러리에서 메모리 블럭의 가장 적합한 사이즈를 찾아서 할당해주고 해제는 물론 병합까지 해주니까 상위의 버텍스 버퍼힙에선 따로 할게 없습니다.
그냥 리턴되는 어드레스를 가지고 버텍스 버퍼의 스타트 인덱스를 구해서 넘겨주면 되거든요. 즉 버텍스버퍼 리소스 자체는 VB힙에서 가지고 있지만 이 녀석을 쪼개서 할당하고 병합하고 어쩌고 하는 것은 하위의 힙 라이브러리에 전적으로 맡긴다는 것입니다. 리턴되는 어드레스가 인덱스(버텍스 버퍼의 스타트인덱스)역할을 해주니까 한 개의 버텍스 버퍼만으로도 여러개의 버텍스 버퍼처럼 쓸 수 있죠. 물론 고정 블럭을 써도 되지만 메모리 낭비가 심한거죠.

단 버텍스버퍼의 특성상 버텍스 사이즈에 맞게 정렬된 어드레스가 필요하므로 힙라이브러리는 특정 사이즈에 정렬된 어드레스를 리턴할 수 있어야합니다.약간의 짜투리를 낭비시키더라도 말이죠.

최초로 만들어둔 버텍스 버퍼 1개로 모자라는 경우 추가할당하고 필요없으면 다시 릴리즈 하는것 또한 쉽습니다.
힙라이브러리의 어드레스 영역을 꽤 크게 잡아놓고 실제 버텍스 버퍼는 그 1/5이나 1/8정도 사이즈로만 할당해두는거죠.
리턴된 어드레스가 버텍스 버퍼 1개의 사이즈를 넘어가는 영역이면 버텍스 버퍼를 한개 더 만들고 그 버텍스 버퍼에 대한 인덱스로 변환해서 할당 요청을 처리하면 됩니다.할당할때마다 관련된 실제 버텍스 버퍼의 레퍼런스 카운트를 올리고 해제할때마다 카운트를 내리니까 추가할당한 버텍스 버퍼가 더 필요없다면 자동적으로 해제됩니다.

설명이 장황한데 이해가 되셨는지...


댓글 '1'

clever98

2004.08.09 02:15:58
*.41.223.232

너무 자세하게 답변을 써주시네요. ^^ 감사합니다.
"가장 적합한 사이즈를 찾아서 할당해주고 해제는 물론 병합까지 해주니까" <-- 정말 대단합니다 ^^
저도 한번 만들어봐야겠네요 ㅎㅎ 답변감사합니다.
파일 첨부

여기에 파일을 끌어 놓거나 파일 첨부 버튼을 클릭하세요.

파일 크기 제한 : 0MB (허용 확장자 : *.*)

0개 첨부 됨 ( / )
List of Articles
번호 제목 글쓴이 날짜 조회 수
83 여치의 프로그래밍 강좌 #6 file [1] 여치 2005-07-27 32469
82 여치의 프로그래밍 강좌 #5 file 여치 2005-07-27 44366
81 여치의 프로그래밍 강좌 #4 file 여치 2005-07-27 39515
80 여치의 프로그래밍 강좌 #3 file 여치 2005-07-27 35611
79 여치의 프로그래밍 강좌 #2 file 여치 2005-07-27 32206
78 여치의 프로그래밍 강좌 #1 file 여치 2005-07-27 31415
77 지형도 BSP를 사용하시나요? [1] 초보 2005-07-06 26505
76 DirectX 입문용으로 적절한 책이 있을지요? [2] MiR 2005-03-01 41313
75 [re] DirectX 입문용으로 적절한 책이 있을지요? [1] 여치 2005-03-02 30325
74 BSP/Portal/PVS에 대한... guest 2005-02-18 24416
73 [re] BSP/Portal/PVS에 대한... file 여치 2005-02-19 23562
72 3D가속에 관한 질문 [3] 바하무트 2004-12-29 37337
71 [re] 3D가속에 관한 질문 여치 2004-12-29 27630
70 [질문] HeightMap의 퍼포먼스... [1] croove 2004-11-01 45648
69 [상담] 어떻게 해야할까요? . 2004-08-20 26048
68 [re] [상담] 어떻게 해야할까요? [1] 여치 2004-08-21 29025
67 [질문] 힙메모리 라이브러리에대해서. clever98 2004-08-08 32767
» [re] [질문] 힙메모리 라이브러리에대해서. [1] 여치 2004-08-08 30327
65 [re] [질문] 단편화의 제거는 어떤식으로 하시나요? [1] 웰치스포도주스 2004-11-23 27817
64 개발 인력에 대한 질문 [1] 방문객 108 2004-07-20 23057



XE Login

天安門大屠殺 六四天安門事件 反右派鬥爭 大躍進政策 文化大革命 六四天安門事件 The Tiananmen Square protests of 1989 天安門大屠殺 The Tiananmen Square Massacre 反右派鬥爭 The Anti-Rightist Struggle 大躍進政策 The Great Leap Forward 文化大革命 The Great Proletarian Cultural Revolution 人權 Human Rights 民運 Democratization 自由 Freedom 獨立 Independence 多黨制 Multi-party system 民主 言論 思想 反共 反革命 抗議 運動 騷亂 暴亂 騷擾 擾亂 抗暴 平反 維權 示威游行 法輪功 Falun Dafa 李洪志 法輪大法 大法弟子 強制斷種 強制堕胎 民族淨化 人體實驗 胡耀邦 趙紫陽 魏京生 王丹 還政於民 和平演變 激流中國 北京之春 大紀元時報 九評論共産黨 獨裁 專制 壓制 統一 監視 鎮壓 迫害 侵略 掠奪 破壞 拷問 屠殺 肅清 活摘器官 障テ社會 誘拐 買賣人口 遊進 走私 毒品 賣淫 春畫 賭博 六合彩 台灣 臺灣 Taiwan Formosa 中華民國 Republic of China 西藏 土伯特 唐古特 Tibet 達償ワ喇嘛 Dalai Lama 新疆維吾爾自治區 The Xinjiang Uyghur Autonomous Region free tibet