ADN Open CIS
Сообщество программистов Autodesk в СНГ

07/08/2013

Делаем быстрыми worldDraw и viewportDraw пользовательского объекта

 

Вопрос:

Мой пользовательский примитив довольно сложный, и всякий раз, когда мои пользователи вызывают команды ПОВЕРНУТЬ (ROTATE)  или ПЕРЕНЕСТИ (MOVE) или что-то, что требует постоянного обновления графики, эти операции становятся очень прерывистыми и медленными. Как я могу исправить эту ситуацию?

Ответ:

Все функции графических примитивов класса AcGiGeometry возвращают Adesk::Boolean. Это то значение, которое следует проверять для того, чтобы AutoCAD мог эффективно уменьшить перерисовку графики чтобы повысить производительность пользовательского интерфейса.

Если возвращаемое значение равно TRUE, то это означает, что графическая подсистема подсчитала, что достигнуто значение минимальное количество кадров в секунду (FPS), и что запросы от мыши уже ожидают обработки во входной очереди. Условие TRUE требует, чтобы ваши методы worldDraw / viewportDraw завершались и возвращали управление AutoCAD’у как можно быстрее.

Вот пример:

Код - C++: [Выделить]
  1. Adesk::Boolean MyEntity::worldDraw(AcGiWorldDraw *wd)
  2. {
  3.     assertReadEnabled();
  4.     // Делаем огромный объем работы
  5.     for (int i=0; i<1000000; ++i)
  6.     {
  7.         // Проверяем не сообщает ли нам AutoCAD, что пользователь ожидает ввода
  8.         if (wd->geometry().circle(.., .., ..))
  9.             return (false); // прерываем работу, т.к. нужно рисовать новую порцию
  10.     }
  11. }



Источник: http://adndevblog.typepad.com/autocad/2013/04/making-your-custom-entity-worlddraw-or-viewportdraw-fast.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=146.0

Опубликовано 07.08.2013
Отредактировано 08.08.2013 в 14:59:31