반응형

메모리 공간

Code 영역 실행할 프로그램의 명령코드 저장 공간
Data 영역 전역변수 저장 공간
Heap 영역 동적할당 저장 공간
Stack 영역 지역, 매개 변수 저장 공간

 

메모리 할당

- 정적 할당

  - 컴파일 시 할당될 메모리 크기가 결정

  - Stack, Data 영역에 변수로 할당되는 메모리

- 동적 할당

  - 실행 중 메모리 할당

  - 동적할당 메모리는 Heap영역에 할당

 

Heap 영역의 특징

- Heap 영역은 자료형의 개념이 없음. byte단위로 정보를 처리한다.

- Heap 영역은 일반적인 Stack과 Data영역보다 넓은 메모리 영역을 가진다.

- 할당된 메모리의 시작주소를 malloc함수를 호출한 지역으로 반환한다.

- 시작주소만 반환 되기 때문에 Stack영역에서 사용하려면 해당 자료형 주소로 형변환 해야한다.

- Heap영역에 할당된 메모리는 자동으로 해제되지 않는다.

 

malloc 함수

- Heap 영역에 동적으로 공간을 할당 해주는 함수

- 필요 헤더 : <stdlib.h>

- (void*)malloc(size)

  ※ 할당 하고싶은 자료형을 byte 단위로 인자값을 보낸 후 할당된 메모리의 시작주소를 해당 자료형으로 형변환 후 사용.

  ※ 할당에 성공하면 해당 주소값을 반환하고, 실패하면 NULL을 반환한다.

  ※ int* a = (int*)malloc(sizeof(int));

 

free 함수

- Heap영역에 할당된 공간을 해제하는 함수

- 필요 헤더 : <stdlib.h>

- free(void*)

  ※ Heap 영역에 할당된 메모리는 자동으로 해제되지 않는다.

  ※ 해제를 한다고 해당 포인터 변수의 값이 없어지는것이 아니다. (메모리 사용 권한만 취득, 반납하는 개념)

  ※ 해제를 한 후 해당 포인터 변수는 NULL로 밀어준다.

  ※ free(ptr);

     ptr = NULL;

반응형

'Stack > C' 카테고리의 다른 글

C 중간 활용 : 학생 관리 시스템 만들기  (0) 2021.08.24
C 파일 입출력  (0) 2021.08.24
C 구조체, 구조체 포인터  (0) 2021.08.22
C 포인터, 배열  (0) 2021.08.22
반응형

포인터

- 포인터 : 주소값을 저장하기 위한 변수

- 포인터 size : 4byte(32bit), 8byte(64bit)

- 포인터형 : (자료형)* 변수명

   ※ 포인터형도 자료형 범주에 포함시키기도 한다.

   ※ *연산자의 위치는 상관없다.

   ※ 포인터에 형이 없으면 *연산을 통한 메모리 접근은 불가능하다.

- 포인터 변수의 자료형은 해당 주소의 자료형과 동일해야 한다.

- 포인터의 형이 존재하는 이유는 메모리 공간을 참조하는 기준이 된다.

  ※ int* ptr : 해당 변수에 저장되어있는 주소값으로 가서 sizeof(int)(4byte)를 읽어들여 정수로 해석한다.

- NULL 포인터 : 아무데도 가리키지 않는다.

   ※ int* ptr = 0 or NULL

 

#include<stdio.h>

void main()
{
    int a = 10;
    int* ptr = &a;
    
    //ptr은 주소값을 가지므로 ptr == &a
    printf("var a address : %p, pointer ptr value : %d", ptr, *ptr);
}

 


배열

- 배열의 이름은 포인터이다.

  ※ 단, 값을 바꿀 수 없는 '상수 형태의 포인터'이다.

  ※ 배열의 이름도 포인터이기 때문에 배열의 이름을 피연산자로 하는 *연산이 가능하다.

  포인터 변수 배열 이름
이름 유무
저장하는 값 주소 값 주소 값
주소 값 변경 가능한가? 가능(변수) 불가능(상수)

 

- 포인터 변수를 배열로 사용하기

#include<stdio.h>
#define MAX 3

void main()
{
    //포인터에 배열의 이름을 넣어 배열처럼 사용 가능
    int arr[3] = {0, 1, 2};
    int* ptr = arr or &arr[0];

    for(int i = 0; i < MAX; i++)
    {
        ptr[i] += 1;
        printf("%d", ptr[i]);
    }
    
    //결과 1 2 3
}

 

 

- 배열의 다른 표현방법

#include<stdio.h>
#define MAX 3

void main()
{
    int arr[3] = {0, 1, 2};
    int* ptr = arr or &arr[0];

    for(int i = 0; i < MAX; i++)
    {
        *(ptr + i) += 1;
        printf("%d", *(ptr + i));
    }
    
    //결과 1 2 3
}

  ※ int형 포인터를 대상으로 1을 증가시키면 4가 증가한다.

  ※ int 형 포인터를 대상으로 +-n => +-n * sizeof(int)

  ※ 결론 arr[i] == *(arr + i)

 

- 활용

#include<stdio.h>

//배열도 포인터이기 때문에 인수를 char str[]로 사용해도 무방하다.
void ConvertLowercase(char* str)
{
    for (int i = 0; str[i] != NULL; i++)
        if (str[i] >= 'A' && str[i] <= 'Z')
            str[i] += 32;
}

void main()
{
    char arr[3] = "AB";
    ConvertLowercase(arr);
    printf("%s", arr);
    
    //결과 ab
}

  ※ char 배열의 마지막은 NULL(\0)로 채워지므로 for문 조건문에 NULL을 사용할 수 있다.

 


포인터 배열

- 포인터 변수로 이뤄진, 주소 값의 저장이 가능한 배열을 가리킨다.

#include<stdio.h>
#define MAX 3

void main()
{
    int a = 10, b = 20, c = 30;
    int* arr[3] = {&a, &b, &c};

    for(int i = 0; i < MAX; i++)
        printf("%d", *arr[i]);
    
    //결과 10 20 30
}
반응형

'Stack > C' 카테고리의 다른 글

C 중간 활용 : 학생 관리 시스템 만들기  (0) 2021.08.24
C 파일 입출력  (0) 2021.08.24
C 구조체, 구조체 포인터  (0) 2021.08.22
C 동적할당  (0) 2021.08.22
반응형

여태 기회가 닿지를 않아 포톤을 깊게 파보지를 않았는데, 작년 플랙프라이데이에 구매한 포톤 상품이 곧 만료라(11월까지 ㅠㅠ..) 이번 기회에 깊게 파보려고 이 일지 작성을 시작하게 되었다.

 

포톤에 붙일 게임도 프로토타입으로 한번 만들어보긴했는데, 동작관련 문제를 아직 해결하지 못해서 시스템 먼저 만들어보게 되었다. 그래서 만들기 시작한것이 로비, 방 구현이다.

 

이 일지에 작성된 로비, 방 스타일은 옛날에 서비스를 했던 서바이벌 프로젝트에서 가져왔다.

어릴때 했던 게임중 가장 재미있게 했었던 게임이고, 시스템 자체도 꽤 괜찮다고 판단해서 작업을 시작하게되었다.

 

작업은 저번달 22일부터 조금씩 진행하기 시작해서 짬짬히 작업을 해왔다.

 

1. 입장

입장을 시작하게 되면, 로비 화면이 노출된다.

하단의 화살표 버튼과 우측 버튼들은 아직 기능구현이 되지 않았다.

포톤 콜백을 통해 방이 생성되면 파티클이 없어지고 방에 대한 옵션을 프리뷰 형태로 볼 수 있다.

 

2. 방 만들기

방을 생성하고 싶으면 비어있는 방들(파티클들)을 클릭하면 방 생성창이 열린다.

일단 시험삼아 커뮤니티, 팀, 서바이벌모드와 인원을 선택해서 방을 생성 할 수 있다.

 

3. 생성된 방의 프리뷰 확인

다른 클라이언트가 방을 생성하면 포톤 콜백을 통해 생성된 방의 리스트를 갱신해 로비에 있는 유저에게 생성된 방의 옵션 등을 프리뷰로 볼 수 있다. (방의 모드, 입장한 유저의 캐릭터 정보, 팀 정보 확인 가능)

 

4. 방 입장 및 캐릭터, 팀 선택

생성되어 있는 방을 누르면 입장이 시작되며, 캐릭터 선택이 가능하고, 팀 모드에서는 팀 선택이 가능하다.

상대랑 같은 슬롯을 선택할 경우를 대비해서 마스터 클라이언트에서 정보를 받아 슬롯정보를 다른 클라이언트에게 뿌려주고 일반 클라이언트들은 갱신만 하게되는 형태로 했다.

(ExpectedValues를 써볼까 고민하긴 했지만, 위와 같은 형태에선 괜히 코드만 더 복잡해질거같아서 배제했다.)

 

이 작업을 거의 20일간 했는데, 그래픽 리소스 문제도 그렇고 포톤 콜백이나 함수 활용에 대해 일일히 로그 찍고 확인하다보니 생각보다 많은 시간이 소요됨... 그래도 나름 형태도 어느정도 잡혔고, 다음 작업은 로비 쪽의 구현하지 못한 기능 완성과 방의 기능 완성을 할 예정이다!

반응형
반응형

멀티플레이 로비관련 작업을 하던 중, UI요소 사이에 파티클을 넣어보았다.

작업을 어느정도 마친 뒤, 마지막으로 batch 확인을 했는데 파티클을 겨우 10개 사용했는데 다른 UI와 섞여 batch 수치가 SetPassCall과 함께 폭발하고 있었다.

 

 

일단 파티클을 사용한 UI 요소의 구성은 다음과 같다.

Room(Empty object)의 자식으로 파티클, 스프라이트, 텍스트로 들어가있다.

 

 

위의 게임오브젝트가 10개로 불어난다면 다음과 같은 현상이 일어난다.

 

이걸 10개만 불려도 각각 SetPassCall과 Batch가 18로 불어난다.

UGUI 구조상 Canvas안에서는 계층에 따라 레이어 순서가 정해지니, Render queue나 파티클의 Order in layer를 건드려도 아무 개선이 되지 않는다.

 

 

결국 구조를 바꾸는 수 밖에 없었다.

 

위와 같이 파티클들을 전부 빼서 따로 모아두게되면 막무가내로 했던 구성보다 Batch 수치가 6배 차이가 난다.

이걸로 해결! 이면 좋겠지만, UI를 저거 10개만 쓰고 마무리할것도 아니고 다른 UI요소도 고려해야한다.

 

일단 전제 조건은 다른 UI요소들의 이미지들이 같은 아틀라스에 패킹되어있는것으로 한다.

같은 아틀라스에 패킹되어 있는 이미지를 가진 UI요소들은 어디가 어디위에 겹치던 Batch가 1일것이다.

문제는 파티클이다. Paticles 게임오브젝트 위의 계층에 다른 UI요소가 들어가있으면, 즉 파티클을 다른 UI요소들 사이에 샌드위치로 끼워버리는 순간 문제는 발생한다.

 

위와 같은 상황에서 Frame Debugger를 돌려보면 (새로만든 UI요소) - (Paticles) - (Rooms) 순으로 그려지는것이다!!

 

그렇기 때문에 Particles 게임오브젝트의 배치는 계층 위쪽에 배치하려면 Particles 위의 계층에 아무것도 없어야하고, 그렇지 않으면 제일 밑으로 내려야한다!

 

 

필자의 경우엔 Paticles 위쪽 계층에 UI요소가 많이 있어서 최하단으로 배치했다.

 

 

최하단으로 옮기게 되면 Batch 문제에 탈줄은 했지만, UGUI 계층 문제로 파티클이 파란색 박스를 덮게된다.

 

이건 우리가 원하는 바가 아니므로, 장치를 하나더 추가한다.

Canvas에는 Sort Order를 지정할 수 있다. 이것을 사용해서 해결해보자.

 

 

부모 Canvas에는 Sort Order를 1로, Particles에는 Canvas를 추가해서 Sort Order를 0으로 사용해주면 된다. (Sort Order 수치는 부모 Canvas가 Paticles Canvas보다 높으면 아무거나 상관없다.)

 

이렇게 세팅을 해주면 다른 UI요소를 신경 쓸 필요도 없고, 파티클이 파란 박스를 덮지 않고, 처음에 파티클만 빼서 배치했던 경우와 똑같은 수치의 Batch와 SetPassCall을 확인할 수 있다!!

 

추가로 Canvas를 이용해서 SortOrder를 설정 해주게되면 UI 계층 순서는 신경 쓰지 않아도 된다.

 

마지막으로, 이런 세팅은 위와 같은 경우에만 의미가 있는 세팅이기 때문에 UI요소 한두개에 이펙트 터뜨리는거에 위와 같은 세팅을 해버리면.. 배보다 배꼽이 더 커지는 현상이 발생하므로 잘 선택하여 사용하자.

반응형
반응형
  • 기본 슬롯 단축키

(왼쪽부터)

1. Select : S or Ctrl or Ctrl + Drag

2. Move : M

3. Brush : B

4. Fill box : U

5. Picker : I

6. Eraser : D or Shift or Shift + Drag

7. Fill : G

 

  • 기타 단축키

(블럭 선택 후)

1. 시계방향 회전 : ]

2. 반시계 방향 회전 : [

3. 좌우 반전 : Shift + [

4. 상하 반전 : Shift + ]

반응형

+ Recent posts