미분류

GifLib 더러운 API로 용케도 여태 살아남았나

이번에 GifLib으로 GIF 디코딩 인코딩을 하게 됐는데 라이브러리가 정말 엉성한데다 문서도 부실해서 일단 대충 얼기설기 엮어서 몇가지 샘플로만 정상 동작 확인하고 끝냈다.

고수준 함수도 없고, 예제도 없으며, 그렇다고 저수준 함수가 친절한 구성으로 돼있느냐면 그것도 아니라서 예제 코드를 찾아보려고 검색해봤는데 그것도 안 나오고.

용케도 이런 상태로 여태 살아남았구나 싶을 정도. 어차피 MP4(H.264)랑 WebP로 대체되는 느낌인데 그래도 GIF가 살아남긴 할테니 전체적으로 개선됐으면 좋겠다 싶다.

미분류

지금 사고 싶은 것들

1. NVMe SSD(최소 500GB)

250GB + 480GB SSD를 하나로 통합하고 싶고 2.5인치 저장매체로 되어있는걸 메인보드에다 안 보이게 꽂아두고 싶음

아마존에서 블랙프라이데이 딜로 1테라 M.2 SATA SSD 샀고 한국 날아오는 중. 스탠다드 배송인건 친구랑 같은데 친구는 더 일찍 출발해서 이미 저번주에 택배사로 전달됐는데 난 이제 비행기 타고 오고 있다.

2. 2.5인치 3TB 외장하드디스크

지금 쓰고 있는 3.5인치 4TB 하드디스크에 불량 섹터가 생기는 중. 한 달 안에는 반드시 사야 될 거 같은데 일단 블랙프라이데이 세일 기다리는 중.

옥션에서 그냥 샀다. 마침 빅스마일데이 할인 기간이라 2만원 싸게 샀음. 문화상품권 쓰면 만원 더 깎을 수 있었을텐데 귀찮기도 하고 해서.

3. FHD 144Hz 모니터

게임 144Hz로 쓰고 싶음

+ (2019. 03. 02.) 결국 샀다. FHD 144Hz 모니터. 리뷰 예정.

4. 맥미니(2018)

오랜만에 Xcode로 오브젝티브-C나 스위프트 프로그래밍 하고 싶다

미분류

SSE와 AVX, FMA3를 활용하자

C/C++ 게임 코딩을 좀 하다보면 SSE라는 녀석에 대해 듣게 된다. SSE 계열 명령어는 x86 및 x64 아키텍처의 주요 SIMD 명령어 셋이다. 이와 비슷한 것으로 ARM 아키텍처에는 NEON이 있다.

몇 년간은 SIMD 명령어 셋에 대해 알고는 있어도 컴파일러가 알아서 SIMD 명령어로 만들어 주겠지 하고 단순히 고급 언어로만 코드를 작성했었으나 최근에 그래도 컴파일러가 만능은 아닌데 코드를 안 만들어줄 수도 있지 않을까 하고 공부하면서 코드를 작성했었다.

위 이미지는 작년에 작성해서 돌려보고 찍었던 테스트 결과 스크린 샷이다. 여러 번 돌려보면서 그나마 결과가 잘 나온 화면을 찍었던 것이고, 생각보다 결과가 만족스러울 만큼 좋아진다는 느낌이 없어서 그 뒤로 한동안은 다시 SIMD 명령어는 다뤄보지 않았다.

 

그리고 이번에 아예 새로 다시 작성을 해봤다.

1

인라인 함수에 대해서는 행렬 저장 기능이 컴파일러 최적화로 코드 자체가 날아가버렸다. 그나마 행렬 결과물 테스트해본다고 곱셈 연산한 것은 남았다.

참고로 컴파일러 최적화를 수행한다면 위와 같은 형태가 되지만 최적화를 수행하지 않는다면 차이가 크게 벌어지지는 않는다. 특히나 인라인 함수로 실행한 코드가 아니라면 오히려 SSE나 AVX가 인라인 C++ 코드보다 더 느릴 때도 있다.

처음엔 volatile 키워드로 아예 C++ 코드는 레지스터 사용을 안 하도록 설정해보기도 했는데 차이가 벌어지지는 않는다.

SSE 시리즈는 아마 코어 2 듀오 시리즈들은 웬만하면 사용할 수 있을테고 AVX는 코어-i 2세대(샌디브릿지)부터, AVX2의 FMA3는 코어-i 4세대(하스웰)부터 사용할 수 있으니까 개발 타겟에 따라서 명령어를 쓰면 될 듯 싶다.

AVX는 256비트짜리를 행렬곱에 그대로 쓰면 오히려 느리고 AVX에서 추가된 SSE 확장(_mm_broadcast_ss)을 쓰거나 FMA3와 같이 쓰거나 하는게 효율이 좋다.

코어 2 듀오, 애슬론, 페넘 등 2005~2009년에 출시된 컴퓨터: MMX, SSE, SSE 2, SSE 3, SSSE 3, SSE 4.1, SSE 4.2, SSE 4a
코어 i-2세대, 불도저 등 2011년 이후 출시된 컴퓨터: SSE 시리즈, AVX
코어 i-4세대, 파일드라이버 등 2012~3년 이후 출시된 컴퓨터: SSE 시리즈, AVX, FMA3

미분류

[170519] 근황

1. 전에 만들다 말았던 화면 녹화 프로그램을 보강해보려고 했으나 DXGI 캡쳐 기능과 WASAPI 캡쳐 기능까진 만들었는데 MP4 같은 포맷으로 저장하는데 실패. 다만 GIF 파일 저장 기능을 좀 더 손봐서 1080p 해상도에서 30프레임까지는 무리 없이 녹화가 가능하게 만들었음.

2. 인스톨러 프로그램을 만들어보려고 했는데 생각보다 고려할게 많다. 작업하던거 중단하고 처음부터 다시 생각해봐야 할 듯.

미분류

개인적인 Intel, AMD, NVIDIA에 대한 견해들

내가 고등학교 들어가서 썼던 노트북들은 하나같이 성능이 구렸다. LG의 F2는 15인치 노트북 주제에 GMA 950을 쓰고 있어서 오피스도 느렸다. CPU도 코어 2 듀오가 아니라 그냥 코어 듀오였다. 던전 앤 파이터도 제대로 안 돌아갔음. HP의 파빌리온 dv3000은 그나마 좀 나았다. 그래픽칩셋으로 그나마 GeForce 8400GS를 쓰고 있어서 마비노기 영웅전까진 최하옵으로 돌아갔다. CPU가 초창기 듀얼코어 제품이라고 할 수 있는 메롬 CPU를 써서 느렸다는게 흠. 현재까지 마지막으로 쓴 노트북인 Apple의 MacBook Pro 13인치는 2세대 i5를 쓰긴 했는데 모바일 제품이라 성능이… SSD를 쓰고 있는데도 불구하고 Swift 컴파일할 때 속도가…

그래서 Intel의 모바일 CPU는 개인적으로 불신한다. AMD의 모바일 CPU는 아직 안 써봐서 모르겠지만 데스크톱 CPU를 봤을 때는 얘네도 똑같은 상황일거 같지만 일단 판타지로 남겨놓고…

내 첫 데스크톱(집에서 가족들이랑 쓰는 공용 말고 진짜 개인 컴퓨터)은 AMD CPU를 썼다. 대회 상금으로 받은 60만원으로 부품을 전부 사기란 너무 힘들었기 때문에 페넘 II 대신에 애슬론 II 시리즈를 구매했는데, 나름 만족스러웠다. 트리플 코어라는 요상맹랑한 제품을 썼고, 램도 하나 밖에 안 달아서 듀얼 채널로 구성하지도 않았지만 성능은 그럭저럭 나왔다. 그래픽카드는 ATi Radeon HD 5670을 달았는데 내가 했던 웬만한 게임들이 대부분 중옵까지는 돌아가서 만족스럽게 썼다. Metro 2033 시리즈나 Crysis 2 같은 애들은 원래 사양을 타는 게임이다보니 드라이버 레벨에서 몇 개씩 옵션을 낮춰서 그나마 30FPS까지는 뽑아가면서 플레이했었다.

첫 데스크톱을 구매한지 얼마 지나지 않아서(한 6개월 된 듯) Intel에서 2세대 코어-i 시리즈 CPU를 출시해서 펜티엄G CPU로 갈아탔다. 마침 RAM이 치킨게임중이라 하나 더 사서 달았고. Intel 샌디브릿지의 듀얼코어가 AMD 애슬론/페넘 II의 트리플코어를 이긴다는 말에 이쪽으로 교체했던 건데 뜻 밖에도 내 사용 환경에서는 듀얼코어가 트리플코어를 이기지 못했다. 때문에 전체적인 컴퓨팅 만족도가 떨어져버렸다. 그렇게 1년 가까이 쓰다가 친구의 i5와 내 펜티엄G를 교환하는 방식으로 중고 구매했다.

그런데 왠걸, 온도가 90도를 넘어가는 일이 빈번했다. 쓰로틀링은 없었지만 쿨러가 너무 심하게 일을 해서 소음이 장난이 아니었다. 한 2년 정도를 이렇게 쓰다가 결국 메인보드가 나가버렸다. 처음에는 메인보드 알림에 따라 CPU가 문제가 있는 줄 알았더니 메인보드가 문제가 있었다. 아마도 고열이 누적되다보니 그걸 이기지 못하고 죽었던거 같은데 케이스와 쿨러를 바꾸는 걸로 해결을 봤다.

그렇게 한 1년 쓰고 4세대 i7 리프레시로 건너왔는데 뭐, 아직까진 큰 불만은 없다. 그러나 자금만 되면 AMD의 RyZEN으로 갈 것이다. Intel에 대한 내 인식은 그리 좋지는 않다. AMD에는 없냐면 그건 아니지만 뭐, 솔직히 불도저~카베리 CPU를 써본 적은 없으니 이쪽도 뭐 아직 판타지 안에 있는 거고.

ATi Radeon HD 5670은 3년 가까이 쓰고 AMD Radeon HD 7770으로 갈아탔는데, 왜 AMD Radeon R7 250X로 안 가고 굳이 HD 7770으로 갔냐면 똑같은 애인데 초기 거품가 때문에 가격차이가 상당했어서. 어차피 똑같은 애인데 더 싼걸로 사지 뭐 ㅇㅅaㅇ 해서 이걸로 구매. HD 5670에서 1080p 해상도 60프레임 못 뽑던 게임들이 뽑아져서 너무 기분이 좋았다. 그러나 반년 쓰고 지포스 익스피리언스의 쉐도우플레이가 너무 써보고 싶어서 맥스웰 2세대로 가기 위해서 알아보던 중 GTX 960이 나올 때까지 꽤 오래 걸릴거라는 말에 무리해서 GTX 970으로 구매.

문제는 GTX 970에는 3.5GB + 0.5GB VRAM 문제가 있었다. Call of Duty: Advanced Warfare에서 일부 옵션이 VRAM 점유를 3.5GB 이상 사용하기 때문에 그 순간부터 20FPS까지 떨어지는 현상 때문에 최적 옵션 찾는데 너무 시간을 뺏겼다. 거기에 드라이버 버그들 때문에 시간 날려먹은 것도 한 두 개가 아니고. 때문에 기회가 되면 AMD로 다시 돌아가려고 했는데 내가 원하는 제품군은 파워 요구량이 크고 타협해서 좀 낮은 애를 사려고 하면 리마크 제품이고… 작년 중순에 RX 480으로 가려고 했는데 생각보다 성능이 GTX 970하고 큰 차이가 없는 것 같길래 포기하고 그 돈으로 사운드카드를 구매했더니 드라이버 최적화로 연말에 GTX 1060급 성능으로 업그레이드… 드라이버 단에서 DX 11 인자 체크도 제대로 안 해서 내 컴퓨터로는 동작하는 코드가 후배들 컴퓨터에서는 동작을 안 함. 거기에 맥스웰 2세대는 DirectX 12 지원 예정 GPU였기 때문에 마음놓고 구매했었는데 막상 뚜껑을 열어보니 딱 지원만 하고 성능은 최소 프레임도 평균 프레임도 최대 프레임도 DX 11이랑 별 다를것도 없었다.

정리하자면 Intel과 NVIDIA는 내 안에서 좋은 이미지의 기업은 아니다. 빨리 Intel이랑 NVIDIA에서 벗어나고 싶음. 근데 각각의 경쟁사인 AMD는 CPU랑 GPU 각각의 사업에서 죽을 쑤고 있고, 올해는 거기서 좀 벗어났으면 하는 마음이 있다.

미분류

C++에서 Lambda Expression의 Capture를 받을 수 있는 함수포인터 사용하기

C++의 기존 방식의 함수포인터로는 람다 표현식의 Capture를 받을 수 없다. Capture란 람다 표현식을 정의한 함수의 변수 등을 사용할 수 있게 해주는 장치이다.

아래와 같은 식은 C++ 컴파일러에서 오류를 일으킨다.

typedef void ( *EXAMPLE ) ();
int main ( void )
{
	int a = 10, b = 20;
	EXAMPLE example = [ & ] () { printf ( "a = %d, b = %d\n", a, b ); };
	example ();

	return 0;
}

이 코드를 컴파일하면 아래와 같은 오류가 발생한다.

C2440 ‘초기화 중’: ‘main::’에서 ‘EXAMPLE'(으)로 변환할 수 없습니다.

이 오류를 해결할 수 있는 방법은 두 가지가 있다. 다만 한 방법은 함수의 매개변수로 넘길 수 있는 함수포인터 데이터 타입을 구성할 수 없다.

1. auto 타입 사용하기

C++ 11에서 추가된 auto 자료형을 사용하면 람다 표현식에 Capture를 넘길 수 있다.

int main ( void )
{
	int a = 10, b = 20;
	auto example = [ & ] () { printf ( "a = %d, b = %d\n", a, b ); };
	example ();

	return 0;
}

이 방법을 사용하면 사용할 함수의 함수포인터 데이터 타입을 정의할 수 없어서 함수의 매개변수에서는 람다 표현식을 받을 수 없다는 단점이 있다.

2. std::function 템플릿 사용하기

마찬가지로 C++ 11에서 추가된 STL인 std::function 템플릿 클래스를 사용하면 람다 표현식에 Capture를 넘길 수 있다. std::function 템플릿 클래스는 functional 헤더파일에 있다.

#include <functional>
typedef std::function EXAMPLE;
int main ( void )
{
	int a = 10, b = 20;
	EXAMPLE example = [ & ] () { printf ( "a = %d, b = %d\n", a, b ); };
	example ();

	return 0;
}
미분류

NVIDIA 드라이버 똑바로 좀 만들어라

올해 초부터 중순까지 동아리 후배들에게 DirectX를 알려줬다. 물론 알려주기 위해 자료를 만들어야 하므로 예제들을 만들었는데, 내 컴퓨터에서 잘 동작하던 코드들이 후배들 컴퓨터에서 오작동 하는 경우가 발생했었다.

결론적으로 말하면 MSDN을 꼼꼼히 보지 않았던 내가 인자를 실수해서 넣었던 것인데, 문제는 AMD와 Intel의 드라이버들에서는 인자 실수 시 반환하는 E_INVALIDARG를 NVIDIA에서는 반환하지 않고 S_OK를 반환해서 일단 내 컴퓨터에서 동작은 했던 것. 이거 때문에 꽤 많이 작성했던 예제들을 전부 고쳤었다. 3주치 자료를 한꺼번에 만들었었는데 해당 코드를 복붙해서 넣었던 부분이 많아서…

물론 이것만 문제가 있는 것은 아니다. Windows 8 사용할 때 재밌게 잘 플레이했던 Far Cry 3를 올해 친구가 같이 멀티하자고 해서 오랜만에 설치해서 실행했더니 NVIDIA 구성요소 DLL 하나가 자꾸 에러를 발생시켜서 실행이 안 됐다. 지금은 고쳐졌는지 모르겠지만 아마도 안 고쳐졌을 확률이…

거기에 재작년 말에 Call of Duty: Ghost도 갑자기 밝아지는 곳에서 그래픽 오류로 뻗어버리는 경우가 발생했었다. 이 게임 자체에 버그가 넘쳐나기 때문에 게임 오류일 확률이 있으나 내가 보기엔 GTX 970의 잘못된 메모리에 접근해서 발생하는 오류가 아니었나 싶다. GTX 970 3.5GB + 0.5GB 사건 터지고 수정된지 얼마 안 된 드라이버였고, 당시 내 주위에 GTX 970을 사용하던 사람은 없었어서 아무도 이 에러가 없었던 걸 봐선.

GeForce Experience의 ShadowPlay에도 문제가 있어서 녹화 중에 일정 확률로 소리가 녹화가 안 되는 경우가 발생하기도 했다. GeForce Experience 3.0으로 업그레이드 되고 이름이 Share로 바뀐 요즘엔 못 본 현상이니 해결됐을 수도 있지만…

가장 큰 문제는 아마도 치팅 드라이버 아닐까. NVIDIA와 AMD 두 가지 그래픽카드에서 구동한 게임의 그래픽 품질이 꽤 차이가 나는 경우가 몇 가지 게임에서 종종 보이던데. 최근 나온 게임 중에는 마피아 3에서 그런 논란이 있던데 논란 종결 됐나?

뭐, 그렇다고 Intel이랑 AMD가 드라이버 잘 만드는 것은 아니지만 적어도 WHQL 인증 받을 거면 기본적인 DirectX API 정상 동작은 보장해줬으면 좋겠다.

미분류, 게임 리뷰

[리뷰] Minecraft

Minecraft(이하 마인크래프트)는 2011년에 친구가 추천하여 시작했던 게임이다. 당시엔 베타 버전이라는 이유로 지금보다 게임 가격도 저렴해서 쉽게 시작할 수 있었다.

minecraft-hero-df1112867f04

처음엔 이 괴상한 그래픽의 게임은 뭘까 했었다. 조합법도 따로 알려주는 것은 아니라서 인터넷에서 찾아봐야 한다는 점이 익숙하질 않았다.

그러나 예전에 레고 블럭 가지고 놀던 느낌으로 점점 빠져들게 됐는데, 친구가 자기 PC로 잠깐씩 여는 서버로는 만족할 수 없어서 이후 내 개인 서버에 직접 마인크래프트 서버를 개설하여 친구들을 초대해 같이 놀았다.

혼자 해서는 별 재미가 없다. 처음 시작했을 때는 뭔가를 만들어가고 생존하는 재미로 플레이할 수 있지만 자기 만족으로 게임을 즐기기엔 한계가 있는 것이 바로 샌드박스 게임이기 때문에 친구랑 같이 플레이하지 않는다면 쉽게 질릴 수 있는 게임이다.

PC판 기준으로 Java 언어로 구현된 게임이라 Windows, OS X, Linux 모두에서 즐길 수 있는데, Java 런타임 자체가 느린데다 메모리가 부족하면 이따금 가비지 컬렉션을 수행하므로 잠깐씩 끊기는 느낌이 있다. 거기에 OpenGL로 구현되어 살짝 느리기도 하다. 최적화를 어느 정도 수행했다고는 해도 몇 십만개의 블록을 실시간으로 컬링 하고 렌더링을 수행해야 하는 만큼 굳이 Java로 구현해야 했나 싶을 정도.

거의 4년 가까이 주기적으로 플레이를 했었지만 결국 내 서버가 망가지면서 서버를 접고, 그러면서 마인크래프트도 접었다. 최근에 생각나서 잠깐 켜봤으나 역시 여러 명이서 즐기는 멀티플레이를 하질 않으니 별 재미가 없어서 껐고.

어쨌든 기본적으로 재미가 있는 게임이긴 하다. 그 재미의 기본적인 토대는 레고 블럭처럼 내가 만들고 싶은 것들을 내 마음대로 만들 수 있다는 점이지만 그 외에도 농사, 탐험도 재미 요소 중 하나이다. 혹시 아직도 한 번도 안 해봤다면 해보는 것도 나쁘지 않다. 다만 3D 멀미가 다른 3D 게임에 비해 심한 편이기 때문에 그 점은 감수해야 하지만.

미분류

CJ대한통운 망했으면

알라딘이 택배사를 바꾼지 1년이 다 돼간다. 작년까지는 당일 배송을 받아볼 수 있었는데 택배사가 현대택배에서 CJ대한통운으로 바뀐 뒤로는 한 번도 당일 배송을 받아본 적이 없다. 배송 시간도 현대 택배에서 배송해줄땐 4시를 넘질 않았는데 CJ대한통운으로 바뀐 후로는 6시 배송은 기본, 늦으면 10시 다 돼가는 시간에 올 때도 있다.

대전 지역에서도 거주지가 많은 지역을 배달기사 한 분이 처리하면서 발생하는 문제인 것 같은데 그렇게 어떻게든 인건비 깎아먹어가면서 계약 비용을 깎았으니 많이들 쓰는 거겠지. 하지만 인건비는 곧 사람이 얼마나 사람답게 살 수 있냐와 직결되는 문제인 만큼 늦어도 8시 전에는 퇴근이 가능한 구조를 만들어줘야 하는데  CJ대한통운은 물론이고 일부 택배사들은 이걸 제대로 처리를 안 함.

가급적이면 통신판매, 인터넷쇼핑몰 등 택배 이용해서 물건 배송하는 곳들 택배사로 CJ대한통운 안 썼으면 좋겠다.

 

+ 오전 11시 54분에 가져가놓고 다음날 새벽 1시 7분에 확인해도 일 안 하는 CJ대한통운

a

미분류

FPS 끊어쏘기 연습 프로그램 구상

오버워치의 영웅 중 하나인 솔저: 76은 집탄율이 낮아 그냥 마우스를 누르고만 있으면 탄환이 대부분 빗나가는 형태이다. 이는 다른 게임에서도 자동소총 등을 사용하는 경우 발생하는 문제.

내 기준으로 이걸 오버워치 내에서 봇 및 사람들을 대상으로 연습한다고 해서 쉽게 연습이 되진 않았다. 일단 내가 끊어 쏜 방식이 제대로 명중률이 높게 들어가는지 안 들어가는지 알 방법이 없고, 짧은 시간 안에 얼마나 많은 탄환이 적에게 맞았는지 확인하기 정말 어렵기 때문.

그렇다면 뭐, 한번 만들어보면 어떨까 싶어서 구상만 해본다. 언제 만들지는…

다른 FPS 게임 연습에도 사용할 수 있으려면 어느정도 설정의 자유도가 있어야 한다고 생각.

  1. 마우스 감도 및 시야각.
  2. 연습 대상의 개수 및 무적 여부, 움직임 여부, 움직이는 형태(좌우, 앞뒤좌우, 비행 좌우).
  3. 무기의 종류(자동소총, 리볼버, 저격총), 한 탄창 내 탄환 수, 장전 시간, 발사 지연 시간, 연속 발사 중인 시간에 따른 집탄률 변화.

그리고 확실히 연습에는 언제나 숫자놀이가 필수…

  1. 명중률 표시
  2. 1초 당 각 연습 대상에게 맞은 탄환 수 표시

마우스 감도에 따라 카메라 시점 이동을 다른 게임들과 비슷하게 하려면 그냥 윈도우 API 등을 사용하지 말고 저수준 API를 가져다 사용해야 할 것 같고, 비행하는 연습 대상의 경우에는 솔저: 76으로 파라나 파라 따라다니는 메르시 잡기 너무 어려워서 그거 연습할 수 있을까 하고…

언제쯤 만들지는 잘 모르겠다. 솔직히 너무 귀찮음…