아이오 교육센터의 기술자료는 다양한 서적/문서를 참고해서 교육센터 자체로 만든 자료입니다. | |
마음대로 퍼가셔도 되지만 꼭 출처를 밝혀 주시기 바랍니다. | |
bit flag를 활용한 성능 향상 기법 | |
게임서버를 만들일이 있다고 가정해 보겠습니다. 저는 게임을 잘 모르지만 일예로 리니지 같은 게임을 만든 다면 게임서버에 들어갈 요소는 무엇이 있을까요? 캐릭터, 몬스터, 아데나, 맵, 좌표체계 기타등등 이 떠오릅니다. 이중에서도 가장 중요한것이 빠져 있는 데요? 그것은 바로 아이템 입니다. 그렇다면 프로그램에서 아이템을 소유하고 있는지를 표현 하려면 어떤 자료 구조가 가장 좋을 까요? 일견 떠오르는 것은 변수지만 변수는 아이템의 수가 많아 지면 변수도 증가 해야 하고 변수의 네이밍이 어려울 뿐더러 루프구조에 넣을수 없으므로 일반화 시킬수 없다는 단점이 있습니다. 이런 단점을 극복한 것이 바로 배열 이지요. 배열을 이용해 다음처럼 프로그램을 작성해 봅시다. | |
| |
프로그램의 결과는? 0번 아이템 소유중 3번 아이템 소유중 --------------------- 3번 아이템 소유중 로 출력 됩니다. 아주 훌륭한 결과라 할 수 있습니다. 아이템 개수가 늘어 나더라도 프로그램은 아이템의 수만 바꾸면 간단하게 바꿀수 있도록 설계 되어 있으니 아이템 소유 유무를 출력하는 부분만 함수로 분리 해주면 아주 좋은것 같습니다. 그렇다면.. |
다음과 같이 함수로 모듈화 하면 되겠네요.. | |
|
그럼 이제 모든게 끝났습니다. 원래 게임 서버라는게 그래픽이 들어가지 않으므로 빠르게 데이터를 중계하는 자료구조가 중요한데 위에 설계처럼 배열을 이용하니 간단히 해결 된것 같습니다. 그럼 이제 문제가 전혀 없는 걸까요? 잠시 생각해 봅시다. 동시접속자 : 10000명 캐릭터 수 : 5개 아이템수 : 1024개 아이템 메모리단위 : 4byte 인 시스템의 경우 아이템을 위한 서버의 메모리는 얼마일까요? 4 * 10000 * 5 * 1024 => 약 200 Mbyte 라는 결과가 나옵니다. 게임서버를 이루는 수많은 요소 중에 아이템을 표시하기 위해서 저렇게 메모리를 많이 끼워야 한다는 결론이 나옵니다. 머 요즘은 메모리가 싸니깐 메모리를 더 끼면 되는거 아녀? 라고 생각할 수도 있지만 더 큰 문제는 메모리를 저렿게 많이 사용하면 속도가 느려져서 유저들이 게임을 실시간으로 즐길수 없다는 결론에 도달하게 됩니다. 결론적으로 위와 같이 프로그램 하면 절대 안된다는것이지요.. 안된다는 것을 알았다면 대안이 필요할텐데요? 그 대안은 바로 아이템을 위해 INT를 사용 하지않고 char를 사용하는 것입니다. 하지만 그 정도 대안으로는 위와 같은 문제를 해결 할수 없지요.. 메모리를 혁신적으로 줄여서 성능을 향상 시키고 싶다면 고수들이 즐겨 쓰는 비트 필드 연산자를 이용 하면 됩니다. 다음의 프로그램을 보세요.. 그리고 원리를 생각해 보세요. | |
|
프로그램의 결과는? 0번 아이템 소유중 3번 아이템 소유중 --------------------- 3번 아이템 소유중 으로 기존 배열 버젼과 같습니다. 다음 설명을 보세요. 모든 아이템을 1bit만으로 표시 하기 위해 비트별 |는 비트 세팅을 위해 사용 됩니다. ![]() 위에 그림처럼 아이템은 비어 있었으나 가장 마지막 비트가 세팅됩니다. 비트 필드는 가장 오른쪽이 2의 0승 자리 이므로 0번째 인덱스가 세팅되었다고 볼수 있습니다. ![]() 위에 그림에서 보듯이 0번 인덱스가 세팅 되어 있는 아이템에서 3번 인덱스를 세팅하려해도 비트필드 연산 | 가 사용 됩니다. 원래 세팅되었던 값은 그대로 유지된채 3번이 추가 되는것을 볼수 있습니다. ![]() ![]() ![]() 마지막 하이라이트인 비트 제거 입니다. 비트제거는 비트검사 루틴에다가 ~인 1의 보수를 적용하면 작성 할수 있습니다. 전체 아이템에서 ~을 취한 비트 마스크를 적용하면 기존 플래그는 그대로 내려오고 해당 플래그만이 제거 된것을 확인 할 수 있습니다. 이상으로 배열을 이용한 모델의 게임서버의 메모리량을 32분의 1로 혁신적으로 줄이고 속도도 향상 시킨 비트 필드 연산자의 활용법을 공부 했습니다. 하지만 이렇게 기능을 향상 시킨 프로그램도 치명적인 문제를 안고 있는데요? 그문제는 무엇일까요? 그 문제는 바로 INT는 정수 표기법 이므로 32bit 이상을 가질수 없고 그렇기 때문에 아이템을 32개 밖에 처리 할수 없다는 문제가 있습니다. 아주아주 치명적인 문제이지요.. 게임서버에 아이템을 32개밖에 둘수 없다니.... 메모리를 아무리 아끼면 머합니까? 사용할수 없는데.... 그렇다고 여기서 포기 하면 안되겠지요? 그래서 우리의 선인들은 더욱도 놀라운 기법을 연구했는데요? 이 문제를 어떻게 해결할지 여러분도 고민해 보세요.. 그럼 다음 강좌에 그 기법을 상세히 논의 해보도록 하지요... |
무료 세미나를 진행 합니다.
주제 : C 포인터의 모든것
신청 : www.ioacademy.co.kr 참고
이 작성자의 게시글 |
댓글 없음:
댓글 쓰기