문제

내가 필요로드하는 대형 모델과 다른 구조화된 데이터는 바이너리에 이전 CD-기반 게임 콘솔 효율적으로 가능합니다.최선의 방법은 무엇일지?데이터 내보내에서는 파이썬다.이것은 매우 정교한 취미 프로젝트입니다.

Requierements:

  • 없음에 대한 의존도 완전 표준 준수 STL-i 를 사용할 수 있습 uSTL 하지만입니다.
  • 으로 약간의 오버헤드로 가능하다.목표에 대한 솔루션도 좋습니다.사용될 수 있었다 원래 플레이 스테이션,그럼에도 불구하고 우아하고 현대적으로 가능합니다.
  • 아 앞으로/뒤로 호환이 필요합니다.
  • 아니 복사하의 큰 덩어리 주위에 바람직하게는 파일을 로드 램에서 배경,그리고 모든 큰 덩어리에서 직접 액세스가있다.
  • 해야에 의존하지 않는 대상을 가지는 같은 엔디안 및 맞춤,즉C 플러그인에서는 파이썬는 덤프의 구조체를 디스크 될 수 없는 것이 매우 좋습니다.
  • 해야 할 수 있 이동 로드된 데이터로 개인적인 파일 1/3RAM size,조각이 문제가 될 수 있습니다.아 MMU 게 남용될 수 있습니다.
  • 견고성이 큰 보너스로 나의 주의 기간은 매우 짧고,즉나는 변화는 절약의 일부 코드를 잊지 로드 중 하나 또는 반대로,너무 적어도 바보 보호하는 것이 좋다.
  • 교환 사이에로드되는 데이터와 런타임-생성되지 않고 데이터 런타임 오버헤드지 않고 심각한 메모리 관리 문제가 될 수있는 보너스입니다.

나의 종류는 반 계획의 분석에서는 파이썬은,사소한 제한 구문 C 헤더를 사용할 수 있는 구조체로 오프셋을 대신의 포인터,편의 래퍼는 구조체/수업에서 주요 응용 프로그램으로 필요한 것입하는 것을 변환 오프셋을 제대로 입력 포인터/을 참조하지만,내가 듣고 싶은 당신의 제안을 제공합니다.

설명:요청은 주로 데이터에 대해 선적 프레임워크 및 메모리 관리 문제입니다.

도움이 되었습니까?

해결책

이것은 일반적인 게임 개발 패턴이다.

일반적인 접근 방식을 요리하는 데이터는 오프라인 사전 프로세스 단계입니다.결과 덩 스트리밍할 수 있는 최소한의 오버헤드가 발생합니다.모양은 플랫폼에 종속적이고 포함해야 합니다 적절한 정렬&endian-네스의 타겟 플랫폼입니다.

런타임 시에,당신은 단순히 주의 포인터를 메모리에 blob 파일입니다.처리할 수 있습니다 중첩된 구조뿐만 아니라.는 경우에 당신은 유지하는 테이블의 내용으로 오프셋을 모든 포인터 값을 내 blob,할 수 있는 그 수정에 대한 포인터가 가리키는 적절한 주소입니다.이것은 비슷한 방법을 dll 로드 작동합니다.

했던 루비 라이브러리 bbq, 내가 사용하여 요리하는 데이터에 대한 내 아이폰 게임입니다.

여기에는 메모리 레이아웃에 사용하는 blob header:

// Memory layout
//
// p begining of file in memory.
// p + 0 : num_pointers
// p + 4 : offset 0
// p + 8 : offset 1
// ...
// p + ((num_pointers - 1) * 4) : offset n-1
// p + (num_pointers * 4) : num_pointers   // again so we can figure out 
//                                            what memory to free.
// p + ((num_pointers + 1) * 4) : start of cooked data
//

여기에 내가 어떻게 짐을 바이너리 blob 파일을 수정 포인:

void* bbq_load(const char* filename)
{
    unsigned char* p;
    int size = LoadFileToMemory(filename, &p);
    if(size <= 0)
        return 0;

    // get the start of the pointer table
    unsigned int* ptr_table = (unsigned int*)p;
    unsigned int num_ptrs = *ptr_table;
    ptr_table++;

    // get the start of the actual data
    // the 2 is to skip past both num_pointer values
    unsigned char* base = p + ((num_ptrs + 2) * sizeof(unsigned int));

    // fix up the pointers
    while ((ptr_table + 1) < (unsigned int*)base)
    {
        unsigned int* ptr = (unsigned int*)(base + *ptr_table);
        *ptr = (unsigned int)((unsigned char*)ptr + *ptr);
        ptr_table++;
    }

    return base;
}

bbq 라이브러리는 아직 준비되지 않았습니라,그러나 그것을 줄 수 있는 방법에 대한 몇 가지 아이디어를 작성 중 하나에 자신을 python.

행운을 빕니다!

다른 팁

Nintendo Gamecube 및 DS와 같은 플랫폼에서 3D 모델은 일반적으로 매우 간단한 사용자 정의 형식으로 저장됩니다.

  • 파일을 식별하는 마법 번호, 정점 수, 정상 등 및 선택적으로 헤더 다음 데이터 체크섬 (Adler-32, CRC-16 등)을 포함하는 간단한 헤더.
  • 각 벡터 및 정상에 대해 32 비트 플로팅 포인트 3- 트럭의 압축 된 목록.
  • 아마도 압축 된 가장자리 또는 얼굴 목록.
  • 모든 데이터는 대상 플랫폼의 네이티브 엔디 어 형식입니다.
  • 압축 형식은 종종 사소한 (허프만), 단순 (산술) 또는 표준 (GZIP)입니다. 이들 모두는 기억이나 계산 능력이 거의 필요하지 않습니다.

당신은 그런 형식을 큐로 가져갈 수 있습니다 : 그것은 매우 작곡입니다.

내 제안은 사후 처리 및 복사를 최소화하기 위해 메모리 내 데이터 구조와 가장 유사한 형식을 사용하는 것입니다. 그것이 당신이 직접 형식을 만드는 것을 의미한다면 그렇게하십시오. 극단적 인 요구가 있으므로 극단적 인 조치가 필요합니다.

설명에서 "교영의 용이성"을 요구하는 곳은 없습니다. :-)

따라서 여기에 이것을 만드는 방법으로 저에게 떠오르는 것이 있습니다.

  • 데이터는 대상의 메모리에서와 동일한 온 디스크 형식이어야하므로 단순히 디스크에서 블로브를 메모리로 끌어 당기는 것만 큼 재구성 할 수 없습니다. 물건을 메모리에 넣는 데 원하는 자유에 따라, "blobs"는 전체 파일이거나 그 안에 더 작은 비트 일 수 있습니다. 나는 당신의 데이터를 세분화하는 방법을 제안 할만 큼 충분히 이해하지 못하지만 아마도 당신은 아마도 당신이 할 수 있습니다. 우리는 호스트의 동일한 엔지니어와 정렬에 의존 할 수 없기 때문에 호스트 측에 파일을 쓸 때 물건을 번역하는 것에 대해 다소 영리해야하지만 적어도 이런 식으로 한쪽에는 영리함 만 있으면됩니다. 둘 다보다는 전송의.

  • 대상 측 및 호스트 측 코드가 일치한다는 사실을 약간 보증하려면 단일 데이터 설명을 제공하고 대상 측 C 코드와 모두 생성 할 생성 코드가있는 양식으로 작성해야합니다. 호스트 측 파이썬 코드. 프로세스에서 생성기가 작은 임의의 "버전"번호를 생성하고 호스트 측 코드가 파일 헤더에 이것을 작성하고 대상 측 확인하고 일치하지 않으면 오류가 발생할 수도 있습니다. . (임의의 값을 사용하는 요점은 당신이 관심을 갖는 유일한 정보 비트는 그들이 일치하는지 여부이며 수동으로 증가하고 싶지 않다는 것입니다.)

SQLITE DB에 데이터를 블로브로 저장하는 것을 고려하십시오. SQLITE는 매우 휴대용이며 Lighweight, ANSI C는 C ++ 및 Python 인터페이스를 모두 가지고 있습니다. 이것은 큰 파일, 단편화, 빠른 액세스가있는 가변 길이 레코드 등을 처리합니다. 나머지는 단지이 얼룩에 대한 스트러크의 직렬화 일뿐입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top