System.out.println("Hello, World");

초기 파라미터

 - 서버단 컴포넌트(Servlet, JSP, Listener등)이 사용하는 문자열중 나중에 변경 될 수 있는 문자열을 web.xml에 등록해 놓고 컴포넌트에서는 호출하여 사용

 - 나중에 변경시 설정에서만 바꾸면 컴포넌트의 수정없이 변경 가능

 - 초기 파라미터 2가지

* 특정 서블릿 JSP만 사용할 수 있는 초기 파라미터

 - ServletConfig 사용

* Application내 모든 Servlet이 사용할 수 있는 초기 파라미터 - ServletContext 이용


 * javax.servlet.ServletConfig

 - Servlet 객체가 일하는데 필요한 정보를 가지고 있는 객체

 - WebContainer가 생성하여 Servlet()의 init() 호출시 중집

 - Servlet 객체당 하나씩 생성


*ServletConfig를 이용한 초기 파라미터 처리

1. Web.xml에 초기 파라미터 설정

<servlet>

<servlet-name>서블릿 객체 이름</servlet-name>

<servlet-class>서블릿 클래스 이름</servlet-class>

<init-param>

<param-name>초기파라미터 이름</param-name>

<param-value>초기 파라미터 값</param-value>

</init-param>

</servlet>

-초기 파라미터가 여러개인 경우 <init-param>을 반복

ex)

2. 코드상에서 조회

ServletConfig 객체.getInitParameter(String paramName) : String paramValue

주석처리한것처럼 해도 되지만 2줄을 써서 할바에야 한줄로 간단히 하는게 더 빠르다.


ex)예제 만들기

1. greeting_form.html을 다음과 같이 만들어주고 서버를 올려서 결과처럼 나오는지 확인한다.


2. 그리고 web.xml에서 초기파라미터를 설정해줘야 하니 다음과 같이 작성한다.


3. web.xml도 설정해줬으니 여기서 파라미터를 받는 GreetingServlet를 설정한다.



4. greeting_form.html에서 이름 텍스트 박스에서 이름을 작성한후 영어 전송을 했을떄 다음과 같이 나오면 성공적으로 한 것이다.


5. 이번에는 web.xml에서 서블릿을 한개 더 만들어서 서블릿을 2개 이용해보겠다. web.xml에 다음과 같이 더 추가한다.


6. 이제 greeting_form.html에서 밑에 있는 한글전송을 눌러봐서 다음과 같이 나오나 확인한다. 




*javax.servlet.ServletContext

-web Application이 자체 또는 일하는데 필요한 정보를 가지고 있는 객체

-web Component는 Web Application과 관련된 정보를 조회하거나 업무를 처리할 때 ServletContext type객체를 이용

-web Applictaion이 시작할 때 Web container에 의해 생성된다.

-Servlet의 getServletContext()를 통해 조회

-ServletContext ctx - getServletContext();

-web Application 당 하나가 생성됨


*ServletContext를 이용한 초기 파라미터 처리

1. web.xml에 초기 파라미터 설정

<web-app>

<context-param>

<param-name>초기파라미터이름</param-name>

<param-value>초기파라미터 값</param-value>

</context-param>


2. 코드상에서 조회

ServletContext객체.getInitParameter(String paramName) : String paramValue


ex)만들어 보기

1. web.xml에 파라미터를 설정한다.



2. ContextParamServlet 작성


3. 서버를 재가동하여 http://127.0.0.1:8088/myweb/ContextParamServlet 이 제대로 나오는지 확인한다.


○ javax.servlet.ServletConfig vs javax.servlet.ServletContext

확인한다ServletConfig는 서블릿당 하나니며, ServletContext는 웹 어플리케이션 당 하나이다. 

웹 어플리케이션은 오직 하나의 ServletContext으로 전체 웹 어플리케이션에서 정보를 공유한다. 그러나 웹 어플리케이션 안에 있는 서블릿은 자신만의 ServletConfig를 가진다. 컨테이너는 웹 어플리케이션이 배포되는 시점에 ServletContext를 생성하며, 서블릿이나 JSP(서블릿의 일종)에서 이용 가능하도록 한다. 


 - 동일 웹 어플리케이션에서 컨테스트 초기화 파라미터 이름과 서블릿 초기화 파라미터 이름이 같아도 상관없는 이유는 ServletContext와 ServletConfig는 서로 다른 객체며, 

   동일한 이름을 사용하더라도, 서로 다른 이름공간을 사용하기에 충돌이 일어나지 않는다.


Posted by 김마농

GetMessage와 PeekMessage

- GetMessage는 메세지 큐에서 메세지 정보(msg)를 가져오는 작업을 한다. 

  여기서 약간 특이한 작업을 하는데, 메세지가 있으면 TRUE, 없으면 FALSE가 아닌 비활성화(대기상태)가 된다. 한마디로 메세지가 

  올때까지 대기한다. 대기상태가 되면 프로그램을 메모리를 최소화하며 <데드타임>에 들어가게 된다.

 

- PeekMessage는 GetMessage와 비슷한 일을 처리하지만 메시지가 있으면 True를, 없다면 FALSE를 반환하는게 큰 차이점이다.


프레임 스킵

 - PC사양이 딸려서 계속 화면에 그리기가 어렵다면 그리는 것을 포기하여 렉걸린것처럼 보이게 하는걸 의미한다.


다이렉트는 가상의 공간(백버퍼)에 그리고 프론트버퍼로 출력한다. 이것을 더블 버퍼링이라 하며 이유는 장치와 장치사이 연산속도가 제일 느리기 때문이다.


다이렉트 객체 생성 -> 디아비스 생성 -> 그릴준비 완료(back 버퍼) ->BeginScene이 그려야 한다. ->EndScene-> 화면 출력 - >백어퍼 삭제 ->Loop돔


UpdateData()와 Render()는 서로 분리시켜야 한다.

 - UpdateData는 좌표계산을 하며, Render는 그려주는 역할을 한다. 이 둘을 따로 분리하면 프레임속도가 높아지며 게임속도가 빨라진다. 



Posted by 김마농

○ 카메라

 - 3차원 게임에서 카메라는 시점을 의미한다. 3D게임의 화면에 보이는 모든 것은 카메라를 통해서 보여지는 것이다.

    3자의 입장에서 바라보면 캐릭터의 눈 위치에 카메라가 위치하여 캐릭터의 움직임에 따라 카메라의 방향과 위치가 변하는 것이다.


○ 변환 파이프 라인

 - 변환파이프라인의 목적은 하나의 이미지를 만들고 게이머의 화면에 그것들을 보여주기 위한 것이다.

    파이프 라인은 기하적인 데이터를 하나의 물체나 장면으로 표현하는 역할을 하며, 그것들로부터 2차원의 이미지를 만들어낸다.



○ 모델 공간(Model Space)

 - 일반적으로 하나의 캐릭터를 표현할 때 모델공간이라 불리는 하나의 좌표계에서 정점의 위치를 저장한다.

 - 로컬 좌표계를 이야기한다.


○ 전역공간(World Space)

 - 3차원 공간상의 최종적인 원점의 좌표계

 - 게이머의 화면에 보여질 모든 물체들을 위한 절대적인 레퍼런스 역항을 수행

 - 게임의 오브젝트들은 월드 공간의 좌표를 가지고 있다.


☆ 월드 변환(World Transform)

- 박스와 실린더가 각각 존재한다.

- 따로 따로 모델링된 실린더와 박스는 각각의 좌표계를 갖는다. 이것이 로컬 좌표계이다.

  이것들은 그냥 3차원 공간상에 배치하게 되면 원점을 공유한다.

- 2개의 물체를 따로따로 출력하기 위해서는 물체가 사용하는 로컬 좌표계가 아닌 월드 좌표계를 도입해야 한다.

- 즉 '실린더의 로컬좌표계 -> 월드 좌표계"와 "박스의 로컬 좌표계 -> 월드 좌표계"라는 2개의 변환이 필요하다.

- 일반적으로 3차원 그래픽에서 변환을 행렬을 사용한다고 해으니 로컬 좌표계->월드 좌표계는 행렬 변환이라는 것을 알 수 있다.

- 이런식으로 로컬 좌표계를 월드 좌표계로 변환하는 행렬을 변환 행렬(Transform Matrix)이라 한다. 


○ 시점공간(Eye Space)

 - 카메라가 바라보는 공간을 시점공간이라고 한다.

 - 시점이 그 공간 좌표계의 원점이 된다.


○ 절단 공간(Clip Space)

 - 어떤 물체가 보여지는 위치에 있는지, 그렇지 않은지를 판단.

 - 시야 절두체를 통해서 이루어진다.

 - 절단 공간상의 시야 절두체를 표현한 축정렬된 육면체의 크기는 동차 좌표계에서 표현된 4번째 좌표와 관련있다.

 - 카메라가 바라보는 정육면체 안에 잘라서 넣는다.


○ 정규화된 장치 좌표계(Normalized Device Coorinates)

 - 절단 공간에서 추 정렬된 육면체의 크기인 W를 1로 놓으면 정규화된 장치 좌표계를 얻을 수 있다.

 - 정규화된 장치 좌표계를 기준으로 표현된(x,y,z) 좌표에서 z값을 0으로 놓아서 좌표(x,y)를 얻는다.

 - 3D에서 2D로 변환하는 과정을 Z버퍼라고도 하며 스테실버퍼(그림자)에도 쓰인다.


○ 윈도우 좌표계

 - 정규화된 장치 좌표계를 실제 모니터상의 x,y 좌표계로 변환해야 하는데 이를 뷰포트 변환이라고 하며 정규화된 장치 

          좌표계에 게이머가 설정한 뷰포트의 크기를 곱하여 실제 윈도우의 x,y좌표를 얻어 낸다.


☆ 시야 절두체

 -시야 절두체란 하나의 3차원 공간상에서 카메라에 의해 보일 수 있는 것들을 담는 범위

 - 피라미드 형태의 육면체로 구성되어 있다.

☆ 투영

 - 투영은 3차원 장면을 2차원 모니터 화면에 그리기 위해, 장면에 표현되는 캐릭터나 물체들의 각 정점을 화면에 그려지는 

    2차원 좌표를 결정하기 위해 사용한다.

○ 원근 투영

 - 가까운 물체는 크게, 먼 물체는 작게 그려진다. 대부분의 게임에서 사용되는 방법





○ 직교 투영

 - 원금감을 갖지 않는 투영 방법으로 화면에 어떤 물체가 그려질때 원근에 의한 왜곡이 발생하지 않는 방법

 - 캐드 같은 설계 분야에 적용되며, 유명한 디아블로2가 직교 투영 방법을 사용한다.

          


☆ 일인칭 시점 카메라

 - 카메라의 위치는 위치벡터로 표현한다.

 - 시선 방향은 카메라가 바라보는 방향을 나타내는 방향벡터이며 

 - 상향 벡터는 카메라의 위쪽 벡터이다.

○ 카메라 변환(Camera Transform)

- 카메라 변환이란 3차원 월드 좌표계를 카메라를 기준으로 한 카메라 좌표계로 변환하는 것을 의미한다.

- 월드 좌표계를 카메라를 기준점으로 한 좌표계로 변환하는 과정이 카메라 변환이다. 


☆ 3인칭 시점 카메라

 - 3인칭 시점 카메라는 제 3자의 입장에서 내려다보는 시점을 제공한다.

 - 카메라는 게임 내의 캐릭터의 움직임과 무관하게 게이머의 명령에 따라 이동한다.





Posted by 김마농