Alex
AlexТам. 28, 2017, 6:07 Т.Ж.

Qml приложение, графические объекты и многопоточность.

Добрый день, подскажите пожалуйста как правильно поступить. Есть условно приложение, графика реализована на QML, логика на С++, связь идёт через сигналы-слоты, функции, в программе на квадратном поле перемещается одиночный объект, объект может создавать другие объекты которые потом перемещаются по прямой пока не выходят за край квадрата. Проблема в том что когда объект один он отлично перемещается по полю, как только мы создаём другой объект то перемещение идёт как бы по очереди, мне нужно чтобы порождаемые объекты перемещались без задержек и сам объект который их создаёт перемещался без задержек. Вопрос: как правильно спроектировать данное приложение под многопото́чность . Возможно я что то упустил, пишите я буду рад услышать ваши советы, так как не имею опыт в данном вопросе.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

12
Evgenii Legotckoi
  • Там. 28, 2017, 6:18 Т.Ж.

Добрый день!
Перемещение происходит по какому-то таймеру?
Вопрос похож на реализацию игровой логики частично. Можно делать таймер в каждом объекте, который будет инициализиаровать передвижение своего хозяина. Это должно сделать как минимум более независимый вариант движения. Частота сработки таймера также должна быть достаточно высокой, возможно также 1 мс. Тогда для глаза будет не заметна, очерёдность движения. Если только объектов не слишком много на поле.

    Alex
    • Там. 28, 2017, 6:47 Т.Ж.
    • (өңделген)

    Да, так как вы и сказали перемещение порождаемых объектов происходит по таймеру, каждые пол секунды смещается на определённое расстояние. Может как то эти объекты нужно вынести в поток чтобы отрисовка не торомозила при движении главного объекта ? Если интересно могу код предоставить. 

      Evgenii Legotckoi
      • Там. 28, 2017, 6:52 Т.Ж.
      • (өңделген)

      А насколько много получается используемых объектов в итоге?
      И таймер используется один для всех объектов? Или каждый объект использует свой таймер?
      Если используется один общий таймер, то всё равно будет последовательность срабатываний, даже если в отдельный поток поставите какую-то логику. Сами объекты вынести в отдельные потоки не выйдет, они должны будут существовать в потоке GUI, поэтому можно вынести в отдельные потоки только некоторую лоигку расчётов, а потом возвращать результат в объект, но если расчёты не тяжелые, то и смысла особенного нет в отдельных потоках.
      К тому же, всё равно последовательность срабатывания слотов у объектов будет выполнятся в определённой очереди. Так что очерёдность будет сохраняться в любом случае. Здесь как вариант увеличивать скорость срабатывания таймера и делать по таймеру на каждый объект, чтобы они были независимы друг от друга.

        Alex
        • Там. 28, 2017, 7 Т.Ж.

        Пока что используется 2 объекта, главный и порождаемый, таймер пока что один для порождаемого объекта, но тормозит все равно, сейчас попробую изменить функции, чтобы вся работа по расчётам  была вынесена в с++, есть пару функций расчёта непосредственно в Qml, гляну может пропадёт торможение, оптимизирую отпишусь. Спасибо.

          Evgenii Legotckoi
          • Там. 28, 2017, 7:07 Т.Ж.

          У вас движение через что реализовано? Через прикрепляемое свойство Behaviour on x, Behaviour on y?

            Alex
            • Там. 28, 2017, 7:11 Т.Ж.

            В Qml при нажатии по клавишам вверх, вниз, влево, вправо генерируется сигнал, передаётся в логику, меняем координаты объекта, генерируем сигнал перерисовки, объект переместился.

              Evgenii Legotckoi
              • Там. 28, 2017, 7:23 Т.Ж.
              • (өңделген)

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

                Evgenii Legotckoi
                • Там. 28, 2017, 7:41 Т.Ж.
                • (өңделген)

                Вообще, чтобы не наблюдалиь лаги и тормоза в тех случаях, когда нужно быстро изменять объекты и их положение в окне приложения (это касается игр и чего-либо подобного в плане логики), то везде рекомендуется поддерживать частоту обновления не ниже 60 FPS, а это значит, что таймер должен срабатывать раз в 16 мс, а не раз в пол секунды.

                  Alex
                  • Там. 28, 2017, 8:40 Т.Ж.

                  Подправил функции нашёл в чём проблема. Получается у меня функция перемещения главного графического объекта и функция перемещения создаваемого объекта вызывают одну и ту же функцию перерисовки поэтому и получается такая задержка, вот сейчас думаю как их реализовать независимо друг от друга. Заранее извиняюсь то что в теме нет кусков кода,  очень интересно как правильно спроектировать приложение, а то написал а оно глючит.

                    Evgenii Legotckoi
                    • Там. 28, 2017, 8:42 Т.Ж.

                    Как вариант, реализовать функции перемещения внутри каждого объекта, и просто вызывать их функции перемещения. Можно даже как Q_INVOKABLE методы в C++ написать. А координаты устанавливать через setProperty("x", coord);

                      Alex
                      • Там. 30, 2017, 1:02 Т.Қ.

                      Спасибо Евгений за наставление, вы были правы, я создал для каждого объекта свою функцию прорисовки, и прорисовка идёт не по всёй области а только лишь того участка где произошло изменения. Сигналами из с++ передаю координаты с изменениями. Тормоза пропали, приложение стало нормально работать. То есть нужно было правильно понять как происходит обмен данными между логической и графической частью проекта  а потом  уже потом программировать.

                        Evgenii Legotckoi
                        • Там. 31, 2017, 3:07 Т.Ж.

                        Весь порадокс в том, что в начале пути трудно понять как и что работает, пока не начнёшь программировать.

                          Пікірлер

                          Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                          Кіріңіз немесе Тіркеліңіз
                          AD

                          C++ - Тест 004. Указатели, Массивы и Циклы

                          • Нәтиже:50ұпай,
                          • Бағалау ұпайлары-4
                          m
                          • molni99
                          • Қаз. 26, 2024, 1:37 Т.Ж.

                          C++ - Тест 004. Указатели, Массивы и Циклы

                          • Нәтиже:80ұпай,
                          • Бағалау ұпайлары4
                          m
                          • molni99
                          • Қаз. 26, 2024, 1:29 Т.Ж.

                          C++ - Тест 004. Указатели, Массивы и Циклы

                          • Нәтиже:20ұпай,
                          • Бағалау ұпайлары-10
                          Соңғы пікірлер
                          ИМ
                          Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
                          Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                          Evgenii Legotckoi
                          Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
                          Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                          A
                          ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
                          Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                          ИМ
                          Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
                          Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                          d
                          dblas5Шілде 5, 2024, 11:02 Т.Ж.
                          QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                          Енді форумда талқылаңыз
                          m
                          moogoҚар. 22, 2024, 7:17 Т.Ж.
                          Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
                          Evgenii Legotckoi
                          Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
                          добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                          t
                          tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
                          google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                          NSProject
                          NSProjectМаусым 4, 2022, 3:49 Т.Ж.
                          Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

                          Бізді әлеуметтік желілерде бақылаңыз