메모리가 올바르게 처리되지 않는지 어떻게 알 수 있습니까?


12

(2D) 게임의 메모리 풋 프린트는 텍스처를로드 할 때마다 증가하는 것 같습니다. 54MB 전용 RAM.

같은 거리를 이동 한 후 두 점 사이를 반복해서 앞뒤로 이동 한 후에도 같은 일이 발생합니다.

그러나 내 판독 결과는 텍스처가 화면을 벗어난 후 약 1 초 정도 프로그램이 glDeleteTextures를 올바르게 호출하고 있음을 보여줍니다. valgrind는 누수를 찾지 않습니다.

이 문제에 대해 걱정해야하는지 또는 OS가 메모리를 페이지하는 방식에 문제가 있는지 어떻게 알 수 있습니까?


1
애플리케이션의 RAM 사용량을 어떻게 결정 했습니까? 프로파일 러를 사용하고 있습니까? 어느 운영 체제의 작업 관리자를 신뢰합니까?
Philipp

1
kUbuntu의 작업 관리자, 내 디버거의 프로파일 러는 데이터를 기다리고 있다는 것을 알려주고 아무것도 표시하지 않습니다.
Patrick Jeeves

1
그건 그렇고 : 리눅스에서 메모리 소비를 확인할 때 게임 프로세스가 소비하는 메모리를 보지 말고 기억하십시오. 한때 멀티 플랫폼 게임을 할 때, 그래픽 API의 Linux 버전이 X11 프로세스의 모든 텍스처에 메모리를 할당 한 것을 알 때까지 Windows 버전이 Linux 버전보다 훨씬 많은 램을 소비하는 이유가 궁금했습니다.
Philipp

2
glDeleteTextures가 실제로 메모리를 확보 할 것이라는 기대는 없습니다 : gamedev.stackexchange.com/questions/136883/…
Maximus Minimus

답변:


21

가상 메모리는 큰 청크로 OS에서 할당되며, 심지어 큰 청크에서 바이트를 계속 사용하더라도 OS로 다시 해제 할 수 없습니다.

사용자 공간의 할당 라이브러리는 반복적으로 요구되는 메모리를 반복적으로 요구하고 OS에서 메모리를 릴리스하는 것을 피하기 위해 재사용을 위해 일정량을 유지합니다.

예를 들어 텍스처를 할당하고 OpenGL 드라이버는 32 개의 텍스처 슬롯 테이블을 예약하고 텍스처를 할당 한 다음 드라이버는 1024 개의 텍스처 슬롯 더 큰 테이블을 할당해야합니다.이 새로운 테이블은 이제 큰 RAM 덩어리에 공간을 차지합니다. 모든 텍스처를 해제하면 드라이버는 게임 / 응용 프로그램이 나중에 많은 텍스처를 사용해야하므로 큰 RAM 덩어리가 OS로 다시 릴리스 될 수 없을 것으로 예상하여 테이블을 축소하거나 다시 할당하지 않습니다.

이것은 완벽하게 정상이며 원합니다. 사용하지 않는 RAM은 결국 앱에서 재사용됩니다.


1
재생 중에 사용량이 계속 증가하지만 누출 감지기가 여전히 아무것도 찾지 못하면 과도한 메모리 조각화가 발생할 수 있습니다. stackoverflow.com/questions/150753/…에 설명 된 이러한 문제를 해결하기위한 접근 방식 은 게임 개발에도 유용합니다.
Jules
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.