О редактировании при помощи ручек и производительности
Если исследовать файлы заголовков ObjectARX SDK, то можно заметить, что реализация редактирования с помощью ручек (Gripedit) использует механизм клонирования при перетаскивании. Это означает, что каждый раз, когда курсор перемещается, AutoCAD создаёт новые клоны «захваченных» примитивов и сразу отбрасывает эти клоны.
Этот механизм предотвращает потерю точности. Вот почему мы повторно инициализируем временную копию каждый раз, прежде чем вызвать его метод moveGripPointsAt, и выполняем "полный" переход от исходного объекта в текущую позицию, вместо серии последовательных трансформаций.
Для того, чтобы правильно инициализировать временный примитив, мы постоянно создаем временную копию и вызываем её конструктор. Затем мы вызываем метод dwgOutFields исходного примитива и передаем результат в метод dwgInFields временной копии. Затем вызываем методы moveGripPointsAt и worldDraw временной копии и удаляем её после этого.
Наш менеджер кучи достаточно умен, чтобы всегда повторно использовать одну и ту же память для этих временных объектов, так что этот механизм является в основном довольно эффективным. Оператор delete объекта AcDbObject сохраняет указатель, который оператор new использует при следующем вызове.
Кроме того вы сами можете сделать много других вещей, чтобы ускорить процесс клонирования:
1. Сделать конструктор по умолчанию вашего примитива настолько простым, насколько это возможно.
2. В реализации dwgInFields / dwgOutFields проверяйте типы файлер: kCopyFiler, kDeepCloneFiler и kWblockCloneFiler. Эти типы файлера указывают, что происходит операция копирования в оперативной памяти. В этих случаях, просто сохраните ваш указатель в методе dwgOutFields. В методе dwgInFields, прочитайте указатель и скопируйте состояние примитива путём разыменования указателя. Я использовал этот механизм в примере «Asdkbodyapp» в Amodeler, что значительно повысило производительность.
3. Используйте частичную отмену («partial undo»). Таким образом, вы сможете избавиться от вызова файлера kUndoFiler в методах dwgInFields / dwgOutFields.
Источник: http://adndevblog.typepad.com/autocad/2013/01/about-gripedit-and-performance.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=45.0
Отредактировано 06.06.2013 в 01:10:29