Делаю кроссплатформенную игру с использованием Qt (из Линукса). Именно Qt выбрал, потому что в перспективе понадобится графический интерфейс для всяких редакторов, а также он предустановлен практически во все Linux'ы.
Пробовал использовать стандартный цикл QApplication::exec() и сделать таймер с нулевым интервалом. Но всё это сильно дёргалось, хотя в полноэкранном режиме было ещё нормально. Вот код:
QApplication app;
QTimer t;
t.setSingleShot(false);
t.start(0);
app.exec();
Потом попробовал сделать свой бесконечный цикл, вызывая processEvents, а после него обновляя игру. Стало получше, но всё равно иногда дёргается в оконном режиме. Выдаёт FPS от 50 до 70, хотя в Windows версии на WinAPI было больше 200. Код:
while(running)
{
QApplication::processEvents();
engine->Step();
}
Код, который я пробовал на WinAPI, когда ещё не перешёл на Linux:
while(GetMessage(...))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
engine->Step();
}
Вроде то же самое, что и на Qt, но на Qt тормозит, а на WinAPI нет. Хотя эксперимент был не совсем чистым, так FPS на WinAPI я замерял на Windows, а FPS на Qt я замерял в Linux.
И почему это редактор не зависит от движка? Редактор уровней будет рендерить уровень. Он должен уметь управлять объектами и так далее. Короче, нужно объединить интерфейс и движок в одно целое.
– devoln Feb 10 '13 at 13:26чем пытаться использовать "стандартный цикл обработки сообщений Qt не предназначенный для игр"
Я и спрашиваю, как сделать свой средствами Qt? Там наверняка всего будет 10 строк вместо пары тысяч, к тому же сразу под все существующие платформы.
– devoln Feb 10 '13 at 13:29Не проще ли создать класс UserInput обрабатывающий все сообщения от всех систем во внутреннюю модель ввода сделанную специально для игры(один буфер клавиатуры и курсора мыши). После чего условно компилировать его через макросы и вставить его сразу в engine->step(). Тогда главная петля станет значительно проще.
– igumnov Feb 10 '13 at 13:35Так все WinAPI приложения делают. Что в этом паршивого?
Да есть переменная, которую в любой момент можно установить в false, и после обработки всех приложений цикл прервётся. В WinAPI случае при получении сообщения WM_QUIT GetMessage вернёт 0 и цикл тоже прервётся.
Какая мне разница, какого размера Qt, если она встроена во все дистрибутивы? Поэтому я его использую как удобный LinuxAPI. А для редактора по-любому понадобится. Пусть лучше всё будет на одном коде.
И что? У меня весь движок занимает меньше 15000 строк.
– devoln Feb 24 '13 at 10:35