2014-09-14 4 views
0

Этот код работает каждые 100 мс. Использование памяти просто увеличивается до тех пор, пока оно не достигнет 1,5 ГБ, а затем оно сработает.Утечка памяти в приложении SharpDX

void takeScreenShot() 
{ 
    Surface s; 
    s = CaptureScreen(); 
    pictureBox1.Image = new Bitmap(Surface.ToStream(s, ImageFileFormat.Bmp)); 
    s.Dispose(); 
} 

public Surface CaptureScreen() 
{ 
    int width = Screen.PrimaryScreen.Bounds.Width; 
    int height = Screen.PrimaryScreen.Bounds.Height; 
    Device device = new Device(new Direct3D(), 0, DeviceType.Hardware, IntPtr.Zero, CreateFlags.HardwareVertexProcessing, new PresentParameters(width, height)); 
    DisplayMode disp = device.GetDisplayMode(0); 
    Surface s = Surface.CreateOffscreenPlain(device, disp.Width, disp.Height, Format.A8R8G8B8, Pool.Scratch); 
    device.GetFrontBufferData(0, s); 
    return s; 
} 
+0

Нельзя ли повторно использовать некоторые из объектов в методе 'CaptureScreen'? Как «Устройство» и «Поверхность»? Что происходит, когда он падает? Вы получаете исключение или какую-то другую обратную связь? – scheien

+0

Возможный дубликат [Поиск утечек памяти в управляемом приложении метро Win8?] (Http://stackoverflow.com/questions/9995164/finding-memory-leaks-in-a-managed-win8-metro-app) – Xstian

+1

if (pictureBox1.Image! = null) pictureBox1.Image.Dispose(); –

ответ

3

Вы создаете новое устройство каждый раз.

Необходимо создать устройство только один раз, создать его в своем стартовом коде один раз и затем продолжать использовать его.

Кроме того, я подозреваю, что утечка памяти в Surface.ToStream() возвращенному потоку, вероятно, тоже нуждается в утилизации.

 var stream = Surface.ToStream(s, ImageFileFormat.Bmp); 
     pictureBox1.Image = new Bitmap(stream); 
     stream.Dispose(); 

Как уже упоминалось Ханс Passant, Bitmap потребности в утилизации, а также.

Вы можете очень легко отлаживать утечки памяти в SharpDX с помощью помощника для диагностики неизданных ресурсов COM. Установка в начале вашего приложения это переменный:

SharpDX.Configuration.EnableObjectTracking = true; 

Когда выход из приложения, оно будет на печати отчет объектов COM, которые не были должным образом выпущены с StackTrace. Класс за этим - ObjectTracker.

ObjectTracker.ReportActiveObjects() можно вызывать для печати используемых в настоящее время ресурсов во время выполнения (даже с трассировкой стека).

+0

Я могу подтвердить, что Surface.ToStream() является утечкой памяти, но как я могу удалить возвращенный поток? –

+0

действительно ли вызов 'Dispose()' на нем не работает? – thumbmunkeys

+0

см. Мое редактирование, я думаю, что вам не хватает базовых понятий. – thumbmunkeys

Смежные вопросы