문제

내 Compact Framework 응용 프로그램은 모든 항목을 큰 비트 맵 표면으로 렌더링 한 다음 해당 비트 맵을 화면의 오프셋 위치에 복사하여 적절한 항목 만 표시합니다. 기존 버전은 당시 화면에 나타나야하는 항목 만 렌더링했지만이 접근 방식은 부드러운 스크롤 인터페이스를 위해 너무 느 렸습니다.

때때로 큰 비트 맵을 생성 할 때 때때로 외부에서 외계인을 생성합니다. 사용자가 장치의 소프트 레지 세트를 수행하고 응용 프로그램을 다시 실행하면 문제없이 생성을 수행 할 수 있습니다.

애플리케이션은 새로운 부드러운 스크롤 방법 이전과 거의 동일한 양의 프로그램 메모리를 사용하기 때문에이 비트 맵이 프로그램 메모리에서 생성되는 것처럼 보이지 않습니다.

이 예외를 방지 할 수있는 방법이 있습니까? 예외가 발생하기 전에 필요한 메모리를 자유롭게 할 수있는 방법이 있습니까?

도움이 되었습니까?

해결책

완전히 렌더링 된 데이터의 크기가 분명히 문제이므로 데이터의 일부만 렌더링하는 오래된 메커니즘으로 돌아가는 것이 좋습니다. 렌더링 문제를 방지하기 위해 현재 뷰보다 몇 줄을 미리 렌더링 할 수 있으므로 충격이 제한되어 "스크롤"할 수 있습니다.

다른 팁

그리고 내가 게시하자마자 나는 당신을 생각했습니다. ~할 수 있다 새 버전으로 문제를 해결하려면하십시오. 당신이 가진 문제는 CF 중 하나가 거대한 비트 맵에 사용할 수있는 연속 메모리의 한 블록을 찾으려고하는 것입니다. 이것은 때때로 문제입니다.

하나의 큰 비트 맵을 만드는 대신 각 항목마다 하나의 작은 비트 맵 모음을 만들고 각 항목을 자체 작은 비트 맵으로 렌더링 할 수 있습니다. 디스플레이 중에 필요한 비트 맵을 복사하면됩니다. CF는 하나의 큰 비트 맵을 만드는 데 훨씬 쉬운 시간이 훨씬 쉬울 것이며, 정말로 엄청난 아이템이 아닌 한 메모리 문제가 없어야합니다.

"고정이 없다"와 같은 표현을 피해야합니다.

또 다른 중요한 점 : 완료되면 각 비트 맵에서 dispose ()를 호출해야합니다.

당신의 비트 맵은 확실히 ~이다 프로그램 메모리에서 생성됩니다. 비트 맵에 필요한 메모리의 금액은 얼마나 큰지, 그리고이 필요한 크기가 OutofMemoryException을 생성할지 여부에 따라 다릅니다.

죄송하지만 이것은 일반적으로 PDA의 물리적 메모리를 증가시키는 수정이 부족하지 않은 경우 일반적으로 불가능한 제어 렌더링 기술 (특히 컴팩트 프레임 워크)입니다. CF 프로세스는 장치가 얼마나 많이 사용 가능한지 상관없이 32MB로 제한되므로).

가장 좋은 방법은 이전 버전으로 돌아가 렌더링 속도를 향상시키는 것입니다. CF에는 깜박임을 제거하기 위해 컨트롤을 이중 청분을 만들기위한 간단한 기술도 있습니다.

생성 할 수있는 비트 맵 공간의 총 크기를 제한하는 장치 제한이있는 것처럼 보이므로 (일반 프로그램 메모리가 아닌 비디오 RAM에서 생성 된 것 같습니다), 한 가지 대안은 여기에 사용 된 큰 비트 맵 객체를 대체하는 것입니다. BitBlt API 함수를 핀 바로 읽고 읽고 쓰는 데 액세스하는 일반적인 Windows 메모리 블록.

처음에는 메모리 블록을 만드는 것이 까다 롭고 아마도 다른 질문을하기를 원할 것입니다. 여기에서 중요한 기억). 나는 그것을하는 방법을 알고 있지만, 내가 올바르게하는지 확신하지 못하고 오히려 전문가의 의견을 가질 것입니다.

큰 블록을 만든 후에는 항목을 반복하고, 계속 재사용 할 수있는 하나의 작은 비트 맵 (기존 .NET 코드 사용)으로 렌더링하고 메모리 블록의 적절한 지점으로 비트를 비트로 렌더링합니다.

전체 캐시를 작성한 후 렌더링 코드는 이전과 같이 작동해야하며, 큰 비트 맵에서 렌더링 표면으로 복사하는 대신 캐시 블록에서 비트를 비트를 복사하는 차이가 있습니다. BitBlt에 대한 인수는 기본적으로 DrawImage (대상, 소스, 좌표 및 크기 등)와 동일합니다.

전문화 된 비디오 RAM 대신 이런 식으로 일반 메모리에서 캐시를 만들기 때문에 같은 문제가 발생하지 않을 것이라고 생각합니다. 그러나 블록 생성 코드가 먼저 작동하고 테스트하여 매번 큰 블록을 만들 수 있는지 확인합니다.

업데이트 : 실제로, 이상적인 접근법은 하나의 큰 메모리 블록을 모은 것입니다. 나는 5 및 10MB 객체를 다루는 CF 앱과 함께 일했으며 어쨌든 큰 문제는 아닙니다 (해당 청크가 고정 될 때 더 큰 문제 일 수 있지만 - I Dunno). BTW, 나는 비트 맵이 사용 가능한 메모리보다 훨씬 작다는 것을 알았 기 때문에 항상 비트 맵 제작의 Oomes에 놀랐습니다. 이제 그 이유를 알고 있습니다. 처음에는 이것이 쉬운 해결이라고 생각합니다.

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