САПР на Lazarus
Модератор: Модераторы
zub, кончай уже его кормить.
Предлагаю свой вариант:
1. Базовый класс делать со счётчиком ссылок, как TInterfacedObject
2. У объекта есть флаг "я труп".
3. При удалении из структуры, не вызывать деструктор, а ставить флаги "я изменился" и "я труп" и присваивать nil
4. Каждый вторичный содержатель (вьюпорт, дерево и т.п.) при каждом тыке к объекту проверяет: это труп? Тогда вместо запланированной операции с ним (сообщение, отрисовка) удалить его из себя. Таким образом, экземпляр класса реально удалится когда все вьюпорты и прочие проснутся и обнаружат, что он труп.
5. Каждый отрисовщик пробегает по флагам "я изменился" входящих в него объектов при клике мышью или лениво, скажем, 10 раз в секунду.
З.Ы. Все эти паттерны, MVC - они для работы командой. Одиночке они только добавляют два кило ненужного оверхеда.
Предлагаю свой вариант:
1. Базовый класс делать со счётчиком ссылок, как TInterfacedObject
2. У объекта есть флаг "я труп".
3. При удалении из структуры, не вызывать деструктор, а ставить флаги "я изменился" и "я труп" и присваивать nil
4. Каждый вторичный содержатель (вьюпорт, дерево и т.п.) при каждом тыке к объекту проверяет: это труп? Тогда вместо запланированной операции с ним (сообщение, отрисовка) удалить его из себя. Таким образом, экземпляр класса реально удалится когда все вьюпорты и прочие проснутся и обнаружат, что он труп.
5. Каждый отрисовщик пробегает по флагам "я изменился" входящих в него объектов при клике мышью или лениво, скажем, 10 раз в секунду.
З.Ы. Все эти паттерны, MVC - они для работы командой. Одиночке они только добавляют два кило ненужного оверхеда.
zub писал(а):а шо, если в системе нет OpenGL то и не выбрить ничего?
Ну не перебирать же в оффлане все примитивы.
Добавлено спустя 18 минут 16 секунд:
ElectroGuard писал(а):Надо понимать простую вещь. Что MVC - далеко не панацея от всех бед.
Серьезная и большая система как правило сводится к этому. - к разделению труда.
Есть нод, он обладает некими данными, неким личным поведением, все остальное - может взять из API(его не так много).
В целом система получается не сильно громоздкой.
Cheb
Спасибо, подумаю. но пока склоняюсь к хранению в объекте ссылок на всех "представителей" и при вызове например doYouChanged у объекта, заодно вызывать и doYouChanged у всех пердставителей.
olegy123
>>Ну не перебирать же в оффлане все примитивы.
Типа с glSelect их ненадо перебирать)) Выбор примитивов делаю математически
Спасибо, подумаю. но пока склоняюсь к хранению в объекте ссылок на всех "представителей" и при вызове например doYouChanged у объекта, заодно вызывать и doYouChanged у всех пердставителей.
olegy123
>>Ну не перебирать же в оффлане все примитивы.
Типа с glSelect их ненадо перебирать)) Выбор примитивов делаю математически
С glSelect - что вижу то сохраняю.. оно "аппаратное" и тратится на перебор вхождений не надо. Тем более результат можно упаковать так что в одном ID будет отражено все.
Недавно заново переписал проекта с нуля - уменьшил еще на 10% размер кода. Общие функции перевел в статичные. Сделал ядро Core в котором определил базовые вещи. Все остальные вынес за ядро.
Не стал делать подсчет ссылок - уверовал в то что оно "для ленивых", не умеющих точно знать где и как нужно уничтожать объект. И оно вредно при многопоточности. Требуется дополнительно вводить ароматность и синхронизацию, что в разы усложняет работу.
По поводу ссылок - а зачем они нужны? Их роль в чем? В том что другому объекту вызвать когда нибудь калбак doYouChanged? Вводить подобие QT слоты?
Можно ли решить иными способами?
Конечно:
Добавлено спустя 8 минут 1 секунду:
Это уже какая то виртуальная машина со сборкой мусора получается.. Вот до чего доводят "ленивые" ссылки.
Недавно заново переписал проекта с нуля - уменьшил еще на 10% размер кода. Общие функции перевел в статичные. Сделал ядро Core в котором определил базовые вещи. Все остальные вынес за ядро.
Не стал делать подсчет ссылок - уверовал в то что оно "для ленивых", не умеющих точно знать где и как нужно уничтожать объект. И оно вредно при многопоточности. Требуется дополнительно вводить ароматность и синхронизацию, что в разы усложняет работу.
По поводу ссылок - а зачем они нужны? Их роль в чем? В том что другому объекту вызвать когда нибудь калбак doYouChanged? Вводить подобие QT слоты?
Можно ли решить иными способами?
Конечно:
1)
глобализировать doYouChanged, а объекту хранить указатели на "подписантов"..
Объект вызывает статичную doYouChanged, и там Assigned всех подписантов.. Оно стабильно работает даже в многозадачном режиме.
2)
сделать систему сообщений. Объект посылает сообщения - кто "подписан" узнает об этом и делает нужные операции. Именно так делают многопоточные системы - у них сильно развита система сообщений.
Добавлено спустя 8 минут 1 секунду:
Cheb писал(а):3. При удалении из структуры, не вызывать деструктор, а ставить флаги "я изменился" и "я труп" и присваивать nil.
..
5. Каждый отрисовщик пробегает по флагам "я изменился" входящих в него объектов при клике мышью или лениво, скажем, 10 раз в секунду.
Это уже какая то виртуальная машина со сборкой мусора получается.. Вот до чего доводят "ленивые" ссылки.
>>оно "аппаратное" и тратится на перебор вхождений не надо
оно не аппаратное
оно депрекатед емнип
тратится надо, т.к. ты настраиваешь соответственно матрицы и отрисовываешь кадр
тут нечего обсуждать - математически выбирать универсальней, надежней, независимей....
>>По поводу ссылок - а зачем они нужны? Их роль в чем?
есть примитив, есть представитель этого примитива в какомто дереве. примитив удаляется. в дерево приходит информация (неважно как, сообщением или калбеком) что примитив удален.
Если мы не храним в примитиве информациию о том какая нода дерева "олицетворяет" данный примитив (и соответственно не посылаем ее дереву), то дереву придется производить поиск нужной ноды - это очень накладно.
оно не аппаратное
оно депрекатед емнип
тратится надо, т.к. ты настраиваешь соответственно матрицы и отрисовываешь кадр
тут нечего обсуждать - математически выбирать универсальней, надежней, независимей....
>>По поводу ссылок - а зачем они нужны? Их роль в чем?
есть примитив, есть представитель этого примитива в какомто дереве. примитив удаляется. в дерево приходит информация (неважно как, сообщением или калбеком) что примитив удален.
Если мы не храним в примитиве информациию о том какая нода дерева "олицетворяет" данный примитив (и соответственно не посылаем ее дереву), то дереву придется производить поиск нужной ноды - это очень накладно.
Самому нужно писать свой язык с VM или транслятор в Jit код. Созрел я до этого.
Эпохальный момент - напечатал чертеж из zcad`а. Не первый, раньше я уже печатал, но это была монструальная надстройка над opengl. а сечас порисовал CanvasDrawer`ом на TPrinter.canvas... красота!
Пересылка матрицы в OpenGL значительнее быстрее чем перебор 15К примитивов.zub писал(а):тратится надо, т.к. ты настраиваешь соответственно матрицы и отрисовываешь кадр
тут нечего обсуждать - математически выбирать универсальней, надежней, независимей....
Сразу видно ты не в теме))
VBO, Списки разве они медленнее?
zub писал(а):Эпохальный момент - напечатал чертеж из zcad`а. Не первый, раньше я уже печатал, но это была монструальная надстройка над opengl. а сечас порисовал CanvasDrawer`ом на TPrinter.canvas... красота!
Поздравляю, действительно большое дело! Как не крути, но печать чертежа из CADа необходима. ZCAD еще на шаг стал независимей от других CAD программ.
В канву 3D рисовать? Еще Raytracer прикрутите.
не проще битмап из OpenGL печатать?
не проще битмап из OpenGL печатать?
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
olegy123, на самом деле, не проще. OpenGL/DirectX годятся для игр, но вся серьезная графика до сих пор обсчитывается. преимущественно процессором. Показать ее потом можно хоть графопостроителем, но как дополнительный модуль-визуализатор. И не стоит забывать, что в играх обсчет сделан заранее, поэтому можно достаточно легко двигать картинки относительно друг-друга, а в САПР пересчет может быть почти всего.
>>не проще битмап из OpenGL печатать?
Печатать надо вектором!
>>VBO, Списки разве они медленнее?
20к примитивов. каждый состоит из десятка-другого других примитивов. даже на элементарном отрезке желательно знать не только факт попадания помышку, но и в какой точке он подмышку попал... VBO не медленней, оно совсем про другое
Печатать надо вектором!
>>VBO, Списки разве они медленнее?
20к примитивов. каждый состоит из десятка-другого других примитивов. даже на элементарном отрезке желательно знать не только факт попадания помышку, но и в какой точке он подмышку попал... VBO не медленней, оно совсем про другое
Лекс Айрин писал(а):olegy123, на самом деле, не проще. OpenGL/DirectX годятся для игр, но вся серьезная графика до сих пор обсчитывается. преимущественно процессором. Показать ее потом можно хоть графопостроителем, но как дополнительный модуль-визуализатор.
Т.е. Blender,3D Studio Max не могут рисовать? По моему даже очень могут и рисуют.
Мне показывали чертежи которые рисовали вообще в паинтбраше. AutoCAD сложный, а паинтбраш - бери и рисуй.
CAD не делает обсчетов? Все делает.Лекс Айрин писал(а):И не стоит забывать, что в играх обсчет сделан заранее, поэтому можно достаточно легко двигать картинки относительно друг-друга, а в САПР пересчет может быть почти всего.
Та же Unity3d - чем не векторный редактор/CAD для виртуального мира.
Другое дело, что Blender нет привычного для инженерного дела функционала. Но допилить его вполне можно.
По поводу вопроса что OpenGL <> Canvas.. OpenGL - это визуализатор + callback функция( не одна) ===> ровно тоже самое вы сами делаете в Canvas.
Добавлено спустя 26 минут 36 секунд:
судя по статье:
https://habrahabr.ru/post/264243/
Там проблема есть в точности 1e-6.. Действительно не все ускорители могут работать с GLdouble числами, для них базовое GLsingle. Что в этом есть существенная потеря в точности.
Но это можно учитывать - отображать в масштабе.
