<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=415489&amp;view=findpost&amp;p=3822854</guid>
        <pubDate>Thu, 27 Feb 2020 13:37:40 +0000</pubDate>
        <title>Qt OpenGL VS &amp;quot;чистый openGL&amp;quot;</title>
        <link>https://forum.sources.ru/index.php?showtopic=415489&amp;view=findpost&amp;p=3822854</link>
        <description><![CDATA[_aap_: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=415489&view=findpost&p=3808224'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>kotmatroskin55 &#064; <time class="tag-quote__quoted-time" datetime="2019-08-27T13:54:31+03:00">27.08.19, 10:54</time></span><div class='quote '>kotmatroskin55</div></div><br>
Тема очень актуальная , подскажите ваше решение .<br>
Пробую QOpenGLWindow - Qt обрезает до 60 fps как не крути <br>
если через QGraphicsView/QGraphicsScene - тоже максимум 60 fps  , но сильно падает при сложной отрисовке.]]></description>
        <author>_aap_</author>
        <category>Кроссплатформенный C/C++: cl/gcc/Qt/Gtk+/WxWidgets</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=415489&amp;view=findpost&amp;p=3808224</guid>
        <pubDate>Tue, 27 Aug 2019 10:54:31 +0000</pubDate>
        <title>Qt OpenGL VS &amp;quot;чистый openGL&amp;quot;</title>
        <link>https://forum.sources.ru/index.php?showtopic=415489&amp;view=findpost&amp;p=3808224</link>
        <description><![CDATA[kotmatroskin55: в общем, как и предполагалось - дело было не в бобине. производительность удалось получить вполне вменяемую.]]></description>
        <author>kotmatroskin55</author>
        <category>Кроссплатформенный C/C++: cl/gcc/Qt/Gtk+/WxWidgets</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=415489&amp;view=findpost&amp;p=3808219</guid>
        <pubDate>Tue, 27 Aug 2019 10:44:44 +0000</pubDate>
        <title>Qt OpenGL VS &amp;quot;чистый openGL&amp;quot;</title>
        <link>https://forum.sources.ru/index.php?showtopic=415489&amp;view=findpost&amp;p=3808219</link>
        <description><![CDATA[xVekx: C qt5.4 вроде как с QGLWidget на QOpenGLWidget, QOpenGLWindow перекат был (сам мучился), <a class='tag-url' href='https://doc.qt.io/archives/qt-5.5/examples-widgets-opengl.html' target='_blank'>https://doc.qt.io/archives/qt-5.5/examples-...ets-opengl.html</a> <a class='tag-url' href='https://doc.qt.io/qt-5.12/examples-widgets-opengl.html' target='_blank'>https://doc.qt.io/qt-5.12/examples-widgets-opengl.html</a>.]]></description>
        <author>xVekx</author>
        <category>Кроссплатформенный C/C++: cl/gcc/Qt/Gtk+/WxWidgets</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=415489&amp;view=findpost&amp;p=3807935</guid>
        <pubDate>Fri, 23 Aug 2019 18:29:53 +0000</pubDate>
        <title>Qt OpenGL VS &amp;quot;чистый openGL&amp;quot;</title>
        <link>https://forum.sources.ru/index.php?showtopic=415489&amp;view=findpost&amp;p=3807935</link>
        <description><![CDATA[kotmatroskin55: Добрый вечер. Вашему вниманию новая серия моих приключений в чудном мире WinCE. <br>
<br>
Кратко опишу задачу: на вход передается массив точек для отображения трека заданной и фиксированной ширины средствами OpenGL, конкретно нужно строить этот трек средствами TRIANGLE_STRIP. А чтобы жизнь не казалась сказкой этот трек нужно вращать в произвольном направлении (вокруг произвольно заданной оси вращения, со всеми вытекающими преобразованиями координат), масштабировать, перемещать, про такие мелочи как изменение цвета, ширины пера я умалчиваю.   Ну и для полного счастья и максимального использования возможностей openGL будем применять шейдеры. Правда что это такое я узнал чуть более недели назад. <br>
Ладно, это не суть. В чем вопрос: имеется &quot;эталонная программа&quot;, написанная на &quot;голом openGL&quot;, демонстрирующая следующие результаты:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">10k - 48 fps</div><div class="code_line">50k - 35 fps</div><div class="code_line">300k - 13 fps (масштаб по умолчанию), 8-9 fps масштаб, при котором все точки находятся в видимой области</div><div class="code_line">для 10k/50k масштаб значения не имеет</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
Я предпринял две попытки реализации поставленной задачи на Qt. <br>
1) в QGraphicsView подсунул QGLWidget, в котором трек рисовал обычным QPainter  в PaintGL. Для этого случая у меня все хорошо с построением самого трека, а также дополнительными плюшками, которые дает использование QGraphicsView/QGraphicsScene, но очень плохо с производительностью, возможно я избрал не самый верный подход - я брал несчастный QGraphicsPolygonItem и пихал в него силой  все 300 000 точек. От чего ему, естественно, плохело. Ну и о производительности говорить не приходилось в этом случае. Для чистоты эксперимента запрещено думать об интерполяции, построении вместо полигона на 100 точек, лежащих на одной прямой этой самой прямой по двум точкам (я проводил эксперимент, у меня вместо 300 000 точек получилось около 800, ну и производительность, естественно выросла до космических скоростей). Я сейчас не понимаю что я курил, когда писал этот код, но не суть. Выглядит он, примерно, так:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp;void SnowWindow::populateScene()</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;m_trackScene = new QGraphicsScene(this);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;QString filename = QFileDialog::getOpenFileName(this, tr(&quot;open CSV data&quot;), tr(&quot;&quot;), tr(&quot;*.csv&quot;));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PointArray points = get_points(filename);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// Populate scene</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;QGraphicsPolygonItem *polygon_item = new QGraphicsPolygonItem;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;QPolygonF polygon;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;QVector2D point;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int idx = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;foreach (point, points) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if((++idx % 100) == 0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;QGraphicsSimpleTextItem *textItem = new QGraphicsSimpleTextItem;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;textItem-&#62;setText(&quot;T&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;textItem-&#62;setPos(point.toPointF());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;textItem-&#62;setZValue(0.35);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_trackScene-&#62;addItem(textItem);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;polygon &#60;&#60; point.toPointF();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;polygon_item-&#62;setPolygon(polygon);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;QPen pen; &nbsp;// creates a default pen</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pen.setStyle(Qt::SolidLine);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pen.setWidth(3);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pen.setBrush(QBrush(Qt::green, Qt::DiagCrossPattern));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;polygon_item-&#62;setPen(pen);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;polygon_item-&#62;setZValue(0.25);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;m_trackScene-&#62;addItem(polygon_item);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div></ol></div></div></div></div><br>
но на 300к точек выдает не более 4 fps. Есть ненулевая вероятность, что даже для этого варианта можно существенно повысить производительность, правда я не знаю как. <br>
Еще один вариант -уже с использованием шейдеров.  Честно скажу, я долго курил <a class='tag-url' href='https://habr.com/ru/post/319144/' target='_blank'>этот мануал</a> точнее весь курс, но видимо особых успехов не добился, ибо моя реализация выдает следующие результаты:<br>
10 000 точек - 48-70 FPS;<br>
50 000 - 17-25 FPS;<br>
100 000 - 11-15 FPS;<br>
200 000 - 7-11 FPS:<br>
300 000 - 4-5 FPS - во всех случаях независимо от масштаба. Весь код приводить не буду, скажу только, что после заполнения вершинами метод draw  выглядит так:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp;void SnowTrack::drawTrueData()</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;m_program-&#62;setAttributeArray(m_vertexAttr, m_trueVertices.data(), 3);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;m_program-&#62;setAttributeArray(m_colorAttr, m_trueColors.data(), 3);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;m_program-&#62;enableAttributeArray(m_vertexAttr);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;m_program-&#62;enableAttributeArray(m_colorAttr);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;glDrawArrays(GL_TRIANGLE_STRIP, 0, m_trueVertices.size() / 3);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;m_program-&#62;disableAttributeArray(m_vertexAttr);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;m_program-&#62;disableAttributeArray(m_colorAttr);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div></ol></div></div></div></div><br>
а вершинный шейдер настолько примитивен, что даже самому грустно. <br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">attribute highp vec4 vertexAttr;</div><div class="code_line">uniform mediump mat4 matrix;</div><div class="code_line">attribute lowp vec4 colorAttr;</div><div class="code_line">varying lowp vec4 color;</div><div class="code_line">&nbsp;</div><div class="code_line">void main()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;gl_Position = matrix * vertexAttr;</div><div class="code_line">&nbsp;&nbsp; &nbsp;color = colorAttr;</div><div class="code_line">}</div></ol></div></div></div></div><br>
в &quot;эталонной&quot; программе он сильно другой, но я так понимаю, что это влияет на положение вершин в пространстве, но никак не на производительность. Если я не прав, то тогда все совсем плохо. Хотя может и наоборот - все хорошо и я смогу догнать и перегнать америку. <br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp;const char* pszFragmentShader = &quot;\</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;precision mediump float;\</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;varying vec4 trifragmentColor;\</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;vec4 tricolor;\</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;void main()\</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{\</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;gl_FragColor = trifragmentColor;\</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}&quot;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;const char* pszVertexShader = &nbsp; &quot;\</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;attribute vec3 trianglePosition_modelspace;\</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;attribute vec3 triangleColor;\</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;varying vec4 trifragmentColor;\</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;uniform mat4 MVP;\</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;void main()\</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{\</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;gl_Position = MVP * vec4(trianglePosition_modelspace, 1.0);\</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;trifragmentColor = vec4(triangleColor, 1.0);\</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}&quot;;</div></ol></div></div></div></div><br>
<br>
Ну и отсюда вопрос  к знающим людям: насколько реально получить средствами связки Qt OpenGL производительность аналогичную &quot;голому OpenGL&quot;. По умолчанию предполагаем, что мой код, мягко говоря, не оптимален. Собственно для чего все это затевалось - показать, что средствами Qt можно обеспечить аналогичную производительность, а вместе с ней и все вкусности самого(ой?) Qt. Ибо писать на 03 стандарте меня не особо прельщает, да и сочинение очередной козы на лисапеде точно не добавит производительности приложению, будь оно даже на ассемблере написано. О скорости разработки и количестве багов даже подумать страшно. Но реалии таковы, что приходится выбирать. Сроки по доказательству производительности Qt стремительно мчатся к точке невозврата, а потому надеюсь на ваши мудрые советы, кои спасали меня здесь неоднократно.]]></description>
        <author>kotmatroskin55</author>
        <category>Кроссплатформенный C/C++: cl/gcc/Qt/Gtk+/WxWidgets</category>
      </item>
	
      </channel>
      </rss>
	