none
Непонятная работы объекта Graphics RRS feed

  • Общие обсуждения

  •     Суть проблемы.
        На C# разработан сложный комплекс, активно использующий графику. Так как комплекс содержит много процедур и функций в которых производится графический вывод используется объект Graphics, получаемый через Graphics.FromHwnd. Комплекс работает без ошибок, но оставляет желать лучшего скорость выполнения графических операций.
        Сделал маленькие тесты, чтобы исследовать скорость работы отдельных блоков программы. В процессе исследований столкнулся с абсолютными непонятными для меня моментами. Так, если в тестах рисовать через объект Graphics, полученный через Graphics.FromHwnd (или CreateGraphics), то скорость графических операций в 3-5 раз!!! медленнее, чем с использованием объекта Graphics в обработчике OnPaint.
         На мой вгляд такого быть не должно и скорость выполнения графических операций должна быть одинакова. Для меня это критично, поскольку я не имею возможности в своей программе
    реализовать весь вывод в обработчике OnPaint (или через подписку на это событие).
    Прилагаю равнозначные тесты наглядно подтверждающие разницу в скоростях объекта Graphics, который получается различными способами (в OnPaint и Graphics.FromHwnd(CreateGraphics)).
    Скорости их работы: test1 - 5.56 сек; test2 - 14.90 сек; test3 - 14.78 сек.

    Для простоты они сделаны без проектов в виде тектовых файлов. Я компилировал их через CSC вот так:
    c:\windows\microsoft.net\framework\v2.0.50727\csc.exe test1.cs
    c:\windows\microsoft.net\framework\v2.0.50727\csc.exe test2.cs
    c:\windows\microsoft.net\framework\v2.0.50727\csc.exe test3.cs
        Пробовал в версии .NET Framework 3.5 - результат такой же.

        Прошу помочь разобраться почему так разнится скорость работы тестов с использованием объекта Graphics, получаемым различными способами. На мой взгляд все три теста должны работать с одинаковой скоростью.

    test1: Графический вывод осуществляется в OnPaint. Объект Graphics берется из PaintEventArgs.
    test2: Графический вывод осуществляется в OnPaint. Объект Graphics получен через Graphics.FromHwnd.
    test3: Графический вывод осуществляется в обработчике нажатия кнопки. Объект Graphic sполучен через Graphics.FromHwnd. Для того, чтобы не блокировалась очередь сообщений окна добавлен метод Application.DoEvents()ю

      Тесты можн взять здесь: http://narod.ru/disk/12060377000/tests.zip.html

    • Перемещено Michael Mix 15 сентября 2009 г. 17:39 не отвечает тематике (От:Small Basic)
    • Изменен тип I.Vorontsov 2 августа 2010 г. 5:36
    • Перемещено SachinW 1 октября 2010 г. 21:28 MSDN Forums Consolidation (От:Начинающие разработчики)
    16 августа 2009 г. 15:27

Все ответы

  • Уважаемый пользователь!

     

    В вашей теме отсутствует активность в течение последних 5 дней. При отсутствии каких-либо действий в течение 2 последующих дней, тема будет переведена в разряд обсуждений. Вы можете возобновить дискуссию, просто оставив сообщение в данной теме.


    Для связи [Mail]
    15 июля 2010 г. 5:21