2011-11-07 3 views
9

나는 장치의 RAM 크기에 따라 조정하려는 텍스처가 많은 OpenGL 게임을 가지고 있습니다. 가장 높은 해상도 텍스처 iPhone4 또는 iPad2에서 정상적으로 작동하지만 이전 장치는 텍스처를로드하는 도중에 충돌합니다. 저 텍스처의 저해상도 버전이 있지만이를 사용할시기를 알아야합니다.iOS의 RAM 가용성에 대한 응답

내 현재 전술은 IPad2 이상 및 iPhone 4 이상에 대한 고해상도 텍스처 만로드하는 특정 구형 장치 (3GS는 고해상도 화면, iPad에는 카메라가 없음)를 감지하는 것입니다. iPod touch 용으로 뭔가를해야합니다. 하지만 모델 검색은 API 및 하드웨어의 향후 변경에 취약하기 때문에 하드 코딩 장치 모델보다 기능 감지를 사용하는 편이 낫습니다.

내가 생각하고있는 또 다른 가능성은 고해상도 텍스처를 먼저로드 한 다음 드롭 다운하고 낮은 메모리 경고가 표시되는 순간이를로 고침으로 바꾸는 것입니다. 그러나 나는 응답 할 수있는 기회를 갖게 될지 확신하지 못한다. 디버그 콘솔에 알림이 나타나기 전에 앱이 자주 죽는 것으로 나타났습니다.

실행중인 장치가 고해상도 텍스처를로드 할 수있는 RAM이 부족한 지 어떻게 감지합니까?

한 걸음 뒤로 물러나면 OpenGL 텍스처 메모리에만 사용할 수있는 다른 적응 기술이 있습니까?

주 :

  1. 내가에 사용 가능한 RAM 탐지에 관한 답변 SO 떨어져 검색 한, 그러나 그들 모두는 기본적으로 메모리 사용을 프로파일 링 및 임시직의 수명을 최소화 (폐기물을 제거하는 조언하고, 모든 시시한 이야기). 내가 할 수있는 한 많은 작업을 했으므로 오래된 장치에 고해상도 텍스처를 집어 넣을 방법이 없습니다.

  2. PVRTC는 (는) 선택 사항이 아닙니다. 텍스처에는 조각 쉐이더에서 사용할 데이터가 포함되어 있으므로 무손실 형식으로 저장해야합니다.

+0

이 스레드 [iOS의 여유 메모리] (http://stackoverflow.com/questions/5012886)에 설명 된대로 총 램 및 프리 램 통계를 얻을 수 있습니다. 또한, 내 아이폰 4 코드를 테스트하고 잘 작동합니다! –

답변

11

장치의 총 (최대) 물리적 RAM을 얻으려면 [NSProcessInfo processInfo].physicalMemory을 사용하십시오.

Documentation을 참조하십시오.

0

지금까지 내가 하나가 할 수있는 가장 중요한 3 가지 일을 알고있다 - 아이폰 OS를 찾기 위해 노력하고 악기에 경고 & 2

  • 프로필 코드 1을 보낼 때

    1. - (void)didReceiveMemoryWarning를 구현하고 응답 누설 & mem 최적의 구현 방법.
    2. 장치 유형을 검색 & 아마 그 정보를 사용하십시오.
    3. 공간을 절약하기 위해 PVRTC와 같은 형식 압축 텍스처를 사용하십시오.

    나는 당신이 그들 대부분을하고 있다고 생각합니다. 것은 iOS 장치가 얼마나 많은 RAM을 가지고 있는지 정확히 알지 못합니다. Apple은 iOS 장치에 대한 기술 사양을 게시하지 않습니다.

    또한 소비가 100MB라고 말한 후에 만 ​​mem 경고가 표시됩니다. iOS가주는 경고는 기기의 현재 상태에 따라 다릅니다. & 실행중인 다른 앱 & 얼마나 많은 mem이 사용 중인지 확인하십시오. 그래서 까다로워집니다.

    나는 2 섹션을 읽을 수 있어야 제안 할 수 있습니다 - Best Practices for Working with Texture DataTuning Your OpenGL ES Application

  • 2

    가장 중요한 당신이이 경우에 높은 또는 낮은 고해상도 텍스처를 사용하는 거세한 숫양 인 메모리 관리를 위해 알 필요가 있다고 생각합니다. 내가 사용하는 가장 간단한 방법은 지금까지 모든 장치에 대한이 작동이

    CGFloat scale = [[UIScreen mainScreen] scale]; 
    if ((scale > 1.0) || (self.view.frame.size.width > 320)) { 
         highRes = TRUE; 
    } 
    

    을 확인하고, 새로운 디바이스는 높은 해상도를 사용합니다 미래를 증명해야한다. 또한 바로 화면 비율을 계산할 수 있습니다

    aspect = self.view.frame.size.width/self.view.frame.size.width 
    

    첫 highres 있습니다로드는로드 내 시작의 대부분이 소비되는 제 3 세대에, 앱의 로딩 시간을 죽이고하지 마십시오 (심지어 (아이폰 VS 아이 패드에 나중에 도움) 저해상도) 텍스처를 사용하여 시작 부분에서이 오른쪽을 테스트하고 고음을 만지지 마십시오.

    오래된 장치에서는 큰 텍스처 때문에 경고없이 프로그램이 종료되며 디버거가 비디오 메모리 사용량을 트랩하고 자체적으로 죽지 않을 수 있습니다.

    더 큰 최적화를 위해 실제로 사용되는 가장 낮은 텍스처 크기를 확인하기 위해 밉맵을 채색하는 것이 좋습니다 (3D 개체를 사용하는 경우에만 해당).

    비디오 RAM 크기 문제는 잊어 버리십시오. 메모리는 실제로 공유되므로 시스템 메모리를 사용할 수 있습니다. 이전 장치에서는 MB 제한이 있지만 사용 가능한 시스템 메모리입니다.

    메모리 관리에 관해서는 여러 가지 방법이 있습니다. 가장 간단한 방법은로드되는 텍스처와 필요한 텍스처를 표시하고, 메모리 경고가 오면로드되지만 필요하지 않은 텍스처를 덤프해야합니다. this blog post에 설명하고 좋은 깨끗한 API here (해당하는 .m 파일에 totalMemory의 구현을 참조)로 구현한다.

    +0

    자세한 답변을 보내 주셔서 감사합니다. 나는 이것을 받아 들일 수 없다. 왜냐하면 그것은 형상 탐지를 사용하는 대신에 RAM을 탐지하는 핵심 질문에 대답하지 않기 때문이다 (아니면 불가능할 수도 있고 추구 할 가치가 없다는 것을 의미 하는가?). 1.0 '으로 아이폰 4를 감지했다. –

    +0

    jailbreaking하지 않고 메모리를 감지하고 탐지하는 유일한 방법은 모두 채우고 얼마를 얻었는지 측정하는 것입니다. 또한 메모리가 실행중인 다른 모든 응용 프로그램 (예 : sytems 것, 메일 등)과 공유되기 때문에 실제 메모리의 양도 알만한 가치가 없습니다. 그래서 내가 그 길을 잊어 버렸다고 말했어. 너가 찾고있는 단단한 곳이 아니야. – led42

    +0

    당신의 말씨는 비디오 메모리를 별개로 생각하지 말아야하는지, RAM을 측정하는 것을 포기하는지에 대해 모호했습니다. 나는 다른 실행중인 애플 리케이션에 대해 상관 없어; 경험적으로 256MB의 장치는 항상 충돌하지만 512MB의 장치는 절대로 작동하지 않습니다. 또한, 제안 된 테스트는 최신 iPod Touch - 망막 및 256MB로 실패합니다. 모델 탐지의 취약성에 대한 내 두려움을 강조합니다. 덧붙여서, 아이팟 터치 문제에 대한 해결책을 찾기 위해 나는 가능한 대답을 이끌어 냈다. 나는 그것을 별도로 게시 할 것이다. –

    7

    총 물리적 RAM은 sysctl()를 통해 사용할 수 있습니다.

    나는 편리함과 후손을 위해 블로그의 코드를 해제했습니다

    #include <sys/sysctl.h> 
    
    size_t phys_mem() 
    { 
    int mib[] = { CTL_HW, HW_PHYSMEM }; 
    size_t mem; 
    size_t len = sizeof(mem); 
    sysctl(mib, 2, &mem, &len, NULL, 0); 
    return mem; 
    } 
    

    애플이 이러한 방식으로 sysctl()를 사용하는 응용 프로그램을 승인 할 것인지 모르겠어요. 문서화되었지만 Mac OS X에만 해당.

    +1

    앱 스토어 앱에서 승인 된 적이 있습니까? – Nate

    +2

    @ 네이트 : 네. [Your World] (http://itunes.apple.com/us/app/your-world/id412566625?mt=8)는 384MB가 넘는 장치에 96 메가 픽셀 어스를로드합니다. 그렇지 않으면 다시 24 메가 픽셀 버전으로 떨어집니다. 숫자에는 특별한 것이 없습니다. 그것은 할 수있는 장치와 그렇지 못하는 장치 사이의 중간 정도입니다. –

    +2

    [NSProcessInfo processInfo] .physicalMemory – Steve