mlx 라이브러리는 X-Window 나 Cocoa에 대한 지식 없이도 스크린에 기본적인 렌더링할 수 있도록 도와주는 그래픽 라이브러리입니다.
교육용으로 자체 제작된 라이브러리라 기능이 매우 제한적입니다.
과제에서는 opengl과 mms 두 버전이 제공됩니다.
opengl을 make하면 libmlx.a라는 정적라이브러리가 생성되며
mms를 make하면 libmlx.dylib라는 동적라이브러리가 생성됩니다.
📌 정적라이브러리
정적라이브러리는 다른 목적파일이나 라이브러리와 링킹되어 실행파일로 만들어집니다. 때문에 별도의 작업없이 실행파일만으로 라이브러리 내부의 코드를 이용할 수 있게 됩니다. 하지만 프로그램이 실행될때마다 매번 라이브러리도 메모리에 올라가야 하기 때문에 메모리 효율이 떨어질 수 있습니다.
📌 동적라이브러리
동적라이브러리는 런타임에 라이브러리를 참조해 원하는 내용만 가져와 사용하는 방식입니다. 여러 프로세스들이 동적라이브러리의 가상페이지를 참조할 수 있어 메모리를 효율적으로 쓸 수 있지만 오버헤드가 존재해 속도는 정적라이브러리에 비해 느린 편입니다.
mac os x에서 동적라이브러리를 이용할 때 경로 설정을 따로 해줘야하는 불편함이 있어 정적라이브러리를 이용하여 컴파일하였습니다.
Makefile에 다음 컴파일옵션들을 추가합니다.
-L./mlx -lmlx -I./mlx
-framework OpenGL -framework Appkit
-L : 라이브러리의 위치-l : 라이브러리의 이름(libmlx.a의 lib와 확장자는 생략 가능)-I : mlx.h의 위치mac os x의 OpenGL과 Appkit을 사용하기 때문에 컴파일시 명시해줘야 합니다.함수에 대한 설명입니다.
void *mlx_init()
프로그램과 디스플레이 장치를 연결해주는 함수입니다.
다른 mlx.h 함수들을 이용하기 위해 선행되어야 합니다.
연결에 대한 식별자를 반환합니다.
void *mlx_new_window(void *mlx_ptr, int size_x, int size_y, char *title)
window를 생성해주는 함수입니다.
void *mlx_ptr - mlx_init으로 받은 연결에 대한 식별자이다.int size_x - 가로 너비int size_y - 세로 너비char * title - window의 제목window에 대한 식별자를 반환합니다.
int mlx_loop(void *mlx_ptr)
키보드와 마우스에 대한 event를 처리하는데에 이용됩니다.
event를 받도록 대기하며 event를 받았다면 hook함수에 등록된 callback함수를 실행시킵니다.
int를 반환하도록 되어 있지만 실제로는 무엇도 반환하지 않도록 무한루프를 돌고 있습니다.
int mlx_hook(void *win_ptr, int x_event, int x_mask, int (*funct)(), void *param)
x_event와 x_mask는 event에 대한 값입니다. funct는 event를 받았을때 실행할 callback함수이며 이 callback함수에 param을 넘겨줍니다.
int mlx_loop_hook(void *mlx_ptr, int (*funct_ptr)(), void *param)
event를 받지 않을때 실행되는 함수입니다.
즉 window는 델타타임마다 이 함수를 통해 렌더링 되게 됩니다.
mlx_hook과 마찬가지로 callback함수와 callback함수에 넘겨줄 인자로 param을 받습니다.