RPG 2003까지는 BGM, SE 2종류밖에 없으므로 패스; 파일 형식은 mid, mp3(이상 BGM만, VBR 미지원), wav만 지원
RPG XP 이후:
BGM:ME와 동시재생 불가능, 무한루프
BGS:ME와 동시재생 가능, 무한루프
BGM, BGS 간 동시재생 가능
ME:한번만 재생, BGM 재생중에 ME 재생시 재생 중이던 BGM을 일시정지시키고 대신 재생된다. ME의 재생이 끝나면 ME를 재생하기 직전에 일시정지시켰던 BGM이 중단지점부터 다시 재생된다.
SE:효과음. BGM, BGS, ME와 동시재생 가능
지원하는 파일 형식(스팀판 기준):flac, mp3, ogg(rgss2(RPG VX) 이후 스트리밍 및 loopstart+looplength를 이용한 브금 구간반복 가능), wav, wma, mid(BGM/ME전용)


MV부터는 여기서 지원하는 확장자만 다르다(OGG, M4A 파일만 지원, MZ에서 M4A 지원 제거)


어떤 BGM을 루프 없이 한 번만 재생시킬거라면
그 BGM을 ME 폴더에 넣은 뒤 재생하던 BGM을 정지시키고 ME폴더에 넣은 재생할 BGM을 재생시킨다.(BGM은 무조건 무한루프만 됨)

'기타 > 알만툴 뻘팁' 카테고리의 다른 글

(XP)뚝배기의 묘화  (0) 2018.07.07
by SHOOTING_STAR 2026. 1. 25. 08:00

이 게임은 스트라이커즈 1945 시리즈 중 유일하게 네오지오로 나온 게임으로, 전작들은 자체기판으로 돌아갔다. 그런데 네오지오는 본작 출시당시 출시 9년차에 접어든 다른 기기였으면 황혼기를 지나고도 한참 되었을 시기인데, 이 때문에 성능상 한계가 많았다.
우선 그래픽: 네오지오는 스프라이트 하나당 최대 16색만 지원하며, 이는 스트라이커즈 1945 2 이후에 쓰인 자체기판의 최대 256색에 비해 대략 16배정도 감소한 수치이다. 이때문에 네오지오에서 16색 이상의 그래픽을 표현하기 위해서는 스프라이트 위에 또 다른 스프라이트를 겹치는 방법을 사용해야 하지만 이 방법 또한 스프라이트의 최대 갯수(16x16-512 380개, 자체기판은 16-256x16-256 최대 896개. 이건 자잘한 스프라이트가 많이 필요한 상황에서 약점이 된다.)가 그만큼 줄어든다는 문제도 있고, 32색 이상을 표현해야 할 경우 255색 스프라이트 하나를 까는 것보다 표현 가능한 총 색상수에 비해 용량이 낭비된다는 문제가 있다. (256색(8비트) 스프라이트 1개(256색) = 8비트 vs 16색(4비트) 스프라이트 3개(48색) = 12비트) 대신 네오지오의 스프라이트는 각 타일 단위로 색을 바꿀 수 있어 잘만 활용하면 그럴싸하게 보일 수 있기는 하다. 하지만 알파 블렌딩을 네오지오에서는 아예 지원 자체를 안하므로 이 부분에 해당하는 요소는 어쩔 수 없이 빠졌다.
또 하나는 CPU. 자체기판에 달린 28.64MHz짜리 SH2에 비해 한세대 전급 성능을 가진 12MHz짜리 68000을 사용하며, 이는 성능 확보를 이유로 많은 부분을 희생시키는 원인이 되었다. 매 스테이지가 진행되는 동안 색상표를 바꾸지 않는다던가, 하드웨어적 확대/축소를 전혀 사용하지 않고 일일이 확대/축소된 스프라이트를 그래픽 ROM에 저장해놓고 필요할 때마다 바꿔쓴다던가, 일부 스프라이트의 크기가 줄어들었다던가, 탄속의 가,감속을 없앴다던가 하는 게 있다. 그럼에도 불구하고 화면에 너무 많은 오브젝트가 깔리면 간혈적으로 느려지기도 한다.
그나마 사운드는 Z80으로 따로 처리되는데, 이는 통짜 사운드 샘플을 재생, 반복하는 식으로 음악 루틴을 구성한 것을 빼면 사이쿄 초기 건버드에 쓴 것과 동일한 계열(Z80 계열 + YM2610 조합)을 사용한다. 이 경우 CPU 처리량을 줄일 수 있지만 반대로 각 샘플의 길이와 주파수만큼 ROM 용량이 늘어나는 부작용이 있다.
그 결과물은 그래픽 ROM 도합 64MB(512메가비트), 프로그램 ROM 도합 5MB(40메가비트), 샘플 ROM 도합 16MB(128메가비트)이 달린 카트리지에 담겨서 나왔으며, 이는 네오지오로 나온 모든 게임 중에서도 손꼽히게 많은 용량을 사용한 것이다. 이는 전작들보다 많은 용량이기도 하며, 대부분은 그래픽 위에 깔릴 그래픽용으로 할당되었으리라 짐작할 수 있다.
게임 자체는 나쁘지 않고, 시스템적으로 바뀐 부분도 존재하며, 전반적으로 1945 2에 기반하지만 상기한 이유로 스테이지 구성이나 심지어 나오는 보스도 바뀐 부분이 존재한다.

'기타' 카테고리의 다른 글

복합 동기 (Composite sync)  (0) 2026.01.12
WAD 포맷  (0) 2026.01.08
라인 버퍼 스프라이트의 구현에 대한 글  (0) 2025.12.27
뻘글  (1) 2025.12.22
프레임버퍼 방식 그래픽과 라인버퍼 방식 그래픽의 지연 시간  (0) 2025.12.18
by SHOOTING_STAR 2026. 1. 13. 13:04

LZSS with Literal copy command
기반이 되는 LZSS 압축 알고리즘은 LZ77의 개량형으로, 압축이 필요하지 않은 부분(압축을 했을 때 오히려 압축 전보다 크기가 늘어나는 부분)은 단일 문자로 저장하도록 개선되었다. 이를 이진 파일에 적용할 경우, 단일 문자/오프셋, 길이 형식 토큰 여부를 설정하는 비트를 읽고 검사함으로써 이를 달성할 수 있다.
나는 여기에 더해 첫 바이트에 압축 여부 비트에 더해 문자의 갯수를 결정하는 비트를 추가함으로써 긴 비압축 문자의 표현을 효율적으로 할 수 있도록 하는 LZSS 알고리즘의 변형을 구상했다.
이것이 LZSSL 알고리즘이라 부르는 알고리즘이다.
이 알고리즘으로 압축한 결과물은 바이트 단위로 정렬되어 비트 단위 접근이 필요하지 않으며, 1비트 검사 비트가 첫 바이트의 최상위 비트에 할당되어 있고, 나머지 비트는 검사 비트의 결과에 따라 출력할 문자의 갯수 또는 복사할 문자의 갯수 + 복사할 문자의 위치의 최상위 비트들이 따라온다. (이 경우 다음 바이트는 이 위치의 하위 비트로 할당된다.)
이를 '토큰'이라 하며, 압축 결과물은 모두 토큰으로 구성되어 있다. 토큰의 구조는 다음과 같다.
- 첫 바이트의 최상위 비트: 검사 비트
- 검사 비트가 1(비압축 문자의 배열)인 경우, 나머지 7개 비트는 출력할 문자의 갯수를 의미한다. 이후 이 비트값 +1 만큼의 바이트가 따라오며, 이들은 압축 없이 출력할 일련의 문자를 의미한다. 또한 이들 문자는 슬라이딩 윈도우의 끝부분에 하나씩 저장된다.
- 검사 비트가 0(문자열 복사)인 경우, 뒤의 4비트는 복사할 문자열의 길이 + 3, 나머지 3비트는 복사할 문자열의 위치의 상위 3비트에 할당되며, 다음에 오는 바이트는 복사할 문자열의 위치의 하위 8비트에 할당된다. 이들 정보를 가지고 슬라이딩 윈도우에 있는 문자들을 복사해 출력한다.
- 따라서 본 알고리즘에서 사용하는 슬라이딩 윈도우의 크기는 2KiB(2의 11승)이다.
슬라이딩 윈도우는 처음에는 모두 0으로 초기화되어 0값의 배열로 시작하는 파일에 대한 압축 효율성에 도모한다.

또한 이 알고리즘의 변형으로 가변 길이 바이트 토큰을 사용하는 것도 있는데, 이는 각각 출력할 문자의 개수와 복사할 문자의 위치 값의 최상위 비트를 이들의 가변 바이트 플래그로 전용하여 더 큰 파일에 대한 압축 효율성을 꾀한다. 다만 이 변형은 파일이 어느정도 이상 클 경우에만 최대한의 효과를 발휘한다.

다음은 이 알고리즘을 ANSI C로 구현한 구현체이며, 기존에 존재하는 LZSS의 ANSI C 구현체의 포크임과 동시에 개조판이다.

https://github.com/cam900/lzss/tree/lzss_literal

GitHub - cam900/lzss: lzss: An ANSI C implementation of the LZSS compression algorithm

lzss: An ANSI C implementation of the LZSS compression algorithm - cam900/lzss

github.com


by SHOOTING_STAR 2026. 1. 12. 12:17

복합 동기 (Composite sync)는 옛날 패미컴 시절부터 사용되었던 유서깊은 방식으로, 수직 동기 (VSync) 신호와 수평 동기 (HSync) 신호를 한 신호에 합성해 출력하는 것을 의미하고, 이 과정에는 주로 XNOR 게이트가 사용된다. 흔히 말하는 컴포지트 비디오는 이 신호에 더해 색상 신호 등을 한 신호에 합성한 방식이다.
유럽에서 주로 사용된 SCART 규격에는 채널별 색상 출력과 복합 동기 출력이 존재하며, 추가로 사운드 출력 핀이 달려있어 비디오/사운드를 한 단자로 해결되게 해놓았다.
일본의 RGB21 규격 역시 SCART 규격과 같은 단자를 사용하나 핀 배치가 다르다.
오락실 모니터 역시 VGA D-Sub 시대 이전까지는 SCART 규격처럼 채널별 색상 출력과 복합 동기 출력을 사용했으며, 이는 구 JAMMA 규격의 비디오 부분에 해당한다. JAMMA VIDEO STANDARD(JVS) 규격은 모니터에 따라 VGA D-Sub를 그대로 사용하거나 수평 동기 출력 부분을 복합 동기 출력으로 바꾼 방식이 존재하며, 하드웨어에 따라서는 이를 선택할 수 있게 해놓은 것도 있다.

by SHOOTING_STAR 2026. 1. 12. 02:10

WAD포맷은 여러 종류. 여러 개의 데이터(포맷 내에서 "Lump"라 불림)를 담을 수 있는 아카이빙 포맷의 일종으로써 둠을 개발한 이드 소프트웨어에서 개발한 포맷이다.
크게 헤더, 데이터 영역, 목록 영역으로 구성되어 있으며, 각각의 영역은 다음 데이터를 포함한다:
- 헤더: 4글자의 시그니처 데이터(IWAD. PWAD), 데이터의 갯수와 데이터 목록 영역의 위치
- 데이터 영역: 실제 데이터
- 목록 영역: 각 데이터들의 정보(위치, 크기, 이름(ASCII 포맷 최대 8글자))를 저장한 일련의 목록
기술적으로 목록 영역은 파일의 아무데나 위치할 수 있으나, 거의 모든 경우 데이터 영역의 끝 바로 뒤에 위치한다.
이런 구조상 이 포맷을 불러올 때는 파일을 열되, 그 내용은 필요한 것만 그때그때 메모리에 불러오고(항시 사용되는 목록 영역은 파일이 사용되는 동안 메모리에 항상 존재해야 함) 불필요하면 메모리에서 해제하는 방법이 효율적이다. 열린 파일 또한 프로그램 종료 시 같이 닫아야 한다.
이 포맷의 가능한 개선점 또한 존재하는데, 다음과 같다:
- 8글자 이상의 데이터 이름
- 64비트 데이터/영역 위치/크기, 데이터 갯수 (기존은 32비트)
- 파일이나 각 데이터의 체크섬 데이터
- 데이터 암호화 또는 압축 기능
- 파일의 전체 크기를 저장한 데이터
이 포맷을 만든 이드 소프트웨어 역시 얼마 뒤에는 PK7 포맷으로 갈아탔는데, 이는 ZIP 포맷 기반이다.

by SHOOTING_STAR 2026. 1. 8. 12:38

게임메이커 스튜디오 2에서 실행할 오브젝트와 같은 depth값을 가진 오브젝트를 instance_create_depth 함수로 생성했을 때, 그리기 순서가 이상한 문제가 있다.
원래라면 depth 값이 같은 경우 나중에 그려진 오브젝트일수록 위에 보여야 하는데, 위 함수로 생성하면 depth 값이 같은 경우 나중에 그려진 오브젝트일수록 밑에 보인다는 것이다.
게임메이커 공식 매뉴얼에 따르면 depth 값을 직접 변경할 경우 이는 변경할 depth 값을 가진 임시 레이어를 생성한다는 내용이 있는 것으로 보아 이게 그리기 순서를 꼬이게 만드는 주범으로 추측할 수 있다.
가능한 해결 방법은 현재 오브젝트가 속한 레이어의 id를 구한 값(layer 변수)을 인자로 instance_create_layer 함수를 사용해 오브젝트를 생성하는 방법을 고려할 수 있지만, 확인해보진 못했다.

2026.01.06 수정: instance_create_layer도 동일한 문제가 발생한다.

by SHOOTING_STAR 2026. 1. 6. 06:53

보통 라인 버퍼 스프라이트는 현재 스캔라인에서 현재 Y좌표의 값을 빼거나(양수 = 아래), 더하거나(양수 = 위) 한 값(이 값에 특정 값을 곱하거나 별도의 메모리에서 값을 불러오거나 해서 확대/축소를 구현하기도 한다.)을 그래픽의 높이값과 검사해서 높이값 안에 들면 그리는 과정(또한 원본 스프라이트의 그래픽의 Y좌표를 이 값으로 한다)이 있는데, 이 과정을 한 스캔라인 전에 미리 하고 결과값을 다음 스캔라인에 표시하고, 스캔라인 표시가 끝날 때마다 그릴 버퍼와 표시할 버퍼를 교체하는 것을 반복하면 더블 버퍼링이 된다.(예: 네오지오)
이건 입력렉 감소(프레임버퍼엔 일단 그리고 한 프레임이 다 그려진 다음에야 표시 가능하며 이 과정에서 필연적인 입력렉 발생)나 원가절감(외부 프레임버퍼가 불필요한게 이유. 보통 이 목적으로 사용.)을 이유로 이걸 구현한 게 많다.
스프라이트라는 개념이 잡히고 90년대 초중반까지 스프라이트 하드웨어는 일부를 제외하면 죄다 라인 버퍼 기반인데, 이 당시엔 메모리값이 금값이었기 때문이었다.

 

구현예 (매 스캔라인마다 반복):

// 그래픽 데이터의 Y 좌표 구하기
// srcy = 그래픽 데이터의 Y 좌표
// scanline = 현재 스캔라인
// ypos = Y 좌표 원점값

// Y 좌표 양수가 위인 경우
s32 srcy = s16(scanline + ypos);
// Y 좌표 양수가 아래인 경우
s32 srcy = s16(scanline - ypos);

// 확대/축소 기능 추가 예시:
// yzoom = 상하 확대/축소 값
// zoom_frac = 확대/축소 값의 우측 논리 시프트 (고정 소수점의 정수에 해당)
srcy = (srcy * yzoom) >> zoom_frac;

// 원본 그래픽 데이터의 높이와 검사
// height = 원본 그래픽 데이터의 높이값
if ((srcy < 0) && (srcy >= height))
	return;

// 상하 뒤집기
// flipy = 상하 뒤집기 플래그
if (flipy)
	srcy = height - srcy - 1;

// 라인버퍼에 그리기
// cx = X 좌표 카운터
// dstx = 그릴 X 좌표값
// xpos = X 좌표 원점값
// xf = X 좌표의 소수
// srcx = 그래픽 데이터의 X좌표
// flipx = 좌우 뒤집기 플래그
// width = 원본 그래픽 데이터의 너비값
// pixel = 그래픽 데이터의 픽셀
// xzoom = 좌우 확대/축소 값
// screen_width = 화면의 너비값
// transpen = 픽셀의 투명값 (보통 처음이나 끝)
// color = 스프라이트의 색상 인덱스
// granularity = 색상 인덱스에 곱할 값 (2의 승수)
for (int cx = 0, dstx = xpos, xf = 0, srcx = (flipx ? (width - 1) : 0); cx < width; cx++, srcx += (flipx ? -1 : 1))
{
	// 픽셀 구하기
    // m_get_pixel(그래픽 데이터의 X 좌표, Y 좌표);
	u8 pixel = m_get_pixel(srcx, srcy);
    // 그릴 좌표값 증감
	xf += xzoom;
    while (xf >= (1 << zoom_frac))
    {
    	// 그릴 좌표값, 픽셀의 투명 여부 검사 후 그리기
    	// m_linebuffer_draw(그릴 X 좌표, 색상값);
    	if ((dstx >= 0) && (dstx < screen_width) && (pixel != transpen))
    		m_linebuffer_draw(dstx, (color * granularity) + pixel);
        dstx++;
    	xf -= 1 << zoom_frac;
    }
}

'기타' 카테고리의 다른 글

복합 동기 (Composite sync)  (0) 2026.01.12
WAD 포맷  (0) 2026.01.08
뻘글  (1) 2025.12.22
프레임버퍼 방식 그래픽과 라인버퍼 방식 그래픽의 지연 시간  (0) 2025.12.18
정확한 파이값을 구하는 함수  (0) 2025.12.17
by SHOOTING_STAR 2025. 12. 27. 11:49

뻘글

진정 경유차, 궁극적으로 내연기관차를 규제하려면 이래야 한다:
1. 각 주유소의 경유값은 고급휘발유값과 같거나 10% 이상 비싸게
2. 배출가스 등급제 기준 점진적으로 상향조정, 내연기관이 달린 모든 차에 대해 저공해인증과 배출가스 1등급 폐지 (최대 2등급), 기존 저공해인증을 받았던 모든 내연기관차에 대해 저공해인증 말소
3. 모든 배출가스 3등급 이하 차량 소유자에 대해 소유 댓수당 환경개선부담금 부과(누적)
4. 전국 녹색교통지역에 배출가스 4등급 이하 차량 운행 전면 금지, 위반 시 처벌
5. 모든 배출가스 5등급 차량 소유자에 대해 폐차 또는 저공해조치 이행 명령, 위반시 소유권 말소 및 강제폐차 +@
6. 저공해조치는 내연기관과 관련 부품들의 완전 제거 후 저공해(순수전기, 수소전기에 한함) 파워트레인 이식으로 한정
7. 저공해차의 기준 변경. 저공해차에 대해 내연기관 비포함 순수전기차, 수소전기차로 한함
8. 배출가스 규정 점진적으로 강화, 규제 기준은 국제기준 (캘리포니아 배출가스 규정, 유로7 등) 이하로
9. 조기폐차 지원금은 내연기관차 폐차 후 순수전기차, 수소전기차 구매 시에만 지원
10. 경유 규제 강화, 먼저 소형화물차(적재량 1톤 이하 화물차 등)와 소형승합차(12인승 이하), 일반승용차, 이륜차 동력기관의 연료로 사용할 수 없도록 규제
11. 내연기관차 자동차세 (승합차, 화물차 등 고정액 제외) 개정: 차량이 배출하는 오염물질의 총량에 비례해(이산화탄소, 질소산화물, 미세먼지 등을 포함) 기하급수적으로 증가하고, 또 배출가스 등급에 따라 일정 배율 이상 증가하도록 조정
12. 경유차를 휘발유차, 가스차, 저공해차 대신 선택할 메리트 제거

by SHOOTING_STAR 2025. 12. 22. 15:01

유도탄 스크립트를 잘못 만들면 피격이 불가능하게 설정된 오브젝트 주위를 맴도는 현상이 나타나기 쉬운데, 이를 해결하는 방법이 있다.
오브젝트가 피격 가능/불가능 상태 전환 시 마다 투명한 목표물 오브젝트를 생성/삭제하고, 유도탄은 그 목표물 오브젝트만 따라가도록 하는 방법이다.
단, 목표물 오브젝트는 그 부모 오브젝트 당 단 한 개만 존재하여야 하며, 누수를 막기 위해 부모 오브젝트가 삭제되었을 시 같이 삭제하여야만 한다.

  • 1: 목표물 오브젝트를 생성하고, visible 플래그를 체크 해제해 투명하게 한 뒤, 부모 오브젝트의 id를 저장할 변수(기본값: self 즉 자기 자신)를 선언한다.
  • 2: 목표물 오브젝트의 스텝 이벤트에 부모 오브젝트가 자기 자신이 아니면서 부모 오브젝트가 존재하지 않는 경우 자기 자신을 삭제하는 이벤트를 삽입한다.
  • 3: (적, 또는 파괴가능 오브젝트의) 생성 이벤트에 피격 가능/불가능 여부 플래그 변수(이는 오브젝트의 상태 - 이를테면, 화면에 표시됨 여부, 지형 등에 가려짐 여부, 활성화 여부와 파괴 처리됨 여부 등 - 에 따라 변화한다.)와 목표물 오브젝트의 id를 저장할 변수를 선언한다.
  • 4: 정리 이벤트에 목표물 오브젝트가 존재할 시 이를 삭제하는 이벤트를 삽입한다.
  • 5: Begin 스텝 이벤트에 피격 가능일 때 목표물 오브젝트 부재 시 목표물 오브젝트를 생성하는 이벤트를 삽입한다.
  • 6: End 스텝 이벤트에 목표물 오브젝트의 좌표를 자신의 좌표와 동기화하는 이벤트와, 피격 불가능일 때 목표물 오브젝트 존재 시 목표물 오브젝트를 삭제하는 이벤트를 삽입한다.
  • 7: 유도탄 역할을 할 오브젝트는 목표물 오브젝트가 존재하고, 목표물 오브젝트의 부모 오브젝트가 화면에 보일 때만 이를 따라가는 이벤트를 삽입한다.

 

by SHOOTING_STAR 2025. 12. 20. 18:32

보통 라인버퍼 방식의 그래픽 하드웨어가 달린 하드웨어의 입력 지연이 프레임버퍼 방식 그래픽 하드웨어가 달린 하드웨어의 입력 지연보다 짧은 경향이 있는데, 이는 구조적인 차이에서 기인한다. 라인버퍼 방식은 그래픽을 출력할 때 각 주사선 단위로만 출력하면 되므로 필연적으로 발생할 수 밖에 없는 입력 지연이 프레임 단위가 아닌 주사선 단위로만 발생하는데, 프레임버퍼 방식은 프레임버퍼에 한 화면분의 출력할 그래픽이 전부 그려져야 비로소 화면에 출력 가능하고, 이 과정에서 필연적으로 입력 지연이 발생할 수 밖에 없는 구조적 한계점을 가지고 있다.
그러나 이 때 라인버퍼와 프레임버퍼를 혼용하거나, 더블 버퍼링, 트리플 버퍼링의 사용이나 소프트웨어에서 발생하는 입력 지연 등 여러 가지 변수가 발생할 수 있고, 이로 인해 맨 위의 명제가 완전히 참이 아닐 수도 있음을 감안해야 한다.

by SHOOTING_STAR 2025. 12. 18. 20:51