블로그에 포스팅할려고 번역 했어요. 블로그에는 http://www.androidpub.com/1878598 랑 같이 포스팅해야 겠다 싶어서 제 블로그에 올리기 전에 안펍에 먼저 나눠드려요. ^^
중간 중간 틀린 부분이나, 지나치게 의역된 부분이 있을 수 있습니다. 하지만 본문에서 글쓴이가 말하고자 하는 내용에 충실하게, 충분히 전달하려고 노력하였습니다. ^^ 번역을 보지 마시고, 원래 글쓴이(Dianne)의 의도를 보세요.
즐겨주세요.
---- ---- ---- ----
Dianne Hackborn - 오후 4:21에 수정 - 공개
안드로이드 그래픽에 대한 진짜 진실에 관심 있으신가요?
안드로이드에서 그래픽이 어떻게 렌더링 되는 가에 대해 많은 곳에서 잘못된 정보들을 반복해서 포스팅하는걸 보고 있는게 슬슬 짜증이 밀려 오네요. 여기서 진실 몇 개를 말해 볼께요:
• 안드로이드는 항상 어느 정도는 하드웨어 가속을 사용해왔어요. 화면에 디스플레이되는 모든 윈도우의 내용들은 버전 1.0에서부터 쭉 하드웨어를 사용해 왔죠.
• 이 말은 여러분들이 보는 많은 애니메이션들이 언제나 하드웨어 가속을 사용해 왔다는 거에요. 눈에 보이는 메뉴들이나, 슬라이딩 되는 알림정보(notification), 액티비티들 간 변화할 때, 팝업이나 다이얼로그가 보이거나 숨겨질 때 등에 사용되요.
• 역사적으로 안드로이드는 각 윈도우에서 컨텐츠를 렌더링할 때 소프트웨어를 이용해 왔어요. 예를 들면, http://www.simplemobilereview.com/wp-content/uploads/2010/12/2-home-menu.png에 있는 UI의 경우, 상태창(status bar), 바탕 배경(wallpater), 배경 위에 런쳐, 메뉴라는 네 개의 윈도우가 존재하지요. 만약 메뉴 아이템에 선택 표시(highlight)를 한다던가 하는 식으로 어떤 윈도우의 내용이 업데이트되면, (3.0 이전에는) 해당 윈도우에 업데이트된 내용을 그릴 때 소프트웨어를 사용해요. 그렇지만 다른 윈도우들은 다시 그려질 필요가 전혀 없기 때문에, 다른 윈도우들의 내용들은 하드웨어단에서 처리하게 되요. 마찬가지로, 윈도우 상에 어떤 움직임이 생성되는 경우, 예를 들어 메뉴가 올라오던가 내려가는 경우에는 모두 하드웨어 렌더링을 사용해요.
• 윈도우 내에 그려지는 것을 살펴보시죠. 완전한 60fps의 렌더링을 사용하려 한다고 해서 꼭 하드웨어를 사용할 필요는 없답니다. 렌더링 속도는 사용하시는 디스플레이 내의 픽셀의 개수와 CPU 속도에 영향을 많이 받으니까요. 예를 들면, NexusS에서는 여러분들이 안드로이드 UI에서 보는 보통의 요소들, 800x480 크기의 화면에서 리스트를 스크롤링한다던가 하는 부분들을 60fps로 렌더링하는데 문제가 없어요. 하지만 오리지날 Droid에서는 비슷한 화면 크기를 가지고 있지만 조금 밀리는 느낌이 들지요.
• 윈도우 내에서 완전히 하드웨어 가속"만"을 이용한 그리기는 안드로이드 3.0에서 추가된 부분이에요. 안드로이드 4.0에서 구현된 부분은 3.0과는 달리 더 이상 하드웨어 가속만을 사용하지 않는답니다. 만약 여러분이 개발하시는 앱에 하드웨어 가속을 이용할 수 있도록 플래그를 선언해 두셨으면, 3.0에서부터는 해당 앱의 모든 윈도우는 GPU를 이용해서 그려질 거에요. 이런 점에서 안드로이드 4.0의 주요 변경 부분은 이렇습니다. 이제 4.0 이상이라고 명시된 앱에서는 manifesto에 android:handwareAccelerated="true"라고 선언하지 않아도 하드웨어 가속이 기본으로 활성화됩니다. (추가적으로, 기존에 존재하던 앱들에서 이 부분이 그냥 활성화되지 않는 이유는 특정 종류의 그리기 명령(drawing operation)이 특정 하드웨어에서 제대로 지원되지 않을 수 있기 때문이며, 이런 부분은 앱들이 자신의 UI 상태를 변경하기 위해 물어보는 행동에 영향을 줄 수도 있기 때문이에요. 기존 앱들에 강제로 하드웨어 가속을 이용한 그리기를 실행할 경우 많은 경우에 때로는 미묘하게, 때로는 눈에 보이게 그래픽이 깨지게 될거랍니다.)
• 하드웨어 가속을 이용한 그리기에 장점만 존재하는 것은 물론 아니에요. NexusS나 Galaxy Nexus에 탑재된 PVR(주: PowerVR사) 드라이버의 예를 들면, OpenGL 프로세스를 이용하기 시작했는데, 이 프로세스는 약 8메가 정도나 되는 메모리를 먹어치우고 있거든요. 프로세스의 오버헤드(process overhead)가 약 2메가 밖에 안된다는 것을 감안하면, 8메가는 굉장히 많이 잡고 있는 거죠. 메모리를 점유하고 있다는 것, 예를 들면 많은 수의 백그라운드 프로세스가 계속 실행되고 있는 경우가 있을텐데, 이런 경우 앱을 전환하거나 하는 행동을 할 때 잠재적으로 느려질 수 있다는 의미니까요.
• OpenGL의 오버헤드(overhead) 때문에 누군가는 이에 대한 사용을 원하지 않할 수도 있어요. 우리가 NexusS에서 안드로이드 4.0이 잘 작동하도록 하기 위해 하는 일 중 하나를 예를 들면, 시스템 프로세스에서 8메가의 메모리를 잃지 않도록 하기 위해 하드웨어 가속을 끄는 기능도 UI의 일부로 포함하고 있어요. 또 다른 8메가는 전화 프로세스, 또 다른 8메가는 시스템 UI 프로세스 등이라서요. 확신하는데 여러분은 모르셨을 거에요. 여기저기 예쁜 애니메이션이나 상태창(status bar) 따위를 그리기 위해 OpenGL을 사용하는건 기계에는 아무런 이익이 되지 않는답니다.
• 하드웨어 가속 그리기는 매끈한 UI를 그리기 위한 요술 방망이가 아니에요. 이것을 달성하기 위해 다양한 노력이 있어 왔죠. 1.6에서 포어그라운드(foreground)와 백그라운드(background) 스레드에 대한 스케줄링(scheduling) 향상이 있었구요, 2.3에서는 입력 시스템, 스트릭트 모드(strict mode), 동시 가비지 콜렉션(concurrent garbage collection), 로더(loader) 등을 다시 작성했어요. 여러분이 60fps를 달성하고 싶으시면 각 프레임을 20 milliseconds로 처리하셔야 해요. 이건 긴 시간이 아니잖아요. 실행하고 있는 스레드에서 플래시 저장소 시스템에 저장하겠다고 터치하는 것만으로도, UI는 그 짧은 타이밍에서 벗어나게 만들 지연(delay)이 발생하는 경우도 있어요. 특히 저장소에 저장하는 경우에 그렇죠.
• 부드러운 UI에 영향을 준 흥미로운 일들 중 최근의 예들을 살펴 볼께요. NexusS에 올린 ICS에서 리스트들을 스크롤링 할 때보면 사실 GingerBread때보다 덜 부드럽다는걸 알게 되실거에요. 그 이유는 미묘한 타이밍 변화에 의한 것임이 밝혀졌는데, ICS에서는 터치 이벤트를 받은 후 스크린에 그릴때, 그 준비가 되기 약간 전에 다음 이벤트(손가락의 위치를 따라가는 것)로 옮겨 가게 된다고 하네요. 그래서 가끔 ICS에서는 터치 이벤트를 받아 스크린에 그릴 때 화면에 60fps로 그리더라도 손가락을 따라가는 동안 가시적으로 프레임이 놓치는 것처럼 보이는 거에요.
• 사람들이 예전부터 안드로이드와 iOS의 웹브라우저를 비교하는데, 비교 시 발견되는 다른 점들의 대부분은 하드웨어 가속 때문이 아니랍니다. 원래부터 안드로이드는 웹페이지 렌더링 부분에 대해서는 안드로이드만의 절충안을 만들어 다른 방향으로 가고 있었어요. 예를 들면, 웹페이지는 타일(tile)을 사용 하는 대신 지속적으로 화면에 렌더링되도록 디스플레이 리스트(display list)에 보여져요. 각기 그려져야 하는 타일(tile) 단위의 조각들이 아니기 때문에 스크롤을 할 때나 줌을 할 때 이점을 주었죠. 나쁜 점은 웹페이지의 그래픽들은 그리기에 더 복잡해져서 프레임 주기(frame rate)가 떨어진다는 점이에요. 현재 안드로이드 3.0의 웹브라우저에서는 타일(tile) 렌더링을 사용해요. 그래서 여러분들이 스크롤이나 줌을 할 때 생성되는 타일들에서, 표현 되어 보여져야 하지만 빠르게 렌더링 되지 못할 때 발생하는 제대로 보이지 않는 요소들을 표현할 때도 일관된 프레임 주기로 관리할 수 있게 해준답니다. 타일들 자체는 소프트웨어에서 렌더링 되고요, 제 생각에는 iOS에서도 비슷할 거라 생각되네요. (그리고 이 타일 기반의 접근 방식은 하드웨어 가속 그리기가 지원되지 않아도 3.0 이전에서 사용될 수 있어요. 이미 언급했다시피 NexusS는 CPU만으로 윈도우에서 타일을 60fps로 쉽게 그릴 수 있으니까요.)
• 하드웨어 가속은 그리기 성능을 마법처럼 말끔히 해소해 주지는 않아요. GPU 성능 만큼의 한게가 존재하거든요. 최근의 흥미로운 예는 테그라2(Tegra 2)에서 빌드된 타블렛의 경우 인데요, 테그라2의 GPU는 1024x800 화면상 모든 픽셀의 2.5배 가량을 60fps로 그려낼 수 있어요. 앱 목록을 변경할 수 있는 안드로이드 3.0 타블렛의 홈 스크린을 한 번 생각해 보시면 쉬워요. 이 경우 배경은 (모든 픽셀에 대해 1x로) 그려져야 하고요, 그리고 나서 바로가기(shortcut) 레이어와 위젯들을 (확실치 않지만 그냥 기분 좋게 모든 픽셀에 대해 5x라고 치고) 그린 후, 모든 앱들의 검은 배경을 (모든 픽셀에 대해 1x로) 그리고나서 앱들의 아이콘과 이름들을 (모든 픽셀에 대해 5x로) 그려야 하죠. 자, 이미 예측된 픽셀 수는 날아가 버린 듯 하네요. 아직 별개의 윈도우들에 있는 내용들을 한 번에 표현하기 위한 통합 그리기 과정을 진행조차 하지도 않았는데 말이에요. 이런 상황에 60fps 애니메이션을 만들어 내기 위해 안드로이드 3.0 이상에서는 몇 가지 트릭(trick)을 사용해요. 제일 중요한 것 중 하나는 오버레이(overlay)상에 있는 모든 윈도우를 GPU를 이용해서 프레임버퍼에 복사하는 것이 아니라, 그냥 오버레이 상에 두려고 한다는 점이에요. 지금 말하는 이 경우에는 이미 픽셀 수는 예상보다 초과되었지만, 또 다른 트릭(trick)을 사용할 수 있어요. 왜냐하면 안드로이드의 바탕화면은 다른 윈도우에 있는 데다가 비트맵 전체 정보를 갖고 있는 실제 화면보다 이 윈도우를 더 크게 만들 수 있으니까요. 자 이제, 스크롤을 하시면 배경의 움직임은 전혀 그릴 필요가 없고 그냥 윈도우만 움직일 뿐이게 되요. 왜그렇게 되냐하면 이 윈도우는 오버레이(overlay) 상에 있기 때문에, 이 부분은 GPU를 이용해서 화면에 표현하려고 다른 요소들과 통합시켜 그릴 필요조차 없게 되요.
• 기기의 화면 해상도가 올라갈 수록 UI를 60fps로 그려내는 것은 GPU의 속도, 특히 GPU의 메모리 버스의 옹량(memory bus bandwidth)과 관련이 있다고 보시면 되요. 실제로 여러분들이 어떤 하드웨어에 대한 성능 값을 얻기를 원하실 때는 항상 메모리 버스의 용량에 주의를 기울이셔야 하구요. (특히나 경이로운 NEON 인스트럭션을 사용하는 경우의) CPU는 늘상 메모리 보다 더 훨씬 더 빠르게 작동할 수 있으니까요.
출처: https://plus.google.com/105051985738280261832/posts/2FXDCz8x93s#105051985738280261832/posts/2FXDCz8x93s
수고하셨습니다...만 이미 몇일전에 꽤 잘 번역된 글이 나왔습니다. http://dalinaum-kr.tumblr.com/post/13724432784/how-about-some-android-graphics-true-facts
여튼 감사합니다.^^;;
Android는 graphic h/w를 최대한 직접 access할 수 있는 interface를 제공해야합니다.
permission 제한이 너무 심하다는..
좋은 글 번역해주시느라 수고하셨습니다~
글쓴이님과 재구님이 링크걸어주신 글 다 보았는데요 사실 번역은 아랫글에 링크달아주신
http://eggy.egloos.com/3776976
이분이 잘 해주시긴 했네요.^^;
그래도 번역해주시는 분들 정말 감사합니다!
자꾸 렌더링에 집착들 하시는데 문제의 핵심은 커널에 있습니다.
역으로 아이폰이 왜이리 밥은 적게 먹으면서 빠릿할수밖에 없는가를 생각해 보면...
그 비결인 즉 바로 멀티테스킹을 제대로 통제함에 달려있음을 알수 있습니다.
참고로 제책상 위에는 프로그램이 100개정도 설치된 아이폰4가 있습니다.
만땅 충전상태에서 모두 한번씩 실행하고 홈키만을 눌러두고 방치하면 배터리가 무려 1주일이 가더군요.
물론 중간에 한번씩 실행해보지만 항상 빠릿함을 유지하는데 물론 안드로이드 같으면 상상도 못할일 이겠죠.
통상 이틀이면 이미 꺼져있으니까요.
모바일은 원자력 배터리가 나오지 않는한 항상 배터리에 발목잡혀 무분별한 멀티테스킹은
짧은 충전수명과 뒤처진 실행성능은 절대피할수 없습니다.
한편 구글과 RIM의 엔지니어는 강력한 멀티테스킹이 아이폰과 대비되는 막강한 기술이라 말하는걸 흔히 접할수 있는데
참으로 어처구니없는 오판이라 아닐할수 없습니다.
애드워즈 텔러 // 아이디가 외국 개발자 같아요 ^^ ㅎㅎ
제가 커널 엔지니어링 쪽은 지식이 얕아서 토론은 안될 거 같긴한데요 ^^
그런데 지적하신 커널단의 문제점은 "오픈 플랫폼" 이라는 성격을 가진 안드로이드로서는 완벽하게 통제가 힘든 부분이 아닐까요? 때로는 하드웨어를 직접적으로 제어 해 줘야 할 것 같은데, 그런 경우에 발생하는 trade off 들이나 exception 상황들을 "오픈" 성격을 가진 안드로이드로 모두 처리하면, 너무 복잡해 지지 않을까 싶어서요.
하드웨어 성능이 올라가는 것을 기다리는 게 답일까요?
정답이 아니어도 좋으니 애드워즈 텔러님이 생각하시는 해결책? 혹은 의견을 부탁드려볼께요. ^^
네 해답은 결코 멀리있지 않습니다.
선점형 멀티태스킹만 버리면 되는것이죠.즉 과거의 커널로 돌아가면됨.
이로인해 안드로이드는 공장출하시 이미 기본적으로 수많은 서비수가 가동중에 있습니다.
이것이 근본적으로 IOS와 다른점이죠.
여러 서비스는 각각이 프로세스인데 문제는 이들이 스위칭하는데 엄청난 로스가 따르는데,
CPU안의 거의모든 레지스트리와 플래그를 스택에 대피시켜 둬야하기 때문입니다.
폰 노이먼 구조에서 스레드 다중화 기법이 아닌한 한번에 하나 이상의 프로세스는 절대 처리될수 없습니다.
이것은 SMP 쿼드코어라도 동시처리는 단 하나 입니다.
그럼에도 듀얼이 싱글보다 빠른 이유는 태스크스위칭 빈도가 반으로 줄어 로스도 반으로 줄기 때문이죠.
그렇다고 다중처리를 위해 MPP를 써야할까요? 그려면 수퍼컴이 되겠죠.
물론 100년후면 가능할수도 ....
그러나 키는 구글이 쥐고 있으니 절이 싫으면 중이 떠나야지 절이 이사하라 할수는 없겠죠.
그래도 구글이 좋습니다.
안드로이드도 렌더링쪽은 많이 발전해서 IOS와 별반 차이가 없는것으로 알고있습니다.
렌더링쪽으로 가장 낙후된 쪽은 오히려 리눅스와 MS윈도 입니다.
다만 고해상도로 발전하면서 더이상 해상도를 통일하는건 불가능한듯 한데
유저나 개발자가 모두에게 단일OS로 다양한 해상도를 무리없이 동시지원될수 있는지가 관건이겠죠.
구글이 렌더링에 역점을 두는것도 이때문이며 그결과 ICS가 허니컴과 달리 다양한 해상도 지원에 성공한것 아닐까요?
비선점형 멀티태스킹으로 가는 것은 방법이 아닙니다. 비선점형 멀티태스킹은 커널 자체의 안정성의 문제가 있습니다. 하나의 애플리케이션이 멈추어 버리면 운영체제 전체가 멈추기 때문입니다. iOS나 안드로이드와 같이 써드 파티 앱이 많은 환경에서 비선점형 멀티태스킹을 하는 것은 재앙을 부르는 길입니다.
또 비선점형 멀티태스킹은 프로세스 스케쥴링의 주체가 커널이 아닌 애플리케이션에게 주는 것인데 결국 스케쥴링이 발생할 때는 운영체제가 문맥 전환(context switching)을 해야 합니다. CPU의 레지스터들을 스택에 옮기는 일은 선점형 / 비선점형 상관없이 필수적인 부분이라 할 수 있습니다. 그리고 20여개의 레지스터를 백업하는 행동은 연속적인 레지스터의 백업이기 때문에 현재의 암 아키텍쳐에선 눈 깜박할 사이에 이루어지는 것입니다.
현재의 ARM 프로세스는 순수한 폰 노이만 아키텍쳐가 아니라 인스트럭션 캐쉬가 분리된 수정 하버드 아키텍쳐를 선택하고 있습니다. 아마 ia32-64와 같은 아키택쳐들도 수정 하버드 아키택쳐를 선택하고 있을 것입니다. L1캐쉬 수준에서 인스트럭션과 데이터 캐쉬가 다른 코어와 분리되어 있기 때문에 병렬처리가 가능합니다. 문제가 발생할 때는 SMP의 여러 코어들이 같은 캐쉬라인에 대한 접근을 하고 있어 캐쉬 접근에 interlock이 걸리는 경우입니다.
그리고 UP(단일 프로세서)인 경우에도 한 시점에 여러 스레드가 수행될 수 있는데 이를 시간적 멀티스레딩(TM, Temporal Multithreading)이라고 합니다. 이 주제에 대해서는 제가 예전에 적었던 글 http://dalinaum-kr.tumblr.com/post/8008351179/chip-level-multithreading 를 참고하시면 될 것 같습니다.
과거의 대부분의 스케쥴러가 비선점형 스케쥴러였고 현재의 대부분의 스케쥴러는 선점형 스케줄러입니다. 선점형 스케줄러가 순전히 이전의 코드를 수행하기 의해 존재하는 것은 아닙니다. 스케쥴링이 없다면 커널을 비롯한 운영체제 자체가 수행이 될 수 없습니다. 윈도우 9X, ME와 클래식 Mac OS 시리즈가 악명높던 "비선점형 스케쥴러"를 가진 운영체제죠.
선점형 스케쥴링과 비선점형 스케줄링은 모두 커널에서 문맥 전환이 이루어집니다. 커널에 의해 강제로 시간에 의해 문맥 전환되는 것이 선점형이고 앱이 작업이 끝났다고 알려서 문맥 전환을 하는게 선점형 커널입니다. 비선점형은 안정성에 심각한 문제가 있습니다. 앱이 비정상적인 경우에 스케줄링이 불가능하고 운영체제의 다운이 되기 때문입니다. 카카오톡을 쓰다가 다운되었는데 안드로이드 폰이나 아이폰이 다운되었다고 생각해보세요. 이건 정말 웃긴 일이지요.
수정 하버드 아키텍쳐는 인스터럭션 캐쉬와 데이터 캐쉬가 분리되어 코어에 들어있는 경우를 의미합니다. 암 레퍼런스 메뉴얼과 브로셔암이 수정 하버드 아키텍쳐를 사용하고 있다고 적어둔 것을 볼 수 있습니다. IA32의 변형들의 메뉴얼을 본적이 없지만 I캐쉬와 D캐쉬가 분리되어 코어에 연결된다면 수정 하버드 아키텍쳐입니다. 수정 하버드 아키텍쳐는 별게 아닙니다.
그리고 SMP는 캐쉬에 false sharing이 발생하는 경우가 아니라면 언제나 다른 스레드를 동시에 수행합니다. flase sharing은 인접 메모리 공간을 두개 이상의 코어가 접근할 때 락이 걸리는 현상입니다. 인접 메모리에 대해 접근할 때 락이 생기는 이유는 캐쉬의 락이 인접 메모리를 묶어서 한번에 이루어지게 되어 다른 코어에서 메모리 접근이 불가능하기 때문입니다. 이 문제는 모든 연산이 "동시에" 수행되기 때문에 발생 합니다. 두개의 스레드에서 동시에 메모리 접근이 이루어지지 않았다면 이런 현상은 일어날 수 없는 것입니다. false sharing에 대해서는 http://rein.kr/blog/archives/906 여기 글을 보시면 참고가 될 것 같습니다.
MS문서에 의하면
윈도가 멀티테스킹을 지원하기 시작한 것은 Windows 3.1 부터며 선점형 스케줄링 도입은 Win95부터 입니다.
그러나 악명높은 플로피포맷 등의 작업시 끝날때까지 먹통이 되어 아무것도 할수없던 시대는 Win2000 이전까지 이어졌고 리눅스는 커널은 2.4까지가 비선점형 이지만 그런일이 없었습니다.
SMP에서 병렬처리는 한계가 있어 프로세스의 스레드 복제에 의한 다중화처리만 유효하며
즉 SMP에 의한 빠른 처리의 원리는 플래시겟의 원리와 같습니다.
두개 이상의 프로세스가 각각 다른코어의 ALU에서 처리됐다 칠때 복제된 동일 스레드건이 아닌한 OS가 결과물을 오류없이 수납하는건 사실상 불가능에 가깝습니다.
단 264 코덱이라든가 GPU의 그래픽 연산처리등 멀티미디어 쪽에서는 SMP라도 이와는 좀 다른것 같습니다.
GPU의 이야기를 왜 하시는지 모르겠습니다. SIMD와 같은 주제는 이 이야기와 상관이 없습니다. Flynn's taxonomy에서 전혀 다른 분류고 실제로 다르게 구현되어, 다르게 처리될 주제죠.
아까 말씀드렸지만 SMP는 false sharing이 아닌한 성능 저하 없이 동시에 별도의 스레드를 수행할 수 있습니다. 저는 false sharing이 되는 코드와 그렇지 않은 코드들을 여러 코드를 제공할 수 있습니다. 직접 만들어서 드릴 수도 있고요. 아래 민장님의 코드도 false sharing이 되는 코드인데 직접 수행해보시는 것을 추천드립니다.
http://minjang.egloos.com/1845004
그리고 리눅스를 사용하시면 안드로이드나 리눅스 커널을 빌드시키고 월타임과 CPU타임을 비교해보십시요. 쿼드 코어에서 연산시간이 월타임의 3배를 쉽게 넘어가는 것을 볼 수 있습니다.
만약에 여전히 SMP가 동시에 스레드들이 수행되는게 아니라고 생각하신다면요. 순차적으로 작동되는 과정에 false sharing이 특정 상황에서 발생할 수 있고 그 경우가 아닐 때 발생하지 않는지에 대해 어떤 설명을 해주실 수 있는지 듣고 싶네요.
PS: 윈도우즈 95가 선점형 커널인 것은 맞군요. (http://technet.microsoft.com/en-us/library/cc767883.aspx)
제가 이글을 읽으면서 느끼는점은...
안드로이드는 "성능을 최대한"사용하기는 하지만
그 성능 자체를 "자연스럽고 미려하게 보이는" 것을 최우선으로 하지 않는다는 점이네요...
아이폰은 "자연스럽고 미려하게 보이는"곳에 우선권이 있고 집중하고 있죠.
어차피 안드로이드는 전체적으로 컨셉이 "자연스럽고 미려하게 보이는"유형은 아닙니다.
버튼 하나 배경 이미지도 기본 이미지는 투박함에 가깝죠...
국내에서 안드로이드 보다 아이폰이 프로젝트가 좀 잘되거나 손쉬운 이유가...
보통 잘 알지 못하는 UX 담당자나 디자이너 혹은 프로젝트 매니저가
안드로이드에게 대체로 "자연스럽고 미려함"을 요구하고 있기 때문입니다.
아이폰은 있으면 있는대로 받아들여주는 경우가 대부분이고...
겉으로 보이는 기능상으로 아이폰쪽이 약간은 선도하고 있는점도 사실입니다.
대신에 그것을 희생해서 뭔가를 얻을수 있는게 안드로이드죠...
그게 일반 사용자나 (이분야에서 어느정도 전문지식을 갖추어야 하는) UX담당자, 디자이너, 프로젝트 매니저가
대부분 모르는게 잴 큰 문제라고 봅니다.
많은 부분을 개발자가 책임지는 개방성이 안드로이드의 특징이죠 ..
비지니스 로직 개발을 주로 담당하던 기존 자바 개발자들과 학생들이 다수 넘어왔고 (저를 포함해)
때문에 모바일이란 제한적 구동 환경에 대한 충분한 고려나 유연한 UI 처리 기술이 부족했던 것도 사실입니다 ..
하지만 바로 그 덕에 (낮은 진입장벽) 안드로이드 진영의 폭발적인 상승세도 가능했다고 봅니다
사실 구글은 애플과는 꽤 다른, 커뮤니티 친화적이고 투명한 방식으로 개발 가이드라인을 제시해왔습니다
구글의 안드로이드 개발자 그룹에서의 활발한 논의나 스타 개발자들의 블로그,
매년 개최되는 구글 IO 세션은 참고할만한 충분히 유용한 통찰들로 가득합니다
그리고 그것을 도입하느냐 마느냐 역시 '안드로이드' 개발자의 몫입니다
사실 ICS 에 와서야 안드로이드가 어느정도 모양새를 갖추게 되었단 인상을 받습니다
경력과 깊이있는 이해로 무장한 개발 고수들도 많아졌구요
하드웨어 제조사 역시 진정한 의미의 완성품을 내놓을 노하우를 축적했습니다
저는 이제부터 진짜 경쟁이 시작되었다고 생각듭니다 ..
애플은 그런 면에서 벌써 힘에 부치는 모습을 살짝 내비추지 않았던가요?
안드로이드 사용자들은 떠도는 가쉽을 클릭하며 일년씩 기다릴 필요가 없습니다
좋은 글이네요
갤2커널을 만드는데 컴파일최적화할때 neon을 쓰면 쿼드런트 점수는 올라가는데 움직임의 부드러움은 오히려 떨어지더군요
그리고 움직임의 부드러움을 향상시키면 쿼드런트 점수가 조금 떨어지구요...
아무래도
기기의 화면 해상도가 올라갈 수록 UI를 60fps로 그려내는 것은 GPU의 속도, 특히 GPU의 메모리 버스의 옹량(memory bus bandwidth)과 관련이 있다고 보시면 되요. 실제로 여러분들이 어떤 하드웨어에 대한 성능 값을 얻기를 원하실 때는 항상 메모리 버스의 용량에 주의를 기울이셔야 하구요. (특히나 경이로운 NEON 인스트럭션을 사용하는 경우의) CPU는 늘상 메모리 보다 더 훨씬 더 빠르게 작동할 수 있으니까요.
이부분과 어느정도 관계가 있어보이네요
메모리 대역폭을 고려하지않고 무작정 cpu성능만 올리면 오히려 병목현상땜에 부드러움에서 손해를 볼수있다는 말같은데 맞나요?
이상한 소리 같았다면 죄송합니다
커널은 제작하는데 이론쪽은 전혀모르는 초보라서요;;
그래도 커널제작하는데 어느정도 도움이 될듯합니다
결론적으로 커널 제작시 부드러움을 향상시키려면 메모리쪽 특히 대역폭 튜닝을 해야한다는 뜻이라고 보면 될까요?