( 유머러스 한 정신적 이미지 외에 다른 것이 없다면 "원숭이 패치"또는 "덕 펀치" 라는 용어를 알고 싶을 수도 있습니다 .)
이를 제외하고 : 목표가 "동작"변경에 대한 반복 시간을 줄이는 경우 대부분의 방식으로 접근 할 수있는 몇 가지 접근 방식을 시도해보고 앞으로 더 많은 기능을 구현할 수 있습니다.
(이것은 약간의 접선에서 나올 것이지만, 나는 그것이 돌아올 것이라고 약속합니다!)
- data로 시작하여 작게 시작합니다. 경계에서 다시로드 ( "레벨"등) 한 다음 OS 기능을 사용하여 파일 변경 알림을 받거나 정기적으로 폴링 합니다.
- (보너스 포인트 및로드 시간 단축 (다시 반복 시간 감소)은 데이터 베이킹을 참조하십시오 .)
- 스크립트는 data 이며 동작을 반복 할 수 있습니다. 스크립팅 언어를 사용하는 경우 이제 해석 또는 컴파일 된 스크립트를 다시로드 할 수있는 알림 / 기능이 있습니다. 런타임 유연성을 높이기 위해 인터프리터를 게임 내 콘솔, 네트워크 소켓 등에 연결할 수도 있습니다.
- 코드도 데이터 일 수 있습니다 . 컴파일러는 오버레이 , 공유 라이브러리, DLL 등을 지원할 수 있습니다 . 이제 수동 또는 자동으로 오버레이 또는 DLL을 언로드 및 재로드하는 "안전한"시간을 선택할 수 있습니다. 다른 답변은 여기에 자세히 설명되어 있습니다. 이것의 일부 변형은 암호화 서명 vecification, NX (no-execute) 비트 또는 유사한 보안 메커니즘을 망칠 수 있습니다 .
- 깊은 버전의 저장 /로드 시스템을 고려하십시오 . 코드 변경에도 불구하고 상태를 강력하게 저장하고 복원 할 수 있다면 게임을 종료하고 정확히 같은 시점에 새로운 논리로 다시 시작할 수 있습니다. 말보다 쉽지만, 가능하지만 명령을 변경하기 위해 메모리를 파는 것보다 훨씬 쉽고 이식성이 뛰어납니다.
- 게임의 구조와 결정에 따라 기록 및 재생 이 가능할 수 있습니다 . 해당 레코딩이 "게임 명령"(예 : 카드 게임을 생각하는 것) 위에있는 경우 원하는 모든 렌더링 코드를 변경하고 레코딩을 재생하여 변경 사항을 볼 수 있습니다. 일부 게임의 경우 시작 매개 변수 (예 : 임의의 시드)를 기록한 다음 사용자 작업을 기록하는 것만큼이나 "쉽습니다". 어떤 경우에는 훨씬 더 복잡합니다.
- 컴파일 시간 을 줄이기 위해 노력하십시오 . 위에서 언급 한 저장 /로드 또는 레코드 / 재생 시스템 또는 오버레이 또는 DLL과 함께 사용하면 다른 것보다 처리 시간이 줄어들 수 있습니다.
이러한 점 중 많은 부분은 데이터 나 코드를 다시로드하지 않아도 도움이됩니다.
일화 지원 :
대규모 PC RTS (~ 120 명 팀, 주로 C ++)에는 적어도 세 가지 목적으로 사용되는 매우 깊은 상태 절약 시스템이있었습니다.
- 멀티 플레이어 게임이 10-30 프레임마다 하나의 CRC를 잠금 단계 시뮬레이션으로 유지하기 위해 "얕은"저장이 디스크가 아닌 CRC 엔진에 공급되었습니다. 이것은 아무도 속이지 않았 음을 확인하고 몇 프레임 후에 비동기 버그를 잡았습니다.
- 멀티 플레이어 비동기 버그가 발생하면 매 프레임마다 추가 저장이 수행되고 CRC 엔진에 다시 공급되지만 이번에는 CRC 엔진이 더 작은 바이트 배치에 대해 많은 CRC를 생성합니다. 이러한 방식으로, 마지막 프레임 내에서 어느 부분의 상태가 분기되기 시작했는지 정확하게 알 수 있습니다. 우리는 이것을 사용하여 AMD와 인텔 프로세서 사이에 "기본 부동 소수점 모드"라는 큰 차이를 발견했습니다.
- 일반적인 깊이 저장은 예를 들어 유닛이 재생 한 정확한 애니메이션 프레임을 저장하지 않을 수 있지만, 모든 유닛의 위치, 체력 등을 가져 와서 게임 플레이 중 언제든지 저장하고 다시 시작할 수 있습니다.
그 후 DS의 C ++ 및 Lua 카드 게임에서 결정적인 레코드 / 재생을 사용했습니다. 우리는 AI (C ++ 측)를 위해 설계된 API에 연결하고 모든 사용자 및 AI 작업을 기록했습니다. 이 기능은 게임에서 (플레이어에게 재생을 제공하기 위해) 사용했지만 문제를 진단하는 데에도 사용되었습니다. 충돌이나 이상한 동작이있을 때 저장 파일을 가져와 디버그 빌드에서 재생하기 만하면됩니다.
또한 오버레이를 몇 번 이상 사용했으며,이 디렉토리를 "이 디렉토리를 자동으로 스파이더 링하고 핸드 헬드에 새 컨텐츠를 업로드"시스템과 결합했습니다. 컷씬 / 레벨 / 무엇이든 그대로두고 다시 돌아 오는 것만으로도 새로운 데이터 (스프라이트, 레벨 레이아웃 등)뿐만 아니라 오버레이에 새로운 코드도로드됩니다. 불행히도 코드를 특수하게 처리하는 복제 방지 및 해킹 방지 메커니즘으로 인해 최신 핸드 헬드에서는 훨씬 어려워지고 있습니다. 우리는 여전히 루아 스크립트를 위해 그것을합니다.
마지막으로, 명령 opcode를 직접 패치하여 약간의 오리 펀치를 할 수 있습니다. 이것은 고정 플랫폼과 컴파일러를 사용하는 경우 가장 효과적이며, 유지 관리가 거의 불가능하고 버그가 발생하기 쉽고 빠르게 달성 할 수있는 작업이 제한되어 있기 때문에 디버깅하는 동안 코드를 다시 라우팅하는 데만 사용됩니다. 그것은 수행 하지만, 당신에게 서둘러 당신의 명령 세트 아키텍처에 대한 많은의 지옥을 가르칩니다.