Transcript

C# in Depth and XNA in Depth

Korea Game Science High School4th Graduates Jae-yeon Jin

C# in Depth and XNA in Depth 2

Contents

• C# Depth

• XNA Depth

• Q&A

C# in Depth and XNA in Depth 3

C# DEPTHforeach, using, as, is, lock, sealed, …

C# in Depth and XNA in Depth 4

C# Depth - Property

• 멤버 변수의 형태를 띄나 함수 구조

• 속성을 이용하면 생기는 장점–캡슐화 및 은닉화의 간결화

• 속성의 단점–완전히 변수와 같이 사용할 수 없음

C# in Depth and XNA in Depth 5

C# Depth - Property

• 속성의 형태접근지정자 속성이름{

접근지정자 get { return 반환값 ; }접근지정자 set { 코드 ; }

}

• 코드 예public MyProperty{

get { return prop; }set { prop = value; }

}

C# in Depth and XNA in Depth 6

C# Depth – class VS struct

• class–레퍼런스 접근– new ~() -> 힙에 데이터 생성 -> 간접 접근– null 을 넣을 수 있음

• struct–값 접근– new ~() -> 데이터 생성 -> 직접 접근– null 을 넣을 수 없음

C# in Depth and XNA in Depth 7

C# Depth – class VS struct

• 성능상 차이– class 의 편이 조금 더 느림 ( 간접 접근 )

• 기능적 차이– 기본적으로 하는 일은 같으나 용도가 다름– 값만 저장하는 클래스는 struct 의 편이 좋음

• 문법적 차이– struct 는 커스텀 생성자 추가 시 기본 생성자가 그대로 남고 ,

커스텀 생성자에서는 멤버 변수를 모두 초기화 해주어야 함

C# in Depth and XNA in Depth 8

C# Depth – class VS struct

• 구조체의 클래스화– null 을 넣는 게 가능한 구조체–구조체이름 ? 변수명 ;• ex) Point? pt = null;

C# in Depth and XNA in Depth 9

C# Depth – ref VS out

• Call by Reference– ref• 할당된 변수를 레퍼런스 형태로 넘기는 키워드

– out• 레퍼런스 형태로 넘겨서 무조건 값을 받아오는 키워드

C# in Depth and XNA in Depth 10

C# Depth – ref VS out

• 실습– ref 를 이용한 Swap 구현• ref

– out 을 이용한 Try 함수 사용• out• Dictionary<T, T>

C# in Depth and XNA in Depth 11

C# Depth – as

cls var = new cls();cls2 var2 = (cls2)var;

• 위의 형변환은 boxing & unboxing 문제를 유발함

• 해결법 : as

C# in Depth and XNA in Depth 12

C# Depth - as

• boxing– struct 를 class 화 시키는 작업 – 레퍼런스화

수행• unboxing– class 를 struct 화 시키는 작업 – 밸류화 수행

• 문제점– boxing 과 unboxing 은 비용이 큰 작업이다– C/C++ 형 형변환 수행 시 발생하는 문제이다

C# in Depth and XNA in Depth 13

C# Depth - as

• as– boxing 과 unboxing 을 일으키지 않는 형변환

연산자• 다만cls var = new cls();strt var2 = var as strt;• 는 실패

C# in Depth and XNA in Depth 14

C# Depth - as

• as 의 단점–상속 관계의 자료형이 아니면 사용할 수 없다–기본 자료형에서는 사용할 수 없다–문장이 길어질 수 있다

• as 의 장점– boxing 과 unboxing 의 비용을 절감한다

C# in Depth and XNA in Depth 15

C# Depth - as

• is–두 자료형의 연관 관계를 bool 로 나타내는

연산자

• class A, class B : A 일 때 아래의 결과는 trueB b = new B();bool result = b is A;

C# in Depth and XNA in Depth 16

C# Depth - as

• 실습– as 사용해보기• XNA Project• SpriteBatch• DrawableGameComponent

C# in Depth and XNA in Depth 17

C# Depth - foreach

• 열거자가 구현된 클래스를 반복하는 문법

• Formforeach(string s in s_arr){

}

C# in Depth and XNA in Depth 18

C# Depth - foreach

• 열거자가 구현된 기본 제공 클래스 목록– List<T>, Dictionary<T, T>– Queue<T>, Stack<T>– Array– E.T.C. …

• 열거자 인터페이스– interface System.Collections.IEnumerable

• System.Collections.IEnumerator GetEnumerator();

C# in Depth and XNA in Depth 19

C# Depth - foreach

• foreach 의 장점– 대부분의 경우 for 보다 속도가 빠르다– 문장이 간결해진다

• foreach 의 단점– 뒤로 되돌릴 수 없다– 잘못 사용할 경우 boxing & unboxing 문제가

발생한다– foreach 에서 사용하는 열거 변수는 const 취급

C# in Depth and XNA in Depth 20

C# Depth - foreach

• 실습–커스텀 연결 리스트 배열 구현하기• IEnumerable• operator[int index]

C# in Depth and XNA in Depth 21

C# Depth - using

• C# 에서 using 의 두 가지 용도– 사용할 namespace 선언– 사용 후 바로 제거되는 코드 블록

• 1.using System;using System.Text;

• 2.using(Brush p = new SolidBrush(Color.Black)){

~~}

C# in Depth and XNA in Depth 22

C# Depth - using

• 2.–사용하기 위해서는 해당 클래스가 다음

인터페이스 구현• IDisposable

– void Dispose();

–코드 블록이 끝나면 해당 변수는 없는 취급함• 그렇다고 같은 이름으로 같은 함수 내에 두 번 이상 선언하면 이미 있다고

츤츤대며 컴파일을 거부하니 깔끔하게 포기해야 함

C# in Depth and XNA in Depth 23

C# Depth - using

• IDisposable–모두 사용된 데이터를 명시적으로 삭제하기 위해

구현하는 인터페이스

–데이터를 삭제할 수는 있어도 메모리에서 해당 클래스가 바로 삭제되지는 않음

–해당 클래스가 메모리에서 내려가면서 Dispose 함수를 자동 호출하지 않음

C# in Depth and XNA in Depth 24

C# Depth - using

• 실습–커스텀 IDisposable 을 이용한 using-able

클래스 작성• IDisposeable• using

C# in Depth and XNA in Depth 25

C# Depth - sealed

• sealed 키워드–클래스를 상속받지 못하게 해주는 키워드–절대 상속을 하면 안 되는 클래스에 반드시

명시해주어야 협업에서 문제가 발생하지 않음

접근지정자 sealed 클래스이름{

}

C# in Depth and XNA in Depth 26

C# Depth - sealed

• 실습– sealed 를 이용한 클래스 상속 금지• sealed

C# in Depth and XNA in Depth 27

C# Depth - lock

• lock–멀티 스레드 환경에서 임계 영역 지정하는 키워드

–어떠한 변수를 지정해줄 경우 해당 변수를 사용하려는 다른 스레드는 잠시 대기한다

–자주 사용하면 성능에 좋지 않다

C# in Depth and XNA in Depth 28

C# Depth - lock

• locklock( 변수 ){

동기화가 필요한 코드}

C# in Depth and XNA in Depth 29

C# Depth - lock

• 실습–멀티 스레드 환경에서 lock 을 이용해 동기화

하기• System.Threading.Thread• lock

C# in Depth and XNA in Depth 30

C# Depth - Serialization

• 직렬화– 데이터들을 하나의 연속된 바이트 배열로 만드는

작업

– 클래스나 멤버에 속성 (Attribute) 이용하기[ 속성 ( 옵션값 )]class 클래스이름{

구현}

C# in Depth and XNA in Depth 31

C# Depth - Serialization

• 직렬화–직렬화 클래스 속성• Serializable

–직렬화 예외 적용• NonSerialized 속성을 변수에 적용

–직렬화• System.Runtime.Serializable.Formatter

– void Serializable(Stream, object);

C# in Depth and XNA in Depth 32

C# Depth - Serialization

• 직렬화–반직렬화• System.Runtime.Serializable.Formatter

– object Deserializable(Stream);

–직렬화가 필요한 작업• 객체 저장 / 불러오기• 패킷 송수신• 기타 등등

C# in Depth and XNA in Depth 33

C# Depth - Serialization

• 실습– Serialzation 을 이용한 echo 서버 통신하기• System.Runtime.Serializable.BinaryFormat-

ter• System.Net.Sockets.Socket• System.Net.IPEndPoint• System.Net.IPAddress• System.IO.MemoryStream

C# in Depth and XNA in Depth 34

C# Depth – Depth to Depth

• Garbage 관리하기– 모든 class 데이터는 필연적으로 Garbage 가

된다

– Garbage 는 3 단계로 구분된다• 각 단계를 세대라 칭한다

– 데이터는 0 세대 영역에 기본 생성된다

– 오래 사용하는 데이터는 단계 수를 올려 옮긴다

C# in Depth and XNA in Depth 35

C# Depth – Depth to Depth

• Garbage 관리하기–단계수가 높아질 수록 메모리에서 제거될 확률이

적다

–한번 사용하고 버리는 데이터는 반드시 null 등을 대입하여 참조를 해제해야 한다

–만약 한번 사용하고 버릴 데이터 크기가 크고 참조 해제를 오랫동안 수행하지 않으면 문제가 발생할 수 있다

C# in Depth and XNA in Depth 36

C# Depth – Depth to Depth

0 세대

1 세대

2 세대

단기 저장 데이터가장 빈번하게 정리

장기 저장 데이터가장 긴 간격으로 정리

C# in Depth and XNA in Depth 37

C# Depth – Depth to Depth

• Garbage 관리하기–그러나 .NET Compact Framework 는 단 한

세대만 가진다• .NET Compact Framework 사용 플랫폼

– Xbox360– Windows Mobile 6.x– Windows Embedded 6.0– Windows Phone 7– 그 외

C# in Depth and XNA in Depth 38

XNA DEPTHContent Pipeline, Effect, Accelerometer Sensor,

C# in Depth and XNA in Depth 39

XNA Depth - Effect

• XNA 기본 셰이더 (Shader)–셰이더• 사용자 정의 렌더링 파이프라인• XNA 에서는 고정 렌더링 파이프라인이 없음• 셰이더를 이용하여 행렬 적용

• 사용자 셰이더 코드는 컨텐트 파이프라인을 통해 가져온다–클래스 타입은 ShaderEffect

C# in Depth and XNA in Depth 40

XNA Depth - Effect

• Effect 의 Begin 과 End– XNA Framework 1.0 ~ 3.1

• Begin 함수와 End 함수 사이에 렌더링 코드 작성– XNA Framework 4.0

• Begin/End 그런거 없음• EffectPass 를 Apply 하는 것으로 사용 시작

– 왜 달라졌는가• XNA 1.0 ~ 2.0까지는 DirectX9.0c 기반• XNA 3.0 ~ 3.1까지는 DirectX10 기반• XNA 4.0 은 DirectX11 기반

– Windows XP 에서 XNA 3.0 ~ 4.0 의 모든 기능을 사용할 수 없는 이유

C# in Depth and XNA in Depth 41

XNA Depth - Effect

• 실습– BasicEffect 를 이용한 폴리곤 렌더링• Matrix• BasicEffect• EffectPass• GraphicsDevice• GraphicsDeviceManager• VertexPositionNormalTextrure• Vector2

C# in Depth and XNA in Depth 42

XNA Depth – Content Pipe-line

• 모든 컨텐츠를 하나의 인터페이스로– ContentManager 만을 이용한 파일 불러오기– object ContentManager.Load<T>(“Asset

Name“);– 기본 제공 파이프라인

• Texture• Model• SpriteFont• Effect• XACT(Cross-platform Audio Creation Tool)• Sound Effect• 기타 등등

C# in Depth and XNA in Depth 43

XNA Depth – Content Pipe-line

• 사용자 정의 컨텐트 파이프라인–컨텐트 파이프라인 프로젝트• ContentImporter<T>• ContentProcessor<T, T>• ContentTypeWriter<T>

–사용자 프로젝트• ContentTypeReader<T>

C# in Depth and XNA in Depth 44

XNA Depth – Content Pipe-line

• 각 클래스 소개– ContentImporter• 원본 파일을 읽어오는 클래스

– ContentProcessor• 읽어온 원본 파일을 형식을 맞추어 다듬는 클래스

– ContentTypeWriter• 다듬은 데이터를 xnb 파일로 저장하는 클래스

– ContentTypeReader• xnb 파일을 읽어오는 클래스

C# in Depth and XNA in Depth 45

XNA Depth – Content Pipe-line

• 실습–맵 정보가 담긴 텍스트 파일을 처리하는 커스텀

컨텐트 파이프라인 만들기• ContentImporter<T>• ContentProcessor<T, T>• ContentTypeWriter<T>• ContentTypeReader<T>

C# in Depth and XNA in Depth 46

XNA Depth - Accelerometer

• Windows Phone 7 특화 입력 장치– XNA 구성요소 중에는 없음–Windows Phone 7 공용 구성요소–Microsoft.Devices.Sensors.Accelerome-

ter• void Start()• void Stop()• event EventHandler<AccelerometerReadingEventArgs> Read-

ingChanged

–주의 !• 가속도 센서는 다른 스레드에서 동작하므로 사용에

주의해야 함

C# in Depth and XNA in Depth 47

XNA Depth - Accelerometer

• 실습–가속도 센서를 이용한 물체 움직이기• Microsoft.Devices.Sensors.Accelerometer• Texture2D• SpriteBatch

C# in Depth and XNA in Depth 48

XNA Depth - GamePad

• XNA 에서 사용할 수 있는 유일한 조이패드– Xbox Wired/Wireless Controller

왼쪽 엄지 스틱

오른쪽 엄지 스틱D- 패드

뒤로 버튼 시작 버튼

A/B/X/Y 버튼

LT/LB/RT/RB 버튼빅 버튼

C# in Depth and XNA in Depth 49

XNA Depth - GamePad

• 게임 패드 제어 인터페이스– Microsoft.Xna.GamePad

• GetState(PlayerIndex)

• 입력 방법– 버튼 및 패드

• 해당 버튼이 Pressed 인지 Released 인지 검사– 스틱

• 스틱의 X, Y 좌표로 어느쪽으로 스틱이 움직였는지 확인

• 유의 사항– Windows Phone 7 에서는 Back 버튼만 사용 가능

C# in Depth and XNA in Depth 50

XNA Depth - Camera

• Direct3D9 과 같은 다른 미들웨어와 구현 원리는 같음

• Matrix 와 BasicEffect 의 결합이 중요

C# in Depth and XNA in Depth 51

XNA Depth - Camera

• 실습–스카이 박스 내를 XBOX 컨트롤러로 입력받아

돌아다니는 카메라 구현하기• BasicEffect• Matrix• GamePad• Model

C# in Depth and XNA in Depth 52

C# in Depth and XNA in Depth

• 참고서적– C# in Depth• Effective C# (Bill Wagner 저 )

– XNA in Depth• Microsoft® XNA™ Xbox360 과 윈도우를 위한

그래픽과 게임 프로그래밍 (Chad Carter 저 )• 게임 프로그래머를 위한 기초 수학과 물리 (Wendy

Stahler 저 )


Top Related