Developer Tales or everything about everything

16Янв/143

Перемещение окна без заголовка с помощью мыши

Что делать, если хочется сделать красивое окно с помощью всех возможностей стилизации Qt и нужно убрать стандартный каркас окна операционной системы?

С кнопками "Свернуть", "Развернуть во весь экран", "Закрыть" все ясно - просто добавляет кнопки с такой же функциональностью в QToolBar или в любое другое место в окне.

Но остается еще одна задача - научить мышь перемещать окно, ведь окно, которое нельзя сдвинуть - это просто ужас для любого пользователя.

StackOverflow подсказывает одно из самых удачных решений, однако, автор лучшего поста не учел одну вещь: если в окне имеется QToolBar, или любая кнопка типа QPushButton, то появится неприятный баг: если нажать кнопку мыши на кнопке, и затем переместить курсор в свободную область окна, то окно начнет прыгать по экрану.

Поэтому, помимо mousePressEvent(MouseEvent*) и mouseMoveEvent(MouseEvent*), нужно добавить еще один обработчик событий: mouseReleaseEvet(QMouseEvent*).

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

Обнуление значений mpos в событии mouseReleaseEvent обеспечивает вменяемое поведение окна при нажатии на кнопки.

Просмотров: 3207
14Дек/126

Анализ производительности std::vector, std::list & std::deque

В этой статье рассматривается тестирование производительности стандартных STL-контейнеров C++: std::vector, std::list и std::deque. Тестирование скорости работы контейнеров проводится для операций вставки, поиска и удаления.

Эта статья является переводом, оригинальная статья находится здесь.

В основном std::list следует использовать, если ожидается выполнение операций случайных вставок и удалений элементов из контейнера (сложность O(1) против O(n) для вектора (vector) или двусвязной очереди (deque)). Если рассматривать только сложность выполнения, то линейный поиск в обоих контейнерах эквивалентен - его сложность составляет O(n). Когда осуществляется вставка или удаление элементов в векторе или двусвязной очереди, все данные, следующие за позицией, над которой проводится операция, должны быть перемещены в памяти, фактически это означает, что каждый элемент должен быть скопирован. Именно по этой причине при определении производительности очень важен размер данных, короые будут помещены или уже находятся в контейнере.

Однако, теория обычно расходится с практикой: на практике часто используют кэш памяти. Данные в векторе располагаются последовательно, в то время, как данные списка могут быть размещены в разных участках памяти. Что это дает? Двусвязная очередь - это структура, которая нацелена на получение всех преимуществ std::list и std::vector и избежание их недостатков.

Все тесты проводились на Intel Core i7 Q 820 @ 1.73GHz на GCC 4.7.2 с параметрами -02 и -march=native. Код скомпилирован с поддержкой C++11 (-std=c++11).

Во всех графиках вертикальная ось представляет количество времени, требуемое для проведения операций - чем меньше это значение, тем лучше. Горизонтальная ось - это количество элементов в коллекции.

Просмотров: 11447
25Авг/120

Оптимизация C++ в играх

Введение

Хорошо написанные игры на C++ часто проще поддерживаются и могут быть использованы в других играх, чем их аналоги на C. Но стоят ли они того? Могут ли программы, написанный на C++ обеспечить такую же скорость, как и C-аналоги?
С хорошим компилятором и знанием языка можно создавать эффективные игры на C++. В данной главе описаны техники, которые можно использовать, чтобы ускорить работу игр, написанных на C++. Предполагается, что вы знакомы с основами языка C++ и принципами оптимизации кода.

Один из главных принципов оптимизации, который можно повторять раз за разом – профилирование кода. При отсутствии профилирования программисты часто делают два типа ошибок. Во-первых, они оптимизируют не тот код. Большая часть программы не является критичной в отношении скорости выполнения, и оптимизация таких участков – пустая трата времени. Определять, какие участки являются критичными интуитивно не самый лучший подход – вы сможете обнаружить их только посредством прямых измерений (использования памяти и скорости выполнения). И, во-вторых, программисты иногда производят оптимизацию, которая наоборот замедляет скорость выполнения. Эта проблема очень актуальна в отношении к C++, где простая строка кода может сгенерировать невероятно большой машинный код. Поэтому программисту следует как можно чаще изучать машинный код, генерируемый компилятором и профилировать свои программы.

Просмотров: 2946
28Май/123

Запись памяти процесса

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

Просмотров: 6653