분류 전체보기 188

Cpp - 상속#1

기본적인 내용은 안 씀. 상속 상속은 왜 쓸까? 클래스 간의 관계 : 동물 -> 고양이 사람.. 코드 재사용 : 동물은 잠을 자.. 그럼 고양이 사람도 다 잠을 자 일관적인 클래스 인터페이스 (class interface consistency) : abstract, interface , pure virtual function dynamic function binding (virtual function, virtual table) 상속을 받을 때는 public, protected, private 키워드를 붙일 수 있다. 설명은 주석으로 대신한다. class A { public: int x; protected: int y; private: int z; }; class B : public A { // x is..

언어/C++ 2021.07.18

곡선(Curve) & 스플라인(Spline)

곡선 곡선을 표현하기에 앞서, 두 정점 (A, B) 사이에 있는 점 P를 다음과 같이 표현할 수 있다. 또한 곡선은 t에 대한 방정식(P(t))으로 표현할 수 있다. 베지에 곡선(Bézier Curves) n차 베지에 곡선은 n+1개의 점으로 얻을 수 있는 베지에 곡선이다. 1차(Linear) 베지에 곡선은 앞서 말한 점 A,B 사이에 있는 점 P의 집합으로 표현할 수 있다. 말이 곡선이지, 사실상 A-B를 잇는 선분이다. 2차(Quadratic) 베지에 곡선은 아래와 같다. 2차 베지에 곡선은 A와 B를 잇는 1차 베지에 곡선 위에 있는 한 점 AB(t)와 B와 C를 잇는 1차 베지에 곡선 위의 한 점 BC(t)사이에 있는 한 점 P(t)의 집합으로 볼 수 있다. 식으로 표현하면 다음과 같을 것이다. ..

이론/그래픽스 2021.07.11

C# - 리플렉션 (Reflection)

리플렉션 리플렉션은 컴파일 시에 알 수 없었던 타입이나 멤버들을 찾아내고 사용할 수 있게 해주는 메커니즘이다. 그러나 다음의 주요한 단점이 존재한다. 리플렉션을 사용하면 컴파일 시에 타입 안정성을 해친다. 리플렉션은 전반적으로 느리다. 어셈블리에서 정의하는 메타데이터를 살필 때 항상 문자열 검색이 수행되어야 한다. 리플렉션을 이용하여 멤버를 호출하면 성능에 좋지 않은 영향을 미친다. 따라서 먼저 매개변수들을 배열로 포장해야 한다. 내부적으로는 이렇게 포장된 내용을 다시 꺼내어 스레드의 스택에 옮긴다. 추가적으로 CLR이 메서드 호출 전에 각각의 매개변수들이 올바른 타입을 가지고 있는지 확인하고 호출자가 호출하려는 멤버에 접근할 보한 권한이 있는지 확인해야 한다. 상기의 이유로, 타입의 필드나 메서드 혹은..

언어/C# 2021.07.04

C# - CLR 호스팅과 앱도메인

호스팅 & 앱도메인 호스팅이란? 어떤 응용프로그램에서도 CLR을 사용할 수 있도록 해주는 기능이다. 이 기능을 이용하면 기존에 개발된 응용프로그램에 추가 기능을 관리 코드를 이용해 작성할 수 있다. 그러나 이런 확장은 위험의 여지가 있는데, 제 3자의 DLL을 프로세스 공간에 로드함으로써 DLL이 응용 프로그램의 데이터나 코드를 손상시키거나 접근할 수 없는 리소스에 접근(보안 컨텍스트 취득)할 수 있기 때문이다. 이를 해결하기 위해 앱도메인 기능이 있다. 앱도메인은 제 3자의 코드를 프로세스에 로드할 수 있게 해주지만 데이터나 코드 및 보안 컨텍스트가 손상되거나 탈취되지 않도록 보장해준다. 호스팅과 앱도메인 기능을 어셈블리 로딩과 리플렉션과 사용하면 .NET Framework의 참맛을 알 수 있다고 한다..

언어/C# 2021.06.27

Game AI - Steering Behaviors (1)

이전글 : 2021.06.13 - [Game AI] - Game AI - 기본적인 이동 Game AI - 기본적인 이동 KINEMATICS 어떤 물체의 운동 상태는 다음과 같이 표현 할 수 있다. public struct Kinematic { public Vector3 position; public float orientation; // x-z 평면에서 +z축으로부터 시계방향 각도. public Vector.. tsyang.tistory.com 가속도 있는 이동 이전글의 마지막에서 가속도가 없는 운동을 다뤘다. 가속도 없는 운동의 알고리즘들이 속도를 반환했다면 이번에는 각 가속도 운동 알고리즘이 다음과 같은 가속도를 반환한다. public struct SteeringOutput { public Vecto..

Game AI 2021.06.19

Game AI - Kinematic movement alogrithms

KINEMATICS 어떤 물체의 운동 상태는 다음과 같이 표현 할 수 있다. public struct Kinematic { public Vector3 position; public float orientation; // x-z 평면에서 +z축으로부터 시계방향 각도. public Vector3 velocity; public float rotation; //각속도 } 그러나 이거 가지고 운동을 표현하기는 조금 어색한데, 가속도의 개념이 빠져있기 때문이다. 따라서 외부에서의 힘(가속도)는 다음과 같이 표현할 수 있다. public struct SteeringOutput { public Vector3 linear; // 가속도 public float angular; // 가속도(각) } 이걸로 운동 상태를 업데..

Game AI 2021.06.13

클린 코드 - 경계

개발을 하다 보면 외부 코드 (구매한 패키지, 오픈 소스, 다른 팀이 개발한 컴포넌트 등) 를 사용할 일이 있다. 이 장에서는 이런 외부코드를 깔끔하게 사용하는 법에 대해 다룬다. 외부 코드 사용 외부 인터페이스를 사용할 때는 해당 인터페이스를 사용하는 클래스 밖으로 인터페이스가 노출되지 않도록 해야한다. 만약 그렇지 않다면 다음과 같은 문제가 생긴다. 만약 외부 인터페이스의 메서드들이 모두 노출된 상태에서 사용한다면, 누군가 의도치 않은 메서드를 사용하여 예기치 않은 문제를 발생시킬 수 있다. 외부 인터페이스가 변할 경우, 메서드를 사용한 코드를 모두 수정해야 한다. 따라서 외부 코드를 새로운 클래스로 감싸거나 Adaptor 패턴을 이용하면 좋다. 이 경우 인터페이스에 변경이 발생해도 해당 클래스만 수..

이론/설계 2021.06.13

게임 AI의 구현

때로는 단순하게 복잡한 게임 AI가 꼭 좋은 AI는 아니다. 복잡한 AI는 생각하는 대로 구현하기 힘들고 예상치 못한 버그도 많이 생긴다. 단순한게 좋은 예 팩맨의 사례를 보자. 팩맨에는 4가지 유령이 존재한다. 각 유령의 타겟은 다음과 같다. Blinky(빨강) : 플레이어의 위치를 쫓아감 Pinky(핑크색) : 플레이어가 보는 방향의 사각형 4칸을 쫓아감. Inky(청록색) : 플레이어와의 거리를 사용하여 쫓아감 Clyde(주황색) : 플레이어가 멀면 플레이어를 쫓아가고, 가까우면 게임 맵의 구석으로 감. 유령들의 목적지를 정하는 코드는 한두줄이면 된다. 그러나 이런 4가지의 간단한 AI들이 합쳐져 플레이어에게 훌륭한 경험을 제공한다. 그 예로 팩맨을 리뷰하는 플레이어들은 유령들이 자신에게 덫을 놓고..

Game AI 2021.05.31

게임 AI의 모델

모델 게임 AI의 모델은 여러 가지가 있다. 아래 그림은 그 중 한 가지 예이다. 이 모델에서는 AI의 작업을 세 가지로 나눈다. 이동 의사결정 전략 그러나 모든 AI가 위 세가지 요소를 사용하는 것은 아니다. 예를 들어, 체스와 같은 경우는 오직 전략만 사용한다. 반면에, 슈퍼 마리오 의 AI같은 경우에 전략은 없다. 이동 이동 알고리즘은 단순히 특정 위치로 이동하는 것이 아니라 장애물이나 방(통로)과 같은 공간을 이동하는 행위도 포함된다. 의사 결정(Decision making) 의사 결정은 캐릭터가 다음에 뭘 할지를 정하는 행위이다. 공격, 가만히 있기, 순찰, 탐험, 숨기 등등이 모두 포함된다. 몇몇 결정은 이동 AI가 필요한데, 예를 들어 근접 공격을 하는 경우 공격 대상에게 이동을 먼저 해야 ..

Game AI 2021.05.24

클린코드 7장 - 오류 처리

깔끔한 오류 처리는 중요하다 여기 저기 흩어진 오류 처리 코드 때문에 코드의 가독성이 떨어질 수 있기 때문이다. 오류 코드보다 예외 예외처리가 아닌 오류 처리는 기본적으로 if,else 분기를 타며 Debug.Log(...)를 하는 코드이다. 그러나 이런식으로 쓰면 논리가 오류 처리 코드와 뒤섞여 알아보기 힘들다. 그러나 예외를 사용하면 이를 구분할 수 있다. 단, 앞 장에서 말했듯, 오류 처리도 '한 가지 일'이다. 오류를 처리하는 알고리즘은 분리해야 한다. public void DoSomething() { try { TryDoSomething(); } catch (Exception e) { } } Try-Catch-Finally 부터 작성해라 별 이유는 아니고 이렇게 하면 자연스럽게 try 블록의 트..

이론/설계 2021.05.21