автоматический рендеринг opentk gcontrol?

Итак, у меня есть это хорошее приложение на С#, написанное с помощью OpenTK (OpenGL)... оно использует полноэкранное окно GL и, как и предполагалось, автоматически запускает метод OnRenderFrame всякий раз, когда это возможно, и я получаю отличную игру со скоростью 60 кадров в секунду.

НО, теперь я хочу использовать свою игру в GLControl в форме Windows, а не в окне GL. По какой-то причине он запускает метод onrenderframe один раз и все. Я попытался использовать Application.Idle, чтобы запустить его, как указано в их документации, но в итоге я получаю около 5 кадров в секунду.

Как я должен заставить его работать в цикле, как исходное приложение?

РЕДАКТИРОВАТЬ: В основном то, что я ищу, похоже на game.Run(60), который вы бы использовали для инициализации окна OpenGL со скоростью 60 кадров в секунду.


person lightray22    schedule 18.02.2013    source источник
comment
Не могли бы вы предоставить код того, что вы уже пробовали?   -  person antonijn    schedule 19.02.2013
comment
Событие MainForm.Load запускает метод load(), который говорит Application.Idle += OnRenderFrame; Это дает мне около 6 кадров в секунду.   -  person lightray22    schedule 19.02.2013
comment
ВАУ! Я нашел что-то очень странное. Используя application.idle для обновления кадров, если я постоянно машу мышью из стороны в сторону в окне или удерживаю клавишу на клавиатуре, ТОГДА она остается на идеальных 60 кадрах в секунду. Почему это происходит и как я могу сделать так, чтобы это происходило всегда??   -  person lightray22    schedule 19.02.2013


Ответы (2)


Создайте таймер, который вызывает GLControl.Invalidate() каждую 1/60 секунды. Кроме того, я не рекомендую использовать Application.Idle для запуска анимации, поскольку она имеет неожиданное поведение. Вы правильно меняете буфера?

person TheBlindSpring    schedule 10.06.2014

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

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

Значение частоты кадров при активном вводе зависит от устройства ввода, например, мой тачпад получает ~60 событий в секунду, а мышь a4tech с частотой дискретизации 1000 Гц — ~750 кадров в секунду на том же базовом образце.

В любом случае, если вы настаиваете на постоянной частоте кадров, вы можете вызвать Invalidate() в таймере, как сказано выше.

person Str1ker    schedule 05.03.2016