Делаем быстрыми worldDraw и viewportDraw пользовательского объекта
Вопрос:
Мой пользовательский примитив довольно сложный, и всякий раз, когда мои пользователи вызывают команды ПОВЕРНУТЬ (ROTATE) или ПЕРЕНЕСТИ (MOVE) или что-то, что требует постоянного обновления графики, эти операции становятся очень прерывистыми и медленными. Как я могу исправить эту ситуацию?
Ответ:
Все функции графических примитивов класса AcGiGeometry возвращают Adesk::Boolean. Это то значение, которое следует проверять для того, чтобы AutoCAD мог эффективно уменьшить перерисовку графики чтобы повысить производительность пользовательского интерфейса.
Если возвращаемое значение равно TRUE, то это означает, что графическая подсистема подсчитала, что достигнуто значение минимальное количество кадров в секунду (FPS), и что запросы от мыши уже ожидают обработки во входной очереди. Условие TRUE требует, чтобы ваши методы worldDraw / viewportDraw завершались и возвращали управление AutoCAD’у как можно быстрее.
Вот пример:
- Adesk::Boolean MyEntity::worldDraw(AcGiWorldDraw *wd)
- {
- assertReadEnabled();
- // Делаем огромный объем работы
- for (int i=0; i<1000000; ++i)
- {
- // Проверяем не сообщает ли нам AutoCAD, что пользователь ожидает ввода
- if (wd->geometry().circle(.., .., ..))
- return (false); // прерываем работу, т.к. нужно рисовать новую порцию
- }
- }
Обсуждение: http://adn-cis.org/forum/index.php?topic=146.0
Отредактировано 08.08.2013 в 14:59:31