Hat (^) 이 붙어있다.

뭔가 했더니 C++/CX 문법이라고 한다...

 

https://docs.microsoft.com/ko-kr/cpp/cppcx/visual-c-language-reference-c-cx?view=msvc-160 

 

C + +/CX 언어 참조

자세한 정보: c + +/CX 언어 참조

docs.microsoft.com

 

 

 

이해를 똑바로 한게 맞다면... 저 Hat은...

포인터의 레퍼런스 카운터와 연관되어있는 (카운터를 올리거나 내리는) 기호인듯... 합니다.

 

 

 


https://devblogs.microsoft.com/cppblog/ccx-part-2-of-n-types-that-wear-hats/

작년 봄 쯤.

 

아 다이렉트X 해봐야지! 하고 과감하게 잡았던 DX11 프로젝트를 완벽하게 이해를 못하고 말아먹고, 결국 학원을 갔더랬다.

 

과거의 처참한 흔적들

 

학원에서 배운건 DX9를 기반으로 한 작업이었지만, 이번에 DX11을 쓸 일이 생길것 같아서 미리 학습차 샘플 프로젝트를 좀 해볼까 한다.

 

이제는 단순히 학습용이 아니라 생존용으로 배워야 하게 생겼으니...

 

 

 

 

목표는 DX11 기반으로 다이나믹 매쉬 띄워서 움직이기 까지.

 

기간은 2주.

 

 

 

 

일단 구조가 바뀌니까 알아보는것부터 문제다

일단은 진입점부터 찾아나서기로 했다.

 

어디가 시작인지 파악이 안되어서 디스어셈블러까지 돌려본 결과 app.cpp에 있는 저 main 함수가 진입점인걸 확인.

 

진입점에서 D3DAppSoruce 타입의 새 항목을 만들고 -> 그것을 코어 어플리케이션의 Run에 삽입해서 돌리는? 구조인거 같은데,

실행순서는 위 이미지에서 탑->다운 으로 이루어지는 모양인듯 하다.

(main -> D3DAppSource 생성자 -> CreateView -> App 생성자 -> App.Init)

 

 

굳이 디스어셈블리를 썼어야했을까...

 

 

 

 

 

이런걸 만들고 있습니다.

'게임 개발 > Unity' 카테고리의 다른 글

기록 #2  (0) 2020.05.09
Rect Transform 잠깐 메모  (0) 2020.02.09
분명 자주 쓰는데 자주 까먹는 기능들  (0) 2019.12.27

지금은 학원 팀 프로젝트 기간이다.

 

프로젝트가 열심히 난항을 겪고 있지만 (...) 뭐 아무래도 좋다는 느낌으로 작업중이었는데,

 

다른 팀의 인원과 대화하다가 문득 메모리 관리 얘기가 나왔던게 아닌가.

 

'어? 우리팀 한번도 안터졌는데?' 라는 생각과 동시에 그럴리가 없는데 라는 생각이 같이 드는게 아닌가.

 

그래서, 메모리 누수 분석 코드를 넣고 돌려보았는데...

 

.....

 

사실상 이정도면 모든 호출에서 다 터지는 수준

상상을 초월하는 결과가 나오고 있는게 아닌가..

 

단순히 저 호출단위에, 평균적으로 보이는 120, 384 바이트를 대입하면... 약 3억 6천 바이트, 즉 거의 300메가바이트 언저리의 누수가 발생중이라는 소리가 된다.

 

아니 실행 프로세스 메모리가 250을 안넘는데요

이것도 처참한 상황이지만, 더 심각한건 따로 있었다.

 

특정 메모리 영역에서, 있어서는 안되는 메모리 누수가 발생중이었었다..

 

단일 330KB 누수

아니 무슨 1개 메모리 포인터 누수가...

 

이건 안되겠다 싶어서 팀원들에게 깃 업로드를 전부 중지시키고, 오늘은 하루종일 누수만 잡았다.

 

할당된것도 빼보고, 강제로 셧다운도 시키고, 구역 하나씩 분리해서 해본결과..

 

최소한의 조치

일단... 메인 스테이지에서 메모리 누수는 전부 잡는데 성공했다...

 

하지만 각자가 짠 특수한 구조로 된 영역에서는 여전히 메모리가 줄줄새서....

 

오늘 밤은 일찍 자기 글러먹은거 같다 ㅎ.

'신변잡기 > 일상' 카테고리의 다른 글

PC 카톡은 왜 삭제기능이 없을까...  (0) 2022.11.20
근황  (0) 2022.04.25
올해의 목표  (0) 2021.01.03
근황 2  (0) 2020.10.15
근황  (0) 2020.07.14

git에 특정 조건을 걸어서 메시지등을 출력하는 hook이라는 기능이 있다.

(더 상세한 내용은 이 블로그 말고 다른곳을 검색해보기 바란다)

 

훅을 처음 써보면서, shell script도 제대로 쓸줄몰라 엄청 해멨으나 일단 원하는걸 하나 구현해놨기에 기록해둔다.

 

원하는건 코드 컨벤션을 맞추기 위해 설정한 문구 중

모든 코드 스타일을

void foo()
{
codes;
}

  방식으로 픽스하기 위한 조건이었다.

 

그걸 위해, 검색해서 pre-commit 을 수정해보려고 하니... 에러가 뜬다.

 

error: cannot spawn .git/hooks/pre-commit: No such file or directory

 

대충 이런 문구다.

 

요약하면 pre-commit이라는 hook이 없다는 얘긴데...

 

정확한 이유는 파악하지 못했으나, git 용 hook에 필수적으로 포함되어야 하는 문구들이 있는 모양이었다.

 

해서, 검색을 통해 어떤 문구가 있어야하는지 파악을 해두고, 문구 적용을 시켜보도록 했다.

 

 

 

#단순히 ") {" 스타일이 들어오면 밴 먹임

disallowed="){"


git diff --cached --name-status | while read x file; do
	if ["$x" == 'D']; then continue; fi #뭔 의미지? 'D'가 뭐지?
	
	if grep ')\s{' $file ; then
    echo "ERROR: 코드 스타일 에러입니다."
    exit 1
	fi	
	
	for word in "$disallowed"
	do
	    if egrep $word $file ; then
        echo "ERROR: Disallowed expression \"${word}\" in file: ${file}"
        exit 1
    fi
    done
		
done || exit $?

 

완성된건 이런 스타일인데, 정리하면 다음과 같다.

 

1. disalowed에 "없어야 될 문자열"을 기록한다.

2. git에서 수정된 사항을 읽는다.

3 (은 이해를 못했습니다...)

4. 파일을 전체 검색하며, 조건에 맞는 문자열이 있는지 검사후, 조건에 만족하면 echo  메시지를 띄운 후 에러를 리턴한다.

5. 정상 통과 하면 while문을 종료시키고 끝낸다.

 

의 구조이다.

 

웃긴점은, 이를 좀 "있어보이게" / "다른 사용자들이 큰 수정할 필요없이" 적용을 시키기 위해 core.hooksPath를 수정해줬더니 저 hook 조차 에러를 검사하여 리턴해버리는게 아닌가...

이거 뭔... 제 발등 찍기도 아니고

해서, 이런 경우에는 hookspath를 임의로 수정해준 뒤, 커밋 갱신을 해줘야 하는 소소한 불편함(?)이 발생하고 있다.

 


 

해당 문서를 위해

woowabros.github.io/tools/2017/07/12/git_hook.html

 

훅으로 Git에 훅 들어가기 - 우아한형제들 기술 블로그

들어가며…

woowabros.github.io

singun.github.io/2019/03/16/git-hook-pre-commit/

 

특정 문자열이 커밋되는 것을 막아보자 - Programming Singun

페이스북이나 인스타그림 등의 open api를 사용하기 위해서는 인증을 위한 토큰 값이나 키 값을 사용해야 할 때가 있습니다. 민감할 수 있는 정보라 git 에 커밋하는게 그리 달갑지 않아, 이런 경우

singun.github.io

두 문서를 참고하였습니다. 감사합니다.

사실 원래 좀 적을게 많은데 다 까먹어버렸구 까먹기전에 하나라도 더 적고자...

 

뭐. 학원과정중인데, D3DX - 2DX 때는 스프라이트가 표현을 전부 도와줬지만,

D3DX에서는 원래 버텍스를 세팅하고, 표면을 만들어서 그 위에다 덧 씌우는 식으로 작업이... 되어야 하는데...

 

이게 일단 설명없이 시도해보려고 하니까 되게 막막하더라.

 

일단... 하다가 막혔던것 위주로.

 

1. 선생님! 텍스쳐 입혔는데 텍스쳐가 박살나요!

작업중에 이런 광경을 목격했다.

처음에는 이게 무슨 상황인지 전혀 이해가 안되어서 (분명 Y축값은 전부 0이었다!) 좀 유심히 찾아본결과...

 

단순 Color만 들어가있는 CVERTEX 구조체와, UV가 들어가있는 UVERTEX 구조체의 사이즈가 다른데 VERTEX구조체를 변경했음에도 불구하고 기본 버텍스 사이즈를 변경하지 않아서 생긴 문제였다.

 

뭔 소리냐... 하면...

 

 

이 파트 얘긴데

 

우측 26번줄에서 버텍스 타입을 VTX_TEXTURE (=UVERTEX 구조체) 로 변경했음에도 불구하고 버텍스 사이즈 변수가 여전히 VTX_COLOR (=CVERTEX)로 지정되어있는것이다...

해서, SetStreamSource 할때는 CVERTEX 사이즈로 읽는데, 정작 버퍼에 들어간건 UVERTEX니까 저렇게 엉망진창으로 나올수밖에...

 

 

 

2. 선생님! 텍스쳐를 여러개 넣었는데 하나만 출력돼요!

 

이거는 솔직히 이해가 좀 잘 안됐(고, 아직도 잘 안되)는데...

 

먼저, 2D 시절에 텍스쳐를 그릴때 어떻게 했는지 다시 보고 오자.

 

맨 마지막줄이다.

 

 

CGraphic_Device::Get_Instance()->Get_Sprite()->Draw(pTexInfo->pTexture, nullptr, &D3DXVECTOR3(fCenterX, fCenterY, 0.f), nullptr, D3DCOLOR_ARGB(255, 255, 255, 255));

 

이 말은 즉슨, "장치를 통해 생성된 스프라이트에 크기를 지정해주고, 지정된 텍스쳐를 출력시킨다" 라는 의미.

 

즉, 장치를 이용해서 텍스쳐를 지정해주고 있다는 얘기와 일치... 한다고 볼 수 있을까? (솔직히 확신이 들진 않는다)

 

 

아무튼... 이래서 텍스쳐를 두개 불러왔음에도 불구하고 세팅을 하나만 해주면

 

그냥 처참하게 모든 물체에 같은 텍스쳐가 입혀지게 된다.

 

그래서 어쩌란거냐? 랜더할때 텍스쳐를 매번 지정해줘야 한다는것이다...

 

"아니 선생님, 그러면 매번 엑세스한다고 자원낭비되고 뭐 그런거 없나요?"

 

라는 질문이 들어온다면

 

"애초부터 그러고 있었다" 라는 대답밖에는 나올게 없다...

 

이제와서 깨달은 얘기지만, 랜더 하고 있을때 매번 스프라이트를 지정해주고 있지 않았던가...

 

그럼 뭐, 3D에서도 별 다른건 없다고 생각한다. 역시나 여기서도 텍스쳐를 매번 지정해줘야지

 

 

 

결과물. 이미지가 뒤집힌건 단순히 uv를 잘못준것이다.

 

가끔씩은 이해가 안되더라도 일단 납득부터 하는게 통할때도 있는것 같다...

1. 취업하기

2. 다이어트 끝내기

3. 연애하기

 

뭐 그렇습니다.

 

6개월뒤에 근황 올려볼게요 어떻게 되나. 

'신변잡기 > 일상' 카테고리의 다른 글

근황  (0) 2022.04.25
오늘 있었던 일  (0) 2021.02.01
근황 2  (0) 2020.10.15
근황  (0) 2020.07.14
올해 목표  (0) 2020.05.18

마지막 인덱스 데이터가 와장창

 

작업중, 파일을 불러올때 마지막 줄이 계속 오염이 일어나서 프로그램이 깨지는 현상을 목격함.

 

 

뭔가 했더니 값 읽어오는 >>포인터<< 변수가 데이터 로드 블럭 나가면서 데이터를 오염시켜서 생긴 문제였음.

코드 블럭 나가자마자 nullptr 찍어주는거로 해결.

 

원인 찾는건 조금 걸렸지만 아무튼 간단하게 해결

'프로그래밍 > C/C++' 카테고리의 다른 글

기록용 : 메모리 누수 찾기  (0) 2021.07.18
짧은 기록  (0) 2021.06.18
Const 키워드.  (0) 2020.08.18
오늘의 실수.  (0) 2020.03.29
Visual C++에서 C++ 버전확인하는 방법.  (3) 2020.02.27

+ Recent posts