HumanIK 오브젝트 및 메모리 관리

이 섹션에서는 HumanIK 오브젝트의 메모리 사용 및 이러한 오브젝트에서 사용하는 메모리를 관리하는 데 사용할 수 있는 여러 가지 기본 제공 방법에 대해 자세히 설명합니다.

오브젝트 메모리 요구 사항

HumanIK 오브젝트에는 다음과 같은 메모리 요구 사항이 있습니다.

HIKCharacters

HIKCharacter의 크기는 구성에 따라 달라집니다.

  • HIKCharacter의 기본 크기는 9616바이트입니다.
  • HIKCharacter에서 사용하는 각 노드에는 추가 240바이트가 필요합니다.
  • 자유 각도로 구성된 각 노드에는 추가 192바이트가 필요합니다.
  • 부모 오프셋이 있는 각 노드에 자유 각도가 없는 경우 해당 노드에는 추가 48바이트가 필요합니다. 위의 DOF에 지정된 값에는 48바이트 부모 오프셋이 포함되어 있습니다.

HIKCharacterSize() 함수를 호출하여 기존 HIKCharacter의 현재 메모리 크기를 결정할 수 있습니다. 이 함수에는 하나의 인수, 즉 HIKCharacter에 대한 포인터가 필요합니다.

또는 HIKCharacterDefinitionSize() 함수를 호출하여 만들기 전에 HIKCharacter의 예상 메모리 크기를 확인할 수 있습니다. 이 함수에는 하나의 인수, 즉 HIKCharacter를 만드는 데 사용할 HIKCharacterDefinition이 필요합니다.

HIKCharacterStates

HIKCharacterState의 크기는 HIKCharacter에서 사용하는 노드 수에 따라 달라집니다.

  • HIKCharacterState의 기본 크기는 144바이트입니다.
  • 캐릭터에서 사용하는 각 노드에는 추가 96바이트가 필요합니다.

HIKCharacterStateSize() 함수를 호출하여 기존 HIKCharacterState의 현재 메모리 크기를 결정할 수 있습니다. 이 함수에는 하나의 인수, 즉 HIKCharacterState에 대한 포인터가 필요합니다.

HIKEffectorSetStates

모든 HIKEffectorSetState에는 3296바이트가 필요합니다.

HIKPropertySetStates

모든 HIKPropertySetState에는 1936바이트가 필요합니다.

메모리를 할당하고 할당 해제하여 오브젝트 만들기

HumanIK 시작 장에서 소개한, HIKCharacters, HIKCharacterStates, HIKEffectorSetStatesHIKPropertySetStates를 만드는 함수와 같이 메모리를 할당해야 하는 HumanIK내의 모든 함수에는 해당 메모리를 할당하는 데 사용된 콜백 함수에 대한 참조가 필요합니다. 표준 malloc 함수를 사용하거나 malloc과 동일한 유형 정의를 따르는 다른 모든 사용자 정의 메모리 할당 함수를 사용할 수 있습니다.

마찬가지로 HumanIK 시작 장에서 소개한, 이러한 오브젝트를 삭제하는 함수에는 해당 오브젝트에 대해 할당된 메모리 리소스를 비우는 데 사용된 콜백에 대한 참조가 필요합니다. 표준 free 함수를 사용하거나 free과 동일한 유형 정의를 따르는 다른 모든 사용자 정의 메모리 할당 함수를 사용할 수 있습니다.

예를 들어 다음은 mallocfree를 사용하여 HIKCharacterState를 만들고 삭제하는 코드입니다.

HIKCharacterState* lcharacterState = HIKCharacterStateCreate(character1, &malloc);
...
HIKCharacterStateDestroy(lcharacterState, &free);

사전 할당된 메모리에 오브젝트 만들기

HIKCharacter, HIKCharacterState, HIKEffectorSetState 또는 HIKPropertySetState를 만들 때마다 새 메모리를 할당하는 대신 사전 할당된 메모리 버퍼 내의 지정된 위치에 새 HumanIK 오브젝트를 만들 수 있습니다. 단일 메모리 풀을 사전 할당하고 해당 버퍼 내의 지정된 포인터에 관련된 모든 HumanIK 오브젝트를 만들면 관련된 HumanIK 오브젝트를 연속된 메모리 블록 내에 유지하여 성능을 향상시킬 수 있습니다.

이런 방식으로 오브젝트를 만들려면 HIKCharacterCreateInPlace(), HIKCharacterStateCreateInPlace(), HIKEffectorSetCreateInPlace()HIKPropertySetCreateInPlace() 함수를 호출합니다. 메모리를 할당하는 콜백 함수에 대한 참조 대신 유효한 메모리 위치에 대한 빈 포인터가 필요하다는 점을 제외하면 이러한 함수에는 HumanIK 시작 장에서 소개한 오브젝트 만들기 함수와 동일한 인수가 필요합니다. 이 포인터는 16바이트로 정렬되어야 하며 버퍼는 만든 오브젝트를 포함할 만큼 충분히 커야 합니다. 위의 HumanIK 오브젝트 및 메모리 관리을(를) 참조하십시오.

예를 들면 다음과 같습니다.

HIKCharacterState* lcharacterState = HIKCharacterStateCreateInPlace(character1, bufferAlignedTo16);

이 시나리오에서는 메모리 버퍼의 할당 및 할당 해제를 HumanIK 외부에서 처리할 가능성이 높습니다. 따라서 이런 방식으로 오브젝트를 만들 때는 일반적으로 정리에서 소개한 HumanIK 오브젝트 삭제 함수를 호출하여 명시적으로 오브젝트를 삭제할 필요가 없습니다.

연속 메모리 블록 사용

최상의 성능을 위해 가능하면 연속된 단일 메모리 블록에 관련된 모든 오브젝트를 할당하는 것이 좋습니다. 예를 들어 게임 캐릭터에서 사용하는 관련된 모든 HIKCharacterState, HIKEffectorSetStateHIKPropertySetState 오브젝트에 인접한 각 게임 캐릭터를 나타내는 HIKCharacter 오브젝트를 연속된 단일 메모리 블록 내에 할당하려고 합니다. 이렇게 하면 HumanIK 솔버에서 데이터를 읽고 쓸 때 메모리 내 다른 위치 간에 수행해야 하는 건너뛰기의 양이 최소화됩니다.

메모리 내 오브젝트 이동

다른 메모리 위치 간에 HIKCharacters, HIKCharacterStates, HIKEffectorSetStatesHIKPropertySetStates를 자유롭게 이동할 수 있습니다. 이 방법을 사용하면 사용자 정의 스트리밍 프로세스를 사용하여 HIK 오브젝트를 메모리로 로드하고 사용자 정의 스트림에서 직접 오브젝트를 검색하여 게임에 사용할 수 있습니다.

파일에서 오브젝트 만들기

이전에 저장한 HIKCharacters, HIKCharacterStates, HIKEffectorSetStatesHIKPropertySetStates를 파일에서 로드할 수 있습니다. 자세한 내용은 HumanIK 오브젝트 저장 및 로드을(를) 참조하십시오.