|
0 / 0 / 0
Регистрация: 21.05.2019
Сообщений: 67
|
|||||||||||||||||||||
ООП. Можно ли зацикливать классы ради быстродействия?22.07.2019, 12:03. Показов 1066. Ответов 13
Метки нет (Все метки)
Добрый день!
Нужен совет касательно правильности придуманного мною подхода. Можно ли так делать или есть альтернативы. Ситуация: Как и две прошлые темы, продолжаю работать над генерацией геометрических объектов. Для начала кратко о том, как устроена программа сейчас. Кликните здесь для просмотра всего текста
Есть три основных эллемента: 1. Вершина (class Vertex)
При генерации мы рассчитываем и создаем вершины, затем вершины соединяем в полигоны, затем из полигонов генерируем меш объекта. Описание проблемы: Кликните здесь для просмотра всего текста
Для создания одного из объектов - хексогональной сферы (сфера из шестигранников) мне требовалось знать все полигоны, которые используют обрабатываемую вершину. Получая эту информацию я объедению их в тот самый шестиугольник. Следовательно, после преобразований, карта устаревает. Операция тяжелая, но выполняется всего один раз при генерации, а поэтому не слишком нагружала машину. Но теперь, аналогичная информация (какие полигоны используют данную вершину) мне нужна для расчета векторов нормали (для обработки освещения). Сохранять и использовать созданную в прошлом примере карту я не могу, так как: 1. Генерация карты вершин выполняется только для одного объекта - хексосферы 2. После генерации (как я писал ранее) карта устаревает. При этом расчет нормалей может происходить довольно часто, так как объект может изменять положение своих вершин, а следовательно и пересчет необходим "на лету", что уже довольно сильно нагружает систему при многополигональных объектах. Моя идея, которая похожа на решение, но, как мне кажется, нарушает ООП: Кликните здесь для просмотра всего текста
1. Добавляем в класс Vertex список полигонов, которые ее используют. 2. В класс Polygon добавляем get set, которые при изменении списка вершин полигона корректируют список полигонов в вершинах. Набрасываю код прямо тут, поэтому без оптимизации и циклов, просто как пример:
Как вы считаете, можно ли реализовывать подобное решение? С одной стороны объекты друг на друга завязаны больше, чем должны (как мне кажется), с другой я сразу при генерации и изменении обновляю карту высот и, при обработке, мне достаточно взять экземпляр вершины и посмотреть все полигоны, которые ей пренадлежат. Или может быть подскажете более изящное решение?
0
|
|||||||||||||||||||||
| 22.07.2019, 12:03 | |
|
Ответы с готовыми решениями:
13
Как у PERL c ООП? Можно ли создавать классы, наследование и т.д.?
|
|
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
|
|
| 22.07.2019, 12:31 | |
|
0
|
|
|
0 / 0 / 0
Регистрация: 21.05.2019
Сообщений: 67
|
|
| 22.07.2019, 12:48 [ТС] | |
|
0
|
|
|
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
|
||
| 22.07.2019, 13:14 | ||
|
0
|
||
|
0 / 0 / 0
Регистрация: 21.05.2019
Сообщений: 67
|
||
| 22.07.2019, 13:18 [ТС] | ||
|
Но заполнение и поддержка его актуальности сложнее и нагроможденнее выходит. Это более простой вариант, как кажется.
0
|
||
|
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
|
||
| 22.07.2019, 13:26 | ||
|
0
|
||
|
0 / 0 / 0
Регистрация: 21.05.2019
Сообщений: 67
|
||
| 22.07.2019, 13:37 [ТС] | ||
|
Во втором случае (с отдельным классом карты) нужно, как вы правильно заметили, отслеживать: 1. Удаление вершин 2. Изменения полигонов 3. Добавление вершин А это происходит в разных местах программы. В первом варианте реализации: 1. удалил вершину- удалил все связи 2. добавил новую вершину - связей нет 3. добавил связь (полигону указал на эту вершину) - полигон связь прописал В общем все в одном месте, быстрее и удобнее. Плюс не потребуется рефакторинг кода. Как ранее я с вершинам и полигонами работал - так и продолжаю. Просто теперь они все друг о друге знают и сами себя регулируют. Если же класс добавлять - то придется все процессы генерации дополнять записью в этот самый класс.
0
|
||
|
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
|
||
| 22.07.2019, 14:24 | ||
|
0
|
||
|
Модератор
|
||
| 22.07.2019, 14:27 | ||
|
Создаёте свой собственный класс для хранения полигонов в котором определяете методы: Удаление вершин, Изменения полигонов и Добавление вершин.В решениях могут применяться оба варианта - это зависит от деталей решения, оптимизации методов и других нюансов. Но лично мне больше нравится подход с отдельным хранением связей. Это получается типичный граф. Для него есть множество типовых решений. В первом варианте полигону (по сути вершине графа) требуется дополнительная информация о том, кто является его соседом. Эту информацию он может получить только от родительского объекта. Так если полигону надо за этой информацией обращаться к родителю, то почему тогда производную информацию в этом же родителе и не хранить? Но в реальности возникают разные нюансы. Допустим, если информация о связях нужна чаще чем информация о вершинах то второй вариант однозначно предпочтительно. Если же работа всегда идёт с отдельным полигоном их миллионы, и для каждого нужно быстрое получение списка соседей - то лучше первый вариант. Также во многих случаях имеет смысл хранить информацию о связях как в родителе, так и в полигоне дубликат выборки связей этого полигона из общего списка связей.
0
|
||
|
0 / 0 / 0
Регистрация: 21.05.2019
Сообщений: 67
|
||||||||||
| 22.07.2019, 14:52 [ТС] | ||||||||||
|
Здравствуйте, Элд Хасп!)
Финальный меш генерируется именно по информации из полигонов. Я не до конца уверен, что правильно осознал ваше сообщение про графы (сказываются пробелы в знаниях. про графы мало что знаю), но из всего прочего, правильно ли я понимаю, что оба варианта можно использовать? И мой вариант, где в каждой вершине хранить информацию о полигонах - не является чем-то идиотским?) Сейчас мне он кажется более простым и удобным, чем отдельное хранилище.
0
|
||||||||||
|
1483 / 938 / 454
Регистрация: 06.02.2012
Сообщений: 2,868
|
|
| 22.07.2019, 15:05 | |
|
OdIUm88, А что вы делаете если не секрет, Может есть более другой подход. Просто нужно понять вашу картину.
0
|
|
|
0 / 0 / 0
Регистрация: 21.05.2019
Сообщений: 67
|
||
| 22.07.2019, 15:13 [ТС] | ||
|
Это не секрет, конечно, но если не вдаваться в подробности - я попытался описать это в первом сообщении. Сейчас попробую чуть подробнее объяснить. Я пишу генератор объектов для Unity3d. Т.е. есть входная точка для пользователя: ShapeBuilder и есть объект класса Shape. Пользователь подключает библиотеку и пишет: Shape shape = ShapeBuilder.GenerateSphere(); или Shape shape = ShapeBuilder.GenerateHouse(); и т.д. Далее у него в shape набор вершин и полигонов, который можно отобразить в игре в виде меша. Т.е. построить из него меш. Для этого пользователь пишет: Mesh mesh = shape.GenerateMesh(); И этот меш уже движок отображает как отдельный 3д объект игровой. Сфера или Дом (из примера). Это общая концепция инструмента, который я пишу. Конкретная задача описана в первом посте. Да, я мог бы использовать стандартный инструмент юнити RecalculateNormals() для меша. Но это дороже и не гибко, так как сначала я создаю все точки, передаю все точки в меш, а потом еще раз по ним проходит юнити и считает нормаль. Так как объекты высокополигональные получаются - то решил сделать свои расчеты нормалей, чтобы в меш уже они попадали правильные. Ну, как-то так.
0
|
||
|
Заблокирован
|
||
| 23.07.2019, 13:01 | ||
|
В таких задачах обычно не используют ООП, так как он тянет за собой большой оверхед.
1
|
||
| 23.07.2019, 13:01 | |
|
Помогаю со студенческими работами здесь
14
Проблема в понимании ООП(абстрактные классы, классы интерфейсы) Изучаю Python, сейчас учу основы ООП, где можно найти задачи по ООП ООП Классы КЛАССЫ ООП ООП, Классы (Eclips) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|