Android on everything: Smooth development of cross-platform native android games
Room 2014, West Hall
Speaker : Orion Granatir in Intel, Ian Lewis in Google
일단 연사가 인텔과 구글 안드로이드 쪽에서 한 명씩 나왔다는 것이 매우 흥미로운 강연이었습니다. (물론 ARM이 아니라 구글이긴 하지만) 이 둘이 x86과 ARM의 각 아키텍쳐의 차이점에 대해서 번갈아가며 설명하고 ARM에서 동작하는 앱을 x86에서 동작하도록 수정할 때 어떤 차이에 주의해야 하는지에 대해서 알려주는 강의였습니다.
모처럼만에 코딩 관련 강연이어서 일단은 재밌었습니다. 맨날 뜬구름잡는 BM강연, 마케팅강연, IAP강연, 컨셉디자인 강연들만 나오다가 코딩 이야기가 나오니 그냥 이유없이 반갑더군요. 하지만 내용이 크게 도움이 되지는 않았습니다.
매우 실무적인 이야기들을 중심으로 했는데요, x86 아키텍쳐(아톰)기반의 앱을 만들때 주의해야 할 점과 예제들의 대부분은 인텔사이트에서 구할 수 있기 때문에 짧은 GDC강연에 적합하지 않았던 것 같고, 그 중에 에센셜한 몇 개의 토픽만을 다루었습니다.
그 중 하나로 Memory model 차이점에 대해서 설명했습니다. Byte alignment가 약간 다르고, 또 거기에 Power management 기술이 달라서 x86에서는 읽기 쓰기가 모두 Program order로 동작하지만 ARM은 읽기 쓰기 모두 그 동작의 순서를 보장하지 않는다고 했습니다. 이건 평소에는 크게 관련이 없지만 쓰레드를 사용할 땐 문제가 생깁니다.
한쪽 쓰레드에서는
memcpy;
done = true;
다른 한쪽 쓰레드에서는
if(done)
access memory;
하게 되면, 저 memcpy랑 done이 순서대로 처리되지 않아 동작을 보증하지 않습니다. ARM에서 말이죠. 그렇기 때문에 __sync_synchronize() 라는 함수를 사용해서 동기화를 해주어야 합니다. 자세한건 구글링하면 자료가 아마 있을 겁니다.
그 다음으로 NEON과 SSE 가속의 차이점에 대해서 다루었습니다. 일단 제일 큰 차이점은 역시 인텔진영 베이스의 강연이라 그런지 몰라도, NEON은 단지 옵션이라 많은 CPU에서 동작하지 않는데, SSE는 모든 아톰 CPU에서 지원한다.. 뭐 그런 자랑아닌 자랑질을 했습니다. :-)
그리고 다음으로 컴파일러 옵션을 잘 사용해야 하며, 이걸로 큰 퍼포먼스 차이를 만들수 있다고 인텔쪽에서 이야기했는데, 여기에 덧붙여, 구글쪽에서 그 어려운 걸 NDK가 알아서 대부분 다 해준다고 역 자랑질을 했습니다.
이 중에서 재밌는 옵션으로
-ffast-math 옵션은 대부분 게임에서 좋은 퍼포먼스를 만든다고 했고,
아래의 컴파일러 옵션들에 대해서도 주의를 주었습니다.
-fomit-frame-pointer
-fstrict-aliasing
-funswitch-loops
-finline-limit=300
-ffuncion-sections
-funwind-tables
-fstack-protector
그 밖에 링크 타임의 문제에 대해서도 다루었는데요, rand() 는 ARM쪽에서 링크타임에 미스매칭이 일어난다고 합니다. 이런 함수는 Inline으로 처리하는 것이 좋다는 팁을 주었습니다. 그 밖의 다른 대부분의 링크 문제는 최신의 NDK에서 해결되어 있다고(정말?) 하며 항상 최신의 NDK를 사용하라고 권고했습니다.
NDK로 컴파일을 하면 자동으로 x86과 ARM용 라이브러리가 생성되니 apk로 팩을 하기 전에 이 라이브러리를 잘 사용하면 양쪽 CPU에 네이티브로 대응할 때 재 컴파일하는 수고를 덜 수 있습니다. (실제로 NDK로 빌드해보면 x86 폴더가 생기더군요. 전 왜 생기나 했었습니다.)
인텔은
Intel graphics performance analyzer
라는 좋은 툴이 있는데 한번 사용해보라고 조언했습니다. 부스에서 시연도 하고 있다고…
강연을 들은 후의 느낌은 인텔쪽에서 ARM쪽으로 넘어가는 대세를 어떻게든 막아보려 애쓰고 있다는 느낌이었고, 예전에 AMD와 싸울때 했던, 우리가 표준이라는 강성을 어느정도 꺾고 ARM과 사이좋게 호환하려는 모습이 눈에 띄었습니다. 모바일쪽에서 ARM이 너무 강한 힘을 쓰고 있기 때문에 앞으로 인텔의 전략이 어떻게 시장에서 효과를 보일지 궁금해집니다.
by Kay Park