GDI + просто слой сверху GDI или что-то новое?

public void TryThreeTimes(Action action)
{
    var tries = 3;
    while (true) {
        try {
            action();
            break; // success!
        } catch {
            if (--tries == 0)
                throw;
            Thread.Sleep(1000);
        }
    }
}

Тогда вы бы позвонили:

TryThreeTimes(DoSomething);

... или, альтернативно ...

TryThreeTimes(() => DoSomethingElse(withLocalVariable));

Более гибкий вариант:

public void DoWithRetry(Action action, TimeSpan sleepPeriod, int tryCount = 3)
{
    if (tryCount <= 0)
        throw new ArgumentOutOfRangeException(nameof(tryCount));

    while (true) {
        try {
            action();
            break; // success!
        } catch {
            if (--tryCount == 0)
                throw;
            Thread.Sleep(sleepPeriod);
        }
   }
}

Для использования в качестве:

DoWithRetry(DoSomething, TimeSpan.FromSeconds(2), tryCount: 10);

Более современная версия с поддержкой async / await :

public async Task DoWithRetryAsync(Func<Task> action, TimeSpan sleepPeriod, int tryCount = 3)
{
    if (tryCount <= 0)
        throw new ArgumentOutOfRangeException(nameof(tryCount));

    while (true) {
        try {
            await action();
            return; // success!
        } catch {
            if (--tryCount == 0)
                throw;
            await Task.Delay(sleepPeriod);
        }
   }
}

Для использования в качестве:

await DoWithRetryAsync(DoSomethingAsync, TimeSpan.FromSeconds(2), tryCount: 10);
9
задан Euro Micelli 9 July 2009 в 12:19
поделиться

3 ответа

Многие функции GDI ускоряются с помощью графического оборудования, а некоторые подпрограммы GDI + могут использовать GDI ниже.Но большая часть GDI + не зависит от GDI.

Важным и показательным примером является визуализация текста. В GDI + отрисовка текста полностью выполняется программно; сглаживание, подгонка пикселей глифов и другие эффекты выполняются без видеокарты.

alt text
(источник: microsoft.com )

Крис Джексон из Microsoft опубликовал интересную запись в блоге, в которой описал разницу в скорости отрисовки текста в GDI и GDI + :

... мой кодовый путь GDI отображал примерно 99 000 глифов в секунду, тогда как мой кодовый путь GDI + отображал примерно 16 000 глифов в секунду.

Другой пример - рисование линий. GDI + поддерживает рисование линий / многоугольников и кругов / эллипсов со сглаживанием, тогда как GDI не поддерживает:

alt text
(источник: microsoft.com )
alt text
(источник: microsoft.com )

alt text
(источник: microsoft.com )

8
ответ дан 4 December 2019 в 08:34
поделиться

GDI + не является COM. GDI + имеет базовый «плоский» API, который вызывается из C (или, следовательно, из любого другого языка), и объектно-ориентированную оболочку на C ++, которая просто вызывает плоский API. В .NET (System.Drawing) и Delphi также есть оболочки, которые также просто вызывают плоский API. Он работает совершенно иначе, чем GDI, поскольку вы не устанавливаете объекты (перья, кисти, шрифты) в контекст устройства, а скорее передаете их функциям рисования. У него мало общего с GDI. Я не знаю, использует ли реализация GDI + GDI - но, скорее всего, нет, потому что у него так много функций, которые просто недоступны в GDI.

К сожалению, он медленнее, чем GDI. Тем не менее, он очень мощный.

Как тем временем заметил Декастельжау, проблемы с производительностью могут возникать из-за того, что он не обрабатывается аппаратно, в отличие от OpenVG или WPF. Недавно я использовал XNA для графического приложения реального времени.

8
ответ дан 4 December 2019 в 08:34
поделиться

GDI + построен на GDI и добавляет несколько дополнительных функций. Например, GDI + добавляет поддержку прозрачности, растяжения растрового изображения со сглаживанием и т. Д.

GDI + - это в основном объектный API, а GDI - это функция api. Большинство функций GDI + не оптимизированы аппаратно (они обрабатываются программным обеспечением), в отличие от GDI. Например, в GDI BitBlt обрабатывается напрямую аппаратно. Функции рисования растровых изображений GDI + нет.

GDI + - мощный API, но будьте осторожны с его производительностью.

GDI + доступен в C ++, COM и .NET

9
ответ дан 4 December 2019 в 08:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: