Как правильно освободить растровое изображение D2D1 при закрытии формы? - PullRequest
0 голосов
/ 14 июля 2020

Я использую SharpDX, чтобы нарисовать список растровых изображений. Я создал форму главного меню, чтобы выбрать, какие растровые изображения будут рисоваться. После этого откроется новая форма для создания DX-устройства, фабрики, свопчейна и так далее. Затем растровые изображения будут нарисованы на новой форме. Все растровые изображения сохраняются в LinkedList. Затем я могу использовать свой Unload (), чтобы выгрузить его и удалить из списка.

    public void Unload() {
        lock (this) {
            locked = true;
            lock (loadedList) {  // loadedList is the LinkedList contains all the bitmaps (100 bitmaps).
                loadedList.Remove(this);
            }
            if (Bitmap != null) {
                Bitmap.Dispose();
                Bitmap = null;
            }
        }
        locked = false;
    }

    public static void UnloadAll() {
        lock(loadedList) {
            while (loadedList.Count > 0) {
                loadedList.Last.Value.Unload();
            }
        }
    }

Когда я собираюсь выйти, я выгружаю все растровые изображения и немедленно закрываю форму DX . Однако память не освобождается. Сейчас работает только моя форма главного меню, но все еще освобождается много памяти НЕ . Вот диаграмма памяти: Немедленное закрытие формы DX

Затем я попробовал еще раз. Когда я собираюсь выйти, я просто выгружаю все растровые изображения, но не закрываю форму DX. Я продолжаю запускать Render l oop и просто BeginDraw () и EndDraw (). Но на этот раз я обнаружил, что память освобождается, а не сразу . Примерно так: Диаграмма памяти из VS Как видите, после того, как я выгружаю все растровые изображения, память просто падает, но НЕ до самого низкого уровня. Через 3 секунды он снова начнет падать и восстановится до нормального уровня, это падение происходит автоматически. Если я закрою форму сразу , этого не произойдет. Вот и мне интересно, как выпустить это сразу . Если я не могу, как мне дождаться второго релиза, а затем закрыть форму DX? Между прочим, некоторые большие 3D-игры зависают на некоторое время при выходе, они ждут второго релиза?

Я сделал 4 снимка при запуске: 4 снимка 1-й когда загружаются все растровые изображения. 2-й - когда я выгружаю все растровые изображения, теперь память не была освобождена: Сравнить с 1-м снимком 3-й - это когда память впервые выпадает: Сравнить со 2-м снимком 4-й - когда память вторая капля: Сравните с 3-м снимком

...