Модераторы: Rickert

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Движок для GIS системы 
:(
    Опции темы
amarenkov
Дата 31.3.2008, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 21.2.2008
Где: Воронеж

Репутация: нет
Всего: нет



А кто-нибудь знает, на каком движке работает AutoCad? Мне необходим 2D-движок для создания подобия ГИС-системы, может кто подскажет, где искать smile?

И еще один вопрос, а из всех вышеперечисленных движков есть такие, которые могут генерировать WMF файлы сцены? Иными словами, мне необходимо результат его работы печатать, но вариант с растром не подходит.
PM MAIL ICQ   Вверх
arilou
Дата 31.3.2008, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 6
Всего: 61



amarenkov, AutoCAD работает на своем движке.

Добавлено через 2 минуты
а что входит в понятие "подобие ГИС-системы"? что она должна уметь делать?


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
amarenkov
Дата 31.3.2008, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 21.2.2008
Где: Воронеж

Репутация: нет
Всего: нет



Это программа для расчета рассеивания загрязняющих веществ. Должна позволять создавать карты из заданного набора примитивов (точка, полилиния, полигон, текст, прямоугольник, окружность и т.п.). Операции выделения примитивов, перемещения, преобразования. Операции с системами координат, масштабом. 

В данный момент основная проблема для меня - производительность. Все есть, все работает, но медленно... Я пишу на C# Net2.0 с помощью GDI+. GDI+ в основном из-за того, что теми же командами я могу создавать WMF-файлы для печати. DirectX, OpenGL и иже с ними не позволяют, на сколько я знаю, формировать файлы в каком-либо векторном виде. Сейчас производительность оптимизирую тем, что рисую в отдельном потоке и через заданные промежутки времени синхронизирую с основным потоком. При этом, понятное дело, получается так, что сцена отрисовывается не полностью, а как бы поэтапно. 

А когда смотрю на AutoCAD меня съедает черная зависть smile). У них же миллионы примитивов рисуются мгновенно... И печатается в любой формат файла, и на принтер печать идет отлично.

Вот и возник вопрос: как же они так делают? Как это у них получается smile?
PM MAIL ICQ   Вверх
arilou
Дата 31.3.2008, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 6
Всего: 61



Странно конечно. ИМХО, надо смотреть в сторону оптимизации путем группировки сходных объектов, и постановки их на рисование меньшим кол-вом вызовов ф-ций GDI+. 

Плюс еще -- ты рисуешь как - постоянно перерисовываешь, или только в OnPaint? У тебя всегда все примитивы рисуются, или только когда они попадают в видимую часть окна (т.е. карта всегда полностью помещается в окне?). Сколько примитивов на конвейер попадает? 


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
amarenkov
Дата 1.4.2008, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 21.2.2008
Где: Воронеж

Репутация: нет
Всего: нет



Цитата(arilou @  31.3.2008,  16:07 Найти цитируемый пост)
... группировки сходных объектов, и постановки их на рисование меньшим кол-вом вызовов ф-ций GDI+. 

Как это?

Поток рисует в свой Bitmap. Этот битмап отображается на OnPaint, или если поток закончил рисование, или если прошел заданный промежуток времени. Из теории построения интерфейсов отклик в 200 мс является допустимым. Таким образом у меня отрисовка сцены разбивается на промежутки времени по 200 мс. А когда поток дорисовал все - он останавливается, и на OnPaint происходит просто отрисовка битмапа потока. Если пользователь добавил объект или сместил зону видимости - все начинается сначала.

Я рисую только те примитивы, которые попадают в область видимости. Плюс к этому, если они находятся слишком далеко они рисуются либо точками, либо отрезками, либо прямоугольниками. А что именно ты подразумеваешь под "конвеером"?

С точки зрения оптимизации можно попробовать еще BSP-Tree. Но я не знаю, насколько это может ускорить работу?

У меня такое ощущение, что GDI+ сам по себе довольно медленный. То есть, набор из 1000 линий он часто не успевает отрисовать за 200 мс.
PM MAIL ICQ   Вверх
arilou
Дата 2.4.2008, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 6
Всего: 61



amarenkov, а ты не мог бы выложить кусок кода мегафункции, которая занимается отрисовкой примитивов?

Добавлено через 1 минуту и 51 секунду
теоретически, все это можно рисовать с помощью XNA. Только придется реализовать обертки для векторных примитивов. 


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
amarenkov
Дата 3.4.2008, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 21.2.2008
Где: Воронеж

Репутация: нет
Всего: нет



arilou, я могу smile. Но она вряд ли что-то разъяснит. Там все это дело поделено на несколько классов... Ну, вот, например отрисовка полилинии (привожу цепочку связанных функций):

Код

        public void DrawLines(Pen SomePen, SPointD[] Points, bool Closed)
        {
            if (Points.Length > 1)
            {
                for (int i = 1; i < Points.Length; i++)
                    DrawLine(SomePen, Points[i - 1], Points[i]);
                if (Closed) DrawLine(SomePen, Points[Points.Length - 1], Points[0]);
            }
        }

        public void DrawLine(Pen SomePen, SPointD Pd1, SPointD Pd2)
        {
            fobj_graphics.DrawLine(SomePen, fobj_viewPort.PointForDraw(Pd1), fobj_viewPort.PointForDraw(Pd2));
        }

        public PointF PointForDraw(SPointD Point)
        {
            return new PointF((float)(Point.x * fdbl_pixPerM * frec_scale.MapDReal), (float)(-Point.y * fdbl_pixPerM * frec_scale.MapDReal));
        }


То есть, здесь мои, какие-то внутренние координаты преобразуются в координаты изображения и рисуются.

Цитата(arilou @  2.4.2008,  17:47 Найти цитируемый пост)
... теоретически, все это можно рисовать с помощью XNA.


А эта ХНЯ (пардон, XNA smile) реально может сильно ускорить процесс отрисовки? Насколько процесс рисования по скорости будет отличаться от GDI+.

PM MAIL ICQ   Вверх
arilou
Дата 3.4.2008, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 6
Всего: 61



amarenkov, конечно ускорит! Там же 3D акселерация будет использоваться, плюс несколько уровней от API до железа напрямую обходится, за счет DirectX.

Добавлено через 1 минуту и 57 секунд
насчет кода -- покажи мегафункцию, котора разбирает список примитивов и вызывает соответствующие методы рисования, наверняка есть что-то типа

Код

void DoThePainting()
{
  for(int i=0; i<primitives.Count; i++)
  {
      Primitive p = primitives[i];
      switch(p.PrimitiveType)
          // .... etc
   }
}



--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
amarenkov
Дата 3.4.2008, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 21.2.2008
Где: Воронеж

Репутация: нет
Всего: нет



Цитата(arilou @  3.4.2008,  10:00 Найти цитируемый пост)
3D акселерация будет использоваться


О, а чем сможет помочь 3D акселерация с двух-мерной сценой? ИМХО, она будет мешать smile.

А, вот ты о какой функции smile. Вот кусок, который крутится во втором потоке (правда еще не до конца доработанный - переносил из Delphi):

Код

                            while (fenm_drawState == EMDThreadState.edtsDrawing && !End)
                            {
                                fobj_mutex.WaitOne();

                                if (iLayer < List.Count)
                                {
                                    if (List[iLayer] is CLayerGroup)
                                    {
                                        foreach (CLayerHierarchic Layer in (List[iLayer] as CLayerGroup))
                                            List.Add(Layer);
                                        iLayer++;
                                    }
                                    else if (List[iLayer] is CLayerFigures)
                                    {
                                        if (iFigures < (List[iLayer] as CLayerFigures).Count)
                                        {
                                            fobj_graph.DrawFigure((List[iLayer] as CLayerFigures)[iFigures]);
                                            iFigures++;
                                        }
                                        else
                                        {
                                            iFigures = 0;
                                            iLayer++;
                                        }
                                    }
                                    else iLayer++;
                                }
                                else End = true;

                                fobj_mutex.ReleaseMutex();
                            }


А вот функция, которую он вызывает для каждой фигуры:

Код

        public void DrawFigure(CFigure Figure)
        {
            if (frec_mapRect.Crosses(Figure.frec_border) && (Figure.fenm_state != EFigureState.efsDeleted) && (Figure.fobj_content != null))
            {
                if (Figure.fenm_state == EFigureState.efsSelected)
                {
                    fbol_drawingSelected = true;
                    fobj_currentPen = fobj_selectPen;
                    fobj_currentBrush = fobj_selectBrush;
                }
                else
                {
                    fbol_drawingSelected = false;
                    fobj_currentPen = fobj_layerPen;
                    fobj_currentBrush = fobj_layerBrush;
                }

                switch (Figure.fenm_type)
                {
                    case EFigureType.eftPoint: DrawPoint((CPoint)Figure.fobj_content); break;
                    case EFigureType.eftPlot: DrawPlot((CPlot)Figure.fobj_content); break;
                    case EFigureType.eftPolygon: DrawPolygon((CPolygon)Figure.fobj_content); break;
                    case EFigureType.eftPolyline: DrawPolyline((CPolyline)Figure.fobj_content); break;
                    case EFigureType.eftRect: DrawRect((CRect)Figure.fobj_content); break;
                    case EFigureType.eftText: DrawText((CText)Figure.fobj_content); break;
                }
            }
        }

PM MAIL ICQ   Вверх
arilou
Дата 3.4.2008, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 6
Всего: 61



Цитата(amarenkov @  3.4.2008,  11:40 Найти цитируемый пост)
О, а чем сможет помочь 3D акселерация с двух-мерной сценой? ИМХО, она будет мешать

как раз наоборот. просто ты будешь рисовать в проекции "сверху-вниз".

судя по всему, это будет наиболее предпочтительный вариант по производительности. 


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
addnr
Дата 27.6.2008, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 18.10.2006
Где: Украина

Репутация: нет
Всего: нет



PM MAIL ICQ   Вверх
amarenkov
Дата 16.7.2008, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 21.2.2008
Где: Воронеж

Репутация: нет
Всего: нет



Спасибо, addnr, MapInfo я знаю, но это не то smile. Проблема состояла в том, на чем мне писать свою ГИС. Мне нужен был либо движок (самый-самый простой - сложное я сам бы наворотил), либо такая технология, которая удовлетворяла все мои потребности (построение полигонов с дырками, печать результата в WMF и т.п.). MapInfo, инъекции AutoCad'a и т.п. не подходят smile.
PM MAIL ICQ   Вверх
QryStaL
Дата 17.7.2008, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: нет
Всего: 32



WPF ?


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
amarenkov
Дата 23.7.2008, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 21.2.2008
Где: Воронеж

Репутация: нет
Всего: нет



QryStaL, WPF не очень подходит, потому как это в корне иная технология. Это весь интерфейс на нее пересаживать надо. А у меня есть только панель (ну или что-то типа), на которой я должен выполнять свои задачи. Плюс, оно медленнее обычного DirectX (читал разные обзоры).
PM MAIL ICQ   Вверх
inkognitum
Дата 24.7.2008, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.8.2006
Где: г. Набережные Чел ны

Репутация: нет
Всего: 1



Добрый день, amarenkov.

В данный момент я занимаюсь написанием GIS движка.

Я сам не обладаю достаточным знанием чтобы использовать технологии OpenGL или D3D, но написанную объектную модель можно легко переписать под данные технологии. В данный момент я использую GDI+, могу дать несколько советов как можно ускорить работу.

Для начала я всю карту разбиваю на регионы (прямоугольники), и к каждому прямоугольнику принадлежит его список объектов. если весь прямоугольник попадаетя в поле видимости пользователя то рисуем все что находится в этом прямоугольнике, иначе пропускаем.. таким образом можно урезать большую часть карты и не пробегать ее.

так же имеется система слоев. т.е. объекты паралельно принадлежат и слою, слой виден при определенном зуме т.е. некоторые объекты которые очень малы, следует закрепить за слоем который виден только при огромном увеличении.

и такими способами можно значительно ускорить вывод графических элементов.

Желаю удачи.
--------------------
"Убить всех людей!" (с) Bender
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема »


 




[ Время генерации скрипта: 0.0887 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.