걍 혼잣말 2009. 12. 29. 10:03

몇달전인가쯔음 클라우드 컴퓨팅을 이용한 게임스트리밍 서비스의 프로토모델을 본적이있다.
그 당시 정말 획기적이라고 생각을 했다.

그리고....오늘...나는 온 라이브라는 새로운 서비스에 대한 소개영상을 보았다.

그리고 어떤사람의 블로그에서 온라이브에 대한 부정적인 측면을 보았다.

기술적 측면 그리고 비지니스적인 측면이다.

블로그주소를 밝히진않겠지만 조목조목 내가 아는 지식으로 한번 태클을 걸어보자.

1. 기술적 측면..

   그 블로그에서는 기술적인 측면에 대해 이런 글을 써놓았다. 그래픽카드로 렌더링을 할텐데 그게 다중 칩셋이 되는가? 100명인분의 크라이시스를 서버가 그래픽카드 몇대로 처리하는것인가?? 이는 무식한 소리다....왜 렌더링은 그래픽카드로만 한다라고 생각을 하는가? 서버급 피씨 수십대...아니 수백대를 묶어서 cpu로 렌더링을 하고 그 결과를 스트리밍으로 처리를 해준다면 가능할거라는 생각은 왜 못하는것일까? 단적인 예로 크라이시스를 개발했을당시 그래픽카드 성능이 후달려서 슈퍼컴퓨터로 렌더링하고 게임을 돌리며 테스트했다는 일화도 있지않은가?  얄팍한 지식으로 사업을 논한다는건 부끄러운 일이라고생각한다..

엄청난 대수의 서버로 렌더링 연산을 하고 그 결과정보를 압축하여 영상스트리밍을 한다면 굳이 불가능할것도없다. 인풋역시 플래시를 통해서 넘겨받으면 되는것이니까 문제될것이 없다. 아이디어 한번 기똥차다라는 말밖엔 할말이없다. 이런녀석이 정말로 활성화되어 실용화가 된다면 사실상 값 비싼 PC, 비싼 콘솔이 없어도 하고싶은 게임을 즐길수도 있을것이다......기술적으론....?

2. 비지니스적인 측면

  또 위에서 언급한 그 블로그에서는 비지니스적인 측면에 대해 게임회사에서 과연 그렇게 하겠느냐라는 의견을 내놓았다. 고사양 게임을 저사양에서 그것도 저렴하게 즐길수있다면 오히려 양적증가로 인해 이득이 되지않을까하는 생각이 드는데 왜 저 블로거는 그런 의견을 놓는지 모르겠다. 값비싸고 사양이 좋은 유저들중 일부가 정품구매해서 하는 게임, 그리고 사양이 낮지만 즐길수 있게 된 많은 유저들이 정식으로 돈을주고 서비스받아서 하는 게임.....그 소득의 차이가 존재할까? 그리 크게 차이가 나지않을거라 생각한다.


내생각은 이러한 디바이스가 홈씨어터 시스템과 광대역 통신망을 통해 연결이 된다면, 그 어떤 콘솔 부럽지않은 훌륭한 게임디바이스가될것이라는 생각이든다. 그리고 그러한 것이 우리가 앞으로 추구해야할 엔터테인트 먼트가 아닐까싶다...   수많은 디바이스로 한개씩 즐길것인가? 아니면 적은 디바이스로 여러개를 다 즐길수 있을것인가?

이는 유저에 달렸지만 나는 후자쪽이 더 옳은것같다.....집안 인테리어도 그렇고 공간 차지도 그렇고 여러가지 장치를 주렁주렁 달아놓는것보다 티브이에 데크 하나면,  영화도 볼수있고, 게임도 할수있고 티비도 볼수있고, 인터넷도 할수있고 다 할수 있다면 이 얼마나 좋은것인가?

온라이브는 그러한 측면에서 바라본다면 굉장히 긍정적일거라 생각한다.......넷북에서 모니터 아웃시켜서 즐기는 크라이시스,.....콜오브듀티......환상적이지않은가? 하드웨어 플랫폼에 구애받지않고 다같이 즐길수있는 게임.....상상만으로도 멋진 것이라 생각한다....

posted by Sense.J
:
4-2학기 2009. 12. 13. 05:54
4-2학기..마지막 학기를 다니며 권혁철 교수님의 컴파일러를 수강하며
호철이와 한조로 호흡을 맞추어 진행하는 텀.....

for, while, if , 펑션콜, 인자, printf, break, int변수, 사칙연산, 나머지연산 을 지원하는
심플한 c컴파일러다

c코드를 asm코드로 생성해주며 어셈블링과 링킹과정을 자동으로 거치게 했는데 이 과정을 거치면
실행가능한 exe바이너리가 생성된다.

마무리만 하면 컴파일러는 무난할듯......

posted by Sense.J
:
4-2학기 2009. 12. 2. 04:34
간단하게 만드는거라 VB를 이용했다.

사용자 삽입 이미지


HTML을 이용하여 문자전송이 가능하다라는 사실을 증명했다.

HTML의 엘레먼트 속성을 이용하여 조금 장난을 치면 가능하다.

자세한건 언급할 수 없다.

어쨋든 언젠가 해보리라고 생각해놓고 미루어만 왔던 SMS전송 기능을 직접 구현했으니

좋은 경험을 했던거같다.

실행파일 및 소스코드는 공개하지않는다.

다른 사이트들도 마찬가지로 같은 기법을 적용하면 가능할거라 생각한다.

이제 해보고싶은건 목록중 남은건 OS만들어보는것, 컴파일러, 증강현실게임.........

컴파일러는 간단하게나마 가능할것같고, 증강현실게임은 시간이 남으면 해볼지도...

오에스를 만들어보는건 먼 미래에........ㅠㅜ...안녕 내 로망.......
posted by Sense.J
:
OpenGL 2009. 11. 12. 05:08

사용자 삽입 이미지



Glut를 이용해서 구현한 태양계 자전,공전 궤도의 시뮬레이션이다..

식겁했다.....

누군가 비슷한걸로 고민할거라생각하며 꼼수로 만든 소스코드를 공개한다..

돌려보려면 알아서 GLUT를 설치하길 바란다.
posted by Sense.J
:

현재 수많은 네티즌 들의 ActiveX에 대한 반대가 거쎄어지며 표준화가 이루어지려는 움직임이
예전보다 거세어지고있다.

이러한 움직임을 웹에서 뉴스를 통해 접하거나, 포럼을 통해 접한 수많은 학우들이 있을거라 생각한다. 1년전쯤 내가 과제로 ActiveX 방화벽을 만들때 즈음 누군가 이런말을 한적이 있다.

"사장되고있는 ActiveX를 해서 머하는지 이해가안된다. 보안성도 좋지못하고, 말도많고 탈도많은걸 왜 우리가 해봐야 하는거야??"

물론 틀린말은 아니다.

하지만 어떤점이 ActiveX가 그렇게 나쁘다는 생각을 가지게 했는지 상세히 아는지가 더 궁금하다.

백문이 불여일견이라고 했다. 직접 겪어보지않고는 와닿지 않고, 시야가 좁아진다라고 생각한다.

activeX로 단한번도 작성해본적이 없는 사람이 백날 보안이 어쩌니, 비표준이니 어쩌니 해봐야 전혀 설득력이 없다. 왜 그게 나쁜것인가, 무엇이 문제인지는 글로봐서 느낄수 있는것이 아니다.

남이 해놓은 결과만을 보지말고 직접 해보라.
남은 해놓은걸 본것을 자신이 해본것과 착각 하지마라.
남의 경험을 자신의 경험인것으로 착각하지 마라.
남의 생각을 자신의 생각인냥 말하지 마라....

이런말을 이 블로그에 들르는 사람들에게 해주고싶다.

초등학교 3학년때부터 혼자서 독학으로 프로그래밍 공부를 해왔던 학우로써 , 비록 실력은 형편없지만 적어도 내가 꺠달은 부분은 저런것들이기에 문득 이런글을 포스팅한다.

posted by Sense.J
:
프로그래밍 관련자료 2009. 9. 30. 05:32

문득 다가올 텀프로젝트에 대비하여
C++의 펑션을 C에서 가져다 쓸 방법에 대해 고민하게 되었다.
그 이유는 벡터와 스택과 같은 매우 유용한 클래스 라이브러리를 사용하기 위함이다.

여러가지 방법이 있을수있지만
웹서핑과 실험이후 얻은 결론은 다음과 같다.
a.cpp , main.c
두개의 파일이 있다고 가정하자
a.cpp에는 클래스를 구현한후, wrapper 더미 펑션을 생성한다.
이유는 씨에서 호출하기 위함이다.
클래스를 래핑하여 건드릴 수 있는 더미 함수를 생성할떄 extern "C"로 생성하여
맹글링 문제가 생기지 않게 해주어야 한다.
함수의 다형성 문제로 컴파일러가 펑션  이름을 알아서 바꾸게 되는데 이를 저지하게 해주는
전처리문정도로 생각하면될듯하다.
이렇게하여
g++ -c a.cpp -o a.o
gcc -c main.c -o main.o

이후 오브젝트 코드가 생성되면 g++을 통해 링크해주면 된다
g++ main.o a.o -o a.out

이런식으로 하면 a.out이 생성되고 c코드에서 C++을 불러오는 경이로운(?)모습을 볼 수 있다.

posted by Sense.J
:
4-2학기 2009. 9. 28. 06:56
사용자 삽입 이미지


LEX, YACC을 이용하여 Parse Tree를 생성한 모습이다.

숱하게 삽질했다.......
어쨋든 어느정도 내가 만족할만한 수준으로 출력이 되는것을 확인했다.

ncurses라이브러리를 이용하여 출력하려 했으나, 좀 먼가 내키지 않아
터미널 화면을 컨트롤 하는 명령을 이용하여 약간의 잔재주를 부렸다.
약간 비겁한 방법이지만 스택을 이용하여 역 추적해가면서 자신의 parent를 찾는 방법을
택하였다.
뭐 구현이 되었으니.....만족한다.

며칠간 삽질하던끝에 어느 이른아침....완성하며.........am 6:55
posted by Sense.J
:
4-2학기 2009. 9. 16. 03:32

수업시간에 교수님이 한번 해보라고 농담삼아 던지신 심플파서

S-> aS | bS | c '\n' 으로 끝나는 심플한 그래머를 만족하는
파서를 작성하는것.
의외로 간단하다....



#include <iostream>
#include <conio.h>

using namespace std;
 
// S->aS|hS|c'\n'

int S()
{
 char ch,temp;
 ch=getch();
 if(ch=='a' || ch=='h')
 {
  cout  << "valid Parse : " << ch << endl;
  return S();
 }
 else if(ch=='c')
 {
  temp=getch();      
  if(temp=='\0' || temp==13)
  {
   cout  << "valid Parse : " << ch << endl<<endl;
   cout << "Finished Parse : OK" << endl;
   return 0;
  }
  else
  {
   cout << endl << "invalid Parse : " << ch << endl;
   cout << "err" << endl;
   return -1;
  }
 }
 else
 {
  cout << endl << "invalid Parse : " << ch << endl;
  cout << "ERR" << endl;
  return -1;
 }
 return 0;
}

int main()
{
 // Start Parser
 S();
 return 0;
}

posted by Sense.J
:
4-1학기 2009. 9. 11. 03:44
1. VOIP

VOIP(Voice Over IP)라는 것은 용어 해석그대로 IP를 통하여 사람의 보이스를 전달하는 것을 의미한다. 우리가 4-1학기 실험에 작성한 VOIP의 구성은 다음과 같다.
HUINS PXA255보드에서 작동하는 커널2.4x버젼의 리눅스, HP의 PDA 이 환경의 전부이다.
HUINS PXA255보드는 PDA끼리의 연결을 위한 중앙서버역할을 맡았다.
PDA는 VOIP를 위한 클라이언트 즉 단말기의 역할을 맡는다.

이제 본격적으로 구현된 기능을 중심으로 이야기를 해보자.

PDA자체의 CPU가 성능이 그리 좋지는 않다.
초창기에 OGG인코딩을 스트리밍하여 전송양을 줄여보려 했으나, 이는 오히려 인코딩/디코딩시에
시간이 더욱 소모되어 저사양의 PDA에서는 오히려 해가 될거라 판단했다.
그래서 RAW정보 자체를 그대로 전송하기로 결정하였다.
제한조건은 다음과 같다.
VOIP상에서 홀펀칭(STUN이라고도 불리운다.) 을 구현하려 했으나 실패한 관계로, PDA는 GLOBAL IP를 갖는다(모든단말), 혹은 모든단말이 같은 AP에 접속하여 같은 WAN-IP를 공유하는 라우터내에서 NAT로 등록된다라는 가정이다.

이런 가정하에 LOW LEVEL 함수를 통한 음성 정보 수집에 들어갔다. 기본적인 구성은
Visual C++ 6.0 Bible에 수록된 음성과 관련된 파트를 참조하여 작성을 하였다.

음성을 녹음받은후 데이터를 전송한다.
이 데이터는 메모리에 다중버퍼에 저장되고 이 버퍼에 데이터가 채워졌을경우 재생을 시작한다.

가장중요한건 지금부터다.

재생을 함에 있어 일반적으로 겪는 문제는 "뽂뽂뽁뽁....."거리는 소리가 들림에 있다.
버퍼링 사이즈를 무제한으로 길게 하면되지만 이는 현실적인 도피일뿐 근본적 해결이 아니다.

재생버퍼는 0.4초정조만을 재생하게끔 되어있기때문에 다음데이터를 불러올때 연결되지못해
끊기는 소리가 들림으로인해 뽂뽂거리는 소리가 들리는것이 원인이다.

이를 해결하기 위해서는 재생시에 더블버퍼링을 구현하여야한다.

C#으로 VOIP를 작성해본 사람이라면 C#이 내부적으로 다 처리해줌으로써 손쉽게 구현했었을것이다.(소스는 웹에 널리고 널렸다.)
하지만 C++로 직접 로우레벨 함수를 통해 제어하려다보니 이런것들도 일일이 다 컨트롤해야한다.

이부분은 msdn에 설명이 나와있지만 이해하기가 쉽지않다.

간단히 소개하자면, 재생버퍼에 다음재생할 부분을 미리 넣어둔다.
그리고 다음에 그 부분을 재생하는 것이 원칙이다.
이렇게하며 더블버퍼링이 구현되어 연속적으로 부드러운 음성재생이 가능하다.

방법은 이해했지만, 실질적으로 구현함에 있어 뜻대로 잘 구현이 되지 않을것이다.
이는 다음번에 핵심부분 소스코드를 올려서 설명을 하겠다.
(사실 며칠을 밤을새서 구현성공한 부분인지라 공개를 고민중이다..)

이로써 기본적 기능은 구현이 될것이다.
버퍼링 사이즈및 비트레이트 역시 전송딜레이에 큰 영향을 미친다. 우리팀은 이를 실험적 시도를 통하여 딜레이가 0.3초 정도밖에 되지않는 voip구현에 성공하였다. 이수치는 공개하지않겠다.

두번째는 서버측 기능이다.
클라이언트는 비정상 종료할수도있고, 정상종료할 수도있다.
이로인해, 서버는 리스트관리를 타이트하게 할 필요가있다.
이로인해 우리는 클라이언트에서 주기적인 Alive msg를 전송하고, 이 Alive msg가 도착하면
다음 Alive msg 전송시간까지 라이프 타임을 얻게한다. 이 라이프 타임이 다 소모되어 0이될때까지
Alive msg가 전송되지 않는다면 비정상 종료된 것이므로 강제로 리스트해제 등록을 해제하고 관련 리소스를 모두 해제하는 것이 우리가 구현한 중요부분이다.
이는 익셉션 핸들링을 서버에서도 처리해줌으로써 안정적인 작동을 가능하게 해주는 대목이다.

최종 완성된 모습은 다음과 같다.

사용자 삽입 이미지

좌측이 임베디드 보드에서 작동하는 서버 어플리케이션의 모습이고, 우측은 pda에뮬에서 작동시킨
어플리케이션 화면이다. 실제로는 PDA에서 작동시켰으나, 스크린샷을 위해 에뮬레이터에서 작동시켰다.

posted by Sense.J
:
4-1학기 2009. 7. 10. 03:59
4-1학기 나에게 많은 경험을 하게해준 하드웨어실험에서
내가 직접 참여하고 작성하였던 내용들을 공개하려 한다.

1. VOIP
2. Malloc on Ucos-ii
3. RoundRobin Scheduler on Ucos-ii

위의 3가지를 공개하려한다.

VOIP는 hp PDA에서 작동하는 어플리케이션이며, 임베디드 리눅스상에서 중계서버기능을 위하여
휴인스 PXA255임베디드 개발보드를 사용하였다. 임베디드 QT역시 사용되었고, 터치스크린을 이용한 관리 기능을 제공하였다. VOIP어플리케이션의 경우 끊김이 없는 품질을 제공했고, 이는 저수준 API를 이용하여 재생더블버퍼링, 전송버퍼링 등을 구현하였기에 가능하였다. 상세한 내용은 다음 포스팅때 같이 올리겠다.
posted by Sense.J
: