기회가 있어서 퍼즐위치사가를 클론하게 되었는데, 내용 구조 상 오리지널 게임 퍼즐보불이랑 유사한 점이 많았다. 이제 단순히 만드는 것도 만드는건데, 만들기 전에 코드를 사전에 어느정도 생각하고 접근하면 좋겠다고 생각했다. 이번에 만들기까지의 생각이 워낙 많았기에 풀어보고자 한다.https://play.google.com/store/apps/details?id=com.king.bubblewitch3&pcampaignid=web_share 버블위치사가3 - Google Play 앱버블위치사가3 - 완전히 새로운 버블 슈팅 게임!play.google.com 요구사항 정의하기게임이 퍼즐보블에서 보다 다채로운 내용들이 추가된 편이다. 나는 스테이지에 있는 내용들을 제거하는 것 뿐만 아니라 조건과 특수한 상황이 어..
돈을 많이 쓰면 캐시 메모리를 많이 얻을 수 있다. 그냥 같잖은 라임을 쓴게 짜증난다면 내 의도대로 된거니까 너무 놀라지 마라. 이런걸 어디다간 풀어놓는게 내 다음 생각을 하는데 있어 걸림돌이 되지 않는다.지역성간 지역성 : 방금 접근한 데이터는 곧 다시 접근될 가능성이 높다."방금 사용된 것 위주"로 데이터를 캐시에 두는 것, 즉 최근에 사용된 데이터를 유지하는 전략을 활용한다. 방금 쓴 변수는 곧바로 다시 쓸 확률이 높을 것이니까!!공간 지역성 : 방금 접근한 데이터의 근처에 있는 데이터가 곧 접근될 가능성이 높다.만약 프로그램이 배열[0]에 접근했다면, 공간 지역성에 따라 곧 배열[1], 배열[2]... 에 접근할 확률이 매우 높다. 캐시 메모리컴퓨터의 저장장치는 하나가 아니라, 속도, 용량, 가격..
앞의 글에서 다루었던 문제들은 명시적인 처리 내지 맥락에 맞는 작성으로 해결 할 수 있다. 컴파일러들이 이렇게 보수적으로 접근하는 것을 고려하면 TypeScript는 어쩌면 컴파일러 친절에 특화된 언어가 아닐까라는 생각이 든다. 한두줄 차이의 다른 최적화 기법을 논해보자.코드 이동 (Code Motion)가장 기본적이고 강력한 최적화 기법 중 하나이다. 루프 안에서 반복적으로 수행되지만 결과가 변하지 않는 계산을 찾아 루프 밖으로 빼내는 것이 주된 내용이다.for (int i = 0; i 예를 들어 아래와 같은 코드는 매번 같은 결과를 낼 x y를 반복문 밖으로 빼둠으로써 약간의 시간을 벌 수 있다.// 2차원 배열의 모든 요소에 (x * y)를 곱하는 함수void scale_matrix(int *mat..
여기서 논하는 내용들은 의외로 꼼수라고 느껴질정도로 별거 아닌 기법이지만 그런 플로우들이 많이 사용 될 때 아낄 수 있는 cost는 무시하지 못한다고 생각한다. 우리는 그런 최적화를 유발하는 일이 뭐가 있는지부터 알아본다.우리가 아무리 멋진 최적화 기법을 알고 있어도, 컴파일러가 왜 코드를 마음대로 최적화하지 못하는지 이해하는 것이 중요하다. 보통은 두 가지 원인이 있다.메모리 앨리어싱 (memory aliasing)함수 호출 (function calls) 메모리 앨리어싱 | Memory Aliasing메모리 앨리어싱은 서로 다른 이름(포인터)이 사실은 동일한 메모리 위치를 가리키는 상황을 말한다. 앨리어스(alias)가 '별명'이나 '가명'이라는 뜻인 걸 생각하면 이름에서 유추하기가 괜찮다.컴파일러는 ..