개요한 번에 여러 비트 맵에서 작업하면서 성능을 향상시키는 방법은 무엇입니까?
ViewStyle을 vsIcon으로 설정하여 TListView를 채우고 있습니다. Listview는 TImageList에 연결되어 있으며 Listview에 추가 된 각 항목에 대해 해당 색인에 지정된 자체 이미지가 있습니다.
아이디어는 한 번에 일련의 비트 맵을 조작하는 프로세스를 자동화 할 수 있다는 것입니다. 각 비트 맵은 항상 크기가 같지만 다르다.
이 작동 방식의 특성으로 인해 ImageList에 몇 개의 비트 맵이 추가되었는지에 대한 고정 된 크기 나 제한이 없으므로 사용 가능한 시스템 메모리 만 제한됩니다.
문제
나는이 비트 맵에 대한 조작의 성능과 관련이있는 문제. 조작이란 그레이 스케일, 색상 바꾸기, 밝기 조정 등과 같은 비트 맵에서 다른 이미지 처리 기술을 수행하는 것을 의미합니다.
이제 1Mb 크기의 비트 맵 밝기를 조정하는 데 3 초가 걸린다고 가정합니다. ImageList에 총 10 개의 비트 맵이있는 경우이 프로세스는 이제 약 30 초가 걸립니다.
(참고 : GetTickCount 또는 그 밖의 속도로 테스트하지는 않았지만 이는 예제 일뿐입니다.)
이전에 ImageList의 크기가 아무 것도 될 수는 없지만 잠재적으로 처리 시간은 영원처럼 보일 수 있습니다.
나는이 같은에서 조작을 수행하기 위해 내가 오프 스크린 버퍼 비트 맵에 각 비트 맵을 전송하는 루프 내부에 GetBitmap를 사용하여 이러한 비트 맵에 어떤 조작을 수행 할 때 :
var
Bmp: TBitmap;
i: Integer;
begin
Bmp := TBitmap.Create;
try
ImageList1.BeginUpdate;
try
for i := 0 to ImageList1.Count - 1 do
begin
ImageList1.GetBitmap(i, Bmp);
Bmp.PixelFormat := pf24Bit;
// perform manipulation to Bmp here
ImageList1.Replace(i, Bmp, nil);
end;
finally
ImageList1.EndUpdate;
end;
finally
Bmp.Free;
end;
end;
실행을하는의 ImageList를 통해 그 어떤 크기 나 양의 이미지를 포함 할 수 있으며 이것이 어떻게 느릴 수 있는지 이해할 수 있습니다.
나는 이것을 수행하는 방법을 최적화하고 개선하는 방법을 찾고 있는데, 지금은 받아 들일 수있는 성능이 현명한 곳에서는 어디에도 없습니다. BeginUpdate
및 EndUpdate
은 여기에 가치있는 해결책을 제공하지 않습니다. 나는 대부분의 계산이 긴 처리 시간을 필요로한다는 것을 이해함에 따라 어떤 기적을 찾지 않고 있으며, 당신이 제공해야 할 도움이나 조언으로 가능한 한 최선을 다해이 시간을 줄여야합니다. 이는 침체가 일어나고있는 사실에 있는지 확인하기 위해 코드를 프로파일 링 할 때까지
0) 아무것도하지 마십시오
멀티 스레딩은 필요한 방식이지만 모든 것이 아니라 스레드 풀이 필요합니다. OmniThreadLibrary는 이렇게 할 수있는 훌륭한 자원을 가지고 있습니다. http://otl.17slon.com/ http://otl.17slon.com/ 한 번 시도해 보았습니다. 한번에 700 개의 스레드 (700 개 이미지를 가정)를 만들려고 시도하지 않았습니다. 말 그대로 컴퓨터를 죽일 것입니다. 쓰레드 풀의 개념은 5 개의 쓰레드를 동시에 실행하는 반면 나머지는 기다리는 대기열에 머무르는 것입니다. 한 스레드가 완료되면 다른 스레드가 종료되므로 한 번에 5 개의 스레드가 실행되지 않습니다. –
스레드에 의해 @ JerryDodge 당신은 CPU에서 각각의 사용 가능한 코어를 활용한다는 것을 의미합니까? –
아니요, 그는'TThread'를 사용한다는 의미입니다. 동시에 실행되므로 여러 이미지를 동시에 처리 할 수 있으며 응용 프로그램 UI는 반응 형으로 유지됩니다. 이론 상으로는 OS가 쓰레드를 교체 할 스레드를 찾아 낼 수 있다면, 걱정할 필요가 없습니다. –