편의상 아래는 반말입니다. 메모형식으로 적어뒀다가 나중에 한가해 지면 초보 위피 개발자를 위해서 자료를 정리해서 공개할 예정입니다. ARM에 어울리는 for문 사용법이나 memcpy와 memmove의 차이점과 효용성 등, 초보들의 고민인 속도와 메모리 절약에 도움이 되는 정보들을 소개할 예정입니다.


위피C는 동적 할당 메모리를 간접 포인터로 연산. 사용예는 아래와 같다.

int FileBufferID, bufferPointer;
FileBufferID= MC_knlCalloc(sizeof(int)*10000); 
bufferPointer= (M_Byte *)MC_GETDPTR(FileBufferID);

라고 할당 하면 일반 C 함수의
int *FileBuffer = new int[10000];
와 같이 메모리가 할당되고 사용할 수 있게 된다.

하지만 여전히 불편하다.
FileBufferID 는 위피가 자체적으로 관리하는 메모리의 인덱스 값이고 bufferPointer는 위피 메모리 관리자에게 FileBufferID가 어디있는지 알아온 실질적인 주소값이다. 사용할때는 이 bufferPointer를 사용한다.
문제는 bufferPointer는 순수한 주소값이기 때문에 int test = FileBuffer[20]; 같이 쉽게 쓸 수는 없다.

int test;
memcpy(&test, bufferPointer+(sizeof(int)*20), sizeof(int));
위와 사용해야한다. 구조체의 경우도 마찬가지다.


예제 (GAME_DATA구조체를 10000개 생성하는 법과 20번째 구조체 값을 얻어오는 방법)
typedef struct _GAME_DATA
{
   PLAYER_DATA player1;
   PLAYER_DATA player2;
   int tick;
}GAME_DATA;


int FileBufferID, bufferPointer;
FileBufferID= MC_knlCalloc(sizeof(GAME_DATA)*10000); 
bufferPointer= (M_Byte *)MC_GETDPTR(FileBufferID);

GAME_DATA test;
memcpy(&test, bufferPointer+(sizeof(GAME_DATA)*20), sizeof(GAME_DATA));

조금 불편해 보인다. 하지만 조금 쉽게 사용할 수 있는 방법이 있긴 하다. 이건 다음에 설명.



컴팩션이 일어나면 포인터의 주소가 바뀌기 때문에 주의해서 써야 한다. 하지만 쫄아서 애초부터 정적 할당
을 남발하지는 말자. 우리는 메모리 관리가 생명이니까.

맘편히 사용하려면 언제 컴팩션이 일어나나 마음졸이지 말고 데이터에 접근할때마다 매번 포인터를 갱신만
해 주면 된다.
즉, bufferPointer= (M_Byte *)MC_GETDPTR(FileBufferID); 이 구문을 사용직전에 매번 호출해 주면 된다.



-나무늘보 씀
Posted by Madcat Games
:
BLOG main image
Homemade evolution!    카나페 게임즈의 공식 블로그   by Madcat Games

공지사항

카테고리

분류 전체보기 (111)
알림 (22)
게임소개 (3)
개발노트 (8)
칼럼 (2)
늘보 놀이터 (63)
제리 놀이터 (11)
Bob (1)

글 보관함

최근에 올라온 글

최근에 달린 댓글

달력

«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Total :
Today : Yesterday :