2011년 10월 24일 월요일

ASO remake #8 - SW 스프라이트

사실, ASO 리메이크를 시작하면서 SW 스프라이트를 계획했었습니다.

느리게 움직이는 지상 유닛들은 가능하면 비트맵의 깔끔한 그래픽으로 보여주고 싶었지용... ㅎ.ㅎ

 

이걸 지난 주말에서야 구현해서 테스트를 해보았는데요.

60프레임으로 진행되는 게임에서 유닛 여러개 그려넣는데 부하가 심하네요. ㅎ.ㅎ

 

근데, 원본 게임을 자세히 보니, 지상 유닛이 2프레임에 1도트 움직이고 있더군요.

홀짝 프레임에 맞춰서 유닛들은 반반 나눠 처리하면 VDP 부하를 줄일수 있었지요. ㅋ

 

움직이는 지상 유닛 없을때, CPU IDLE 구간을 보면...

 

1. 공중 유닛이 없을때: 약 40%

2. 공중 유닛이 있을때: 약 30%

정도 됩니다. 

 

이 상태에서, 지상 유닛이 5개 정도 등장하면 거의 IDLE 구간이 0%가 되네요.

겨우 ASO 가 구현될만한 수준이었습니다. 흐...

 

 

여기서 ASO에서 구현된 지상군 SW 스프라이트는 아래 처럼 처리됩니다.

 

기본적으로 배경 화면은 스크린5의 페이지 한장에 그려지고,

그려진 배경을 다시 복구(유닛으로 덧칠된 부분 복구)하기 위해 다른 페이지 하나에 깨끗한 배경 화면이 또 있습니다.

 

실제 ASO에서는 페이지1이 보여주는 화면이 되고, 페이지2가 원본 배경 화면입니다.

참고로 페이지0 에는 스프라이트 패턴이랑 STATUS 창(에너지 미터 등등)이 그려지고,

페이지3은 배경 화면용 맵 타일 그래픽이 존재합니다.

 

 

원래 SW 스프라이트는 원본 배경에 유닛 비트맵을 덮어 씌우게 되는데,

이때 원본 배경이 복구 된 후 유닛 비트맵이 그려지는 순간이 순차적으로 보이게 되면

유닛이 깜박이는 것 처럼 보이게 됩니다.

 

이걸 해결하려면,

1. 배경 전체를 더블 버퍼링.

2. 유닛이 다시 그려질 부분만 다른 페이지에 미리 그린 후, 복구될 배경과 함께 원본 배경에 덮어 그려줌.

3. VDP에서 현재 출력 스캔라인과 유닛 그려질 라인이 만나지 않도록 조절해서 처리.

하면 됩니다.

 

근데 60프레임 슈팅겜에서 전체 더블 버퍼링은 속도상 불가능하겠고요.

(ASO에서 지상 유닛은 30프레임 업데이트이긴 하지만, 이것도 힘들겠지요. ㅋ)

 

VDP의 출력 스캔라인을 비켜 가려면,

 그려질 비트맵의 수직 위치랑 현재 스캔라인 간 차이가 많이 나도록 하면 됩니다.

 V-blank 구간에서 비트맵을 그리면 가장 안전하지만, 짧은 구간에 많이 그리진 못하겠지요.

 

참고로, V-blank 구간은 아래처럼 됩니다. (ASO는 60Hz 오버스캔 240라인 모드입니다. )

 

V sync 60Hz 출력일때 

 수직 192 해상도 V-blank 구간: 262 - 192 = 70 라인

 수직 212 해상도 V-blank 구간: 262 - 212 = 50 라인

 오버스캔 모드의 V-blank 구간: 262 - 240 = 22 라인

 

V sync 50Hz 출력일때 

 수직 192 해상도 V-blank 구간: 312 - 192 = 120 라인

 수직 212 해상도 V-blank 구간: 312 - 212 = 100 라인

 오버스캔 모드의 V-blank 구간: 312 - 240 = 72 라인

 

여담이지만, 25프레임 등의 애니메이션을 구현한다면 50Hz 모드가 훨씬 여유가 있다는걸 볼수 있어요.

(더블 버퍼링을 안하는 경우에 한해서...ㅎ.ㅎㅋ)

 

 

그럼, ASO에서는 어떻게 할까요?

 

처음엔 2번의 배경과 유닛 비트맵을 미리 계산(페이지 0 활용)해서 그려보았는데,

비트맵 세번 복사 하는데 시간이 꽤 걸려서 사용이 힘들더군요.

1. 별도 페이지에 원본 배경 복사 (복구될 영역과 유닛 이동 후의 영역만큼 18 x 18 사이즈)

2. VDP의 논리연산 COPY를 써서 배경에 유닛을 덮어씌움 (투명색은 배경이 그대로 보이겠죠?)

3. 완성된 비트맵을 실제 배경 페이지에 복사

 

최종으론, 3번 방법처럼 적절하게 VDP의 스캔라인과 그리는 부분이 겹치지 않게 처리하고 있습니다.

이 경우는 비트맵 두번만 복사하면 되서 1.5배 빠릅니다.

1. 원본 배경을 원본 페이지에 바로 복사(복구)

2. 새로운 위치에 유닛 비트맵 논리연산 COPY

 

지상 유닛은 한 프레임 처리에서 가장 마지막에 이루어집니다.

VDP의 라인인터럽트를 이용해서 스캔라인이 화면 아래쪽에 도달하면, 게임의 한프레임 처리가 시작되는데요.

이것 저것 다 끝내면, 스캔라인이 화면 중앙정도에 옵니다. 남은 CPU 시간이 반정도 남은거지요.

 

이때 지상 유닛을 처리하면서 화면에 다시 그리게 되면,

화면 아래쪽에 나타나는 경우가 아니라면, 눈으로 깜박임을 느낄수 없게 됩니다.

 

글로만 쓰니까, 잘 이해안되실수도 있겠습니다. ㅎ.ㅎ;;

 

암튼, 실제 구현해보니, 지상 유닛이 화면 하단 1/3 정도에선 깜빡이지만, 전체적으로 쓸만했습니다.

뻥 좀 보태면, 거의 원본 ASO의 유닛 움직임과 흡사합니다. ㅋ 

 

유닛의 수직 위치를 소팅해서 스캐라인과 잘 어긋나도록 그리면, 깜박이는 경계선을 더 낮출 수 있을 것 같네요.

이번 주중에 완료해서 동영상으로 보여드리겠습니다~

 

가능하면, 중간 보스도 등장 할 예정...


댓글 없음:

댓글 쓰기