2015-03-13 2 views
1

У меня есть сценарий WebGL, и набор параметров, которые я могу использовать, чтобы сбалансировать качество рендеринга и скорость. Я хотел бы показать сцену для пользователя так высоко, насколько я могу сделать качество, пока частота кадров не опустится ниже некоторого порога из-за этого. Чтобы достичь этого, мне нужно как-то измерить «текущую» частоту кадров в ответ на изменения качества.Измерение времени рендеринга

Но сцена статична, пока пользователь не взаимодействует с ней (например, вращающаяся камера с помощью мыши). Я не хочу, чтобы цикл повторял повторную визуализацию той же сцены все время, даже если ничего не изменилось. Я хочу прекратить рендеринг, если сцена перестает двигаться. Это означает, что я не могу просто усреднить время между последовательными кадрами, так как я не могу различать медленный рендеринг, и пользователь просто двигает мышью медленнее.

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

Я также подумал об использовании вызова finish вместо вызова flush для точного измерения времени рендеринга. Но пока я жду, пока GL закончит рендеринг, мое приложение будет по существу не отвечать на запросы, в частности, не сможет помещать в очередь события мыши. Поскольку я предполагаю, что рендеринг в идеале должен занимать все время между двумя кадрами с целевой частотой кадров, это, вероятно, будет довольно плохо. Я мог бы избежать использования finish вместо flush только в некоторых случаях, например, после выхода мыши.

Каков наилучший способ достижения нужной частоты кадров в приложении WebGL или для регулярного измерения времени рендеринга?

+1

FYI: [отделка - только флеш в хроме] (http://stackoverflow.com/a/20810521/128511). – gman

+0

@gman: Есть одна идея ... большое спасибо за эту ссылку! – MvG

ответ

1

Почему вы не можете использовать среднее время рендеринга?

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

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

+0

Я могу взять временную метку всякий раз, когда я начинаю рендеринг, но у меня нет доступа к тому времени, когда я закончил. Таким образом, сравнение времени начала с другим не говорит мне ничего, если время рендеринга не является ограничивающим фактором, а скорость мыши. – MvG

+0

Что значит, что у вас нет доступа? –

+0

Существует нет ответа на вызов afaik и т.п., чтобы уведомить мой код JavaScript о том, что рендеринг завершен. В тот момент, когда я называю 'flush' (или, согласно комментарию gman, даже' finish'), это * not *, рендеринг времени завершен, но только время, когда все инструкции визуализации были переданы. После этого рендеринг, как правило, занимает еще больше времени. – MvG