개요
바이트 코드 패턴은 특정 행동을 바이트 명령어로 정의하여 사용하는 패턴이다. 마법 시스템을 정의한다고 할 때 targetHP수정, TargetPosition 수정 등의 명령어들을 정의해두고 일련의 바이트 코드 하나를 마법으로 사용하는 식이다. 여기서 더 나아가 스택 머신과 그에 따른 명령어들을 추가하여 프로그래밍 언어처럼 각종 값 저장과 연산들을 사용할 수도 있다. 일련의 명령어는 한 명령어를 한 바이트로 표현하여 바이트 배열로 표현 할 수 있다. 즉 한 바이트 배열이 하나의 마법처럼 사용 될 수 있다. 또한 스택에 데이터를 삽입하는 리터럴 명령어 뒤의 바이트는 명령어가 아닌 삽입할 숫자 리터럴을 나타낸다.
이렇게 바이트 배열로 마법을 정의하는 시스템을 만들었으면 기획자나 담당자가 스킬을 만들어낼 수 있도록 해주어야한다. 이러한 바이트 배열로 스킬을 만들도록 하는 것은 효율적이지 않다. 따라서 GUI나 고수준 텍스트 코드에서 우리가 정의한 바이트 배열로 변환할 수 있는 툴을 만들어줘야 할 것이다. 여기서 고수준 텍스트 코드를 바이트 배열로 변환하는 것은 컴파일러를 만드는 기법과 유사할 것이다.
스택 머신
스택 머신 바이트 코드는 다음과 같이 만든다. 한 명령어는 한 바이트로 정의된다. 그리고 리터럴 명령어는 스택에 자신의 다음 칸에 있는 바이트를 넣는 특별한 명령어이다. 리터럴 명령어는 수행 후 바이트를 한 칸더 건너뛰어 다음 명령어를 처리하도록 한다. 나머지 명령어는 스택에 쌓인 숫자를 원하는 만큼 pop하여 매개변수로 사용하고 처리한다. 원한다면 자신의 리턴값을 스택에 넣는다. 스택의 최상위 두 숫자를 빼고 더한뒤 다시 집어넣는 식으로 더하기 같은 연산 명령어도 만들 수 있다. 처리할 명령어 인덱스를 수정함으로써 jump명령어도 만들 수 있다. 이를 통해 다양한 기능을 구현해낼 수 있다.
스택의 데이터
위에서는 스택에 숫자만 들어가는 것으로 이야기했다. 하지만 더 많은 기능을 구현하려면 문자열같은 추가적인 데이터를 넣고 싶을 수도 있다. 그럴땐 다음과 같이 하면 된다.
태그붙은 데이터: 데이터에 태그와 union을 사용한다.
태그가 없는 공용체: 태그없이 union만 사용하고 타입은 명령어 셋에서 알아서 잘 구분하여 사용한다.
객체 지향 활용: 자신의 타입을 리턴하고 값을 리턴하는 virutal함수를 가진 객체로 값을 처리한다.
위 방식에서 책의 저자는 2는 안정적이지 못하고 3은 오버헤드가 크기에 1번을 추천한다. 그리고 왠만해선 한가지 타입만 쓸수 있도록 하는게 좋다고 한다.
참고서적
게임 프로그래밍 패턴
'디자인 패턴 > 게임 프로그래밍 패턴' 카테고리의 다른 글
[게임 프로그래밍 패턴][13]타입 객체 (0) | 2024.04.30 |
---|---|
[게임 프로그래밍 패턴][12]하위 클래스 샌드박스 (0) | 2024.04.29 |
[게임 프로그래밍 패턴][10]업데이트 메서드 (0) | 2024.04.28 |
[게임 프로그래밍 패턴][9]게임 루프 (0) | 2024.04.28 |
[게임 프로그래밍 패턴][8]이중 버퍼 (0) | 2024.04.26 |