Как я могу создать автономный регистратор последовательности png со скоростью 60 кадров в секунду?

#c# #unity3d

#c# #unity-игровой движок

Вопрос:

Я хочу захватить последовательность изображений с камеры Unity в формате 60 кадров в секунду, 4k, не в реальном времени (в автономном режиме).

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

Я записываю кадры следующим образом:

             // get main camera and manually render scene into rt
            Camera camera = this.GetComponent<Camera>(); // NOTE: added because there was no reference to camera in original script; must add this script to Camera
            camera.targetTexture = renderTexture;
            camera.Render();
            this.lastRenderTime = Time.realtimeSinceStartup;

            // read pixels will read from the currently active render texture so make our offscreen 
            // render texture active and then read the pixels
            RenderTexture.active = renderTexture;
            screenShot.ReadPixels(rect, 0, 0);

            // reset active camera texture and render texture
            camera.targetTexture = null;
            RenderTexture.active = null;

            // get our unique filename
            string filename = uniqueFilename((int)rect.width, (int)rect.height);

            // pull in our file header/data bytes for the specified image format (has to be done from main thread)
            byte[] fileHeader = null;
            byte[] fileData = null;

 // create new thread to save the image to file (only operation that can be done in background)
            new System.Threading.Thread(() =>
            {
                // create file and write optional header with image bytes
                var f = System.IO.File.Create(filename);
                if (fileHeader != null) f.Write(fileHeader, 0, fileHeader.Length);
                f.Write(fileData, 0, fileData.Length);
                f.Close();
                Debug.Log(string.Format("Wrote screenshot {0} of size {1}", filename, fileData.Length));
            }).Start();

  

Может кто-нибудь указать мне правильное направление?

Комментарии:

1. Как бы вы гарантировали, что он будет работать со скоростью 60 кадров в секунду на указанных компьютерах (особенно с графикой 4K)? Это сложный вопрос, потому что звучит так, как будто вам, вероятно, придется самостоятельно выполнить некоторое тестирование оптимизации.

2. В этом смысл того, что он «отключен». При рендеринге Unity будет работать намного медленнее, чем 60 кадров в секунду, но последовательность изображений будет соответствовать отснятому материалу со скоростью 60 кадров в секунду.

Ответ №1:

В настройках времени установите для всех временных интервалов значение 1/60 (приблизительно 0,01666667)

Затем измените экран в событии OnPostRender.

временные настройки

Комментарии:

1. Должен ли я также изменить временную шкалу? Кроме того, функция OnPostRender, похоже, не вызывается (я прикрепил содержащий скрипт к объекту camera, поэтому я не уверен, почему он не вызывается).

2. Этот ответ решил мою проблему. Я изменил значения временного шага на 0,01666667. Однако мне не удалось вызвать функцию OnPostRender. Я рассмотрю это отдельно.

3. Нет необходимости изменять временной масштаб, и OnPostRender вызывается на включенной камере, если это не работает, вы также можете использовать WaitForEndOfFrame.