Как отображать обновления изображения в реальном времени в Unity? - PullRequest
0 голосов
/ 19 января 2019

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

Я создал приложение, которое делает это, и оно работает. Тем не менее, это очень медленно. Мой метод Update () прилагается ниже.

Моя идея была:

  • Захват данных пользователя (местоположение мыши).
  • Преобразование этих данных в специальный формат сигнала, который распознает другая программа.
  • Пусть эта программа вернет растровое изображение.
  • Используйте это растровое изображение в качестве текстуры и обновите существующую текстуру новым изображением.

Код:

UnityEngine.Texture2D oneTexture;
Bitmap currentBitmap;
private int frameCount = 0;



void Update()
{ 
    // Show mouse position in unity environment 
    double xValue = Input.mousePosition.x;
    double yValue = Screen.height - Input.mousePosition.y;  
    myPoints = "" + xValue + "," + yValue + Environment.NewLine;

    // Show heatmap being recorded.
    signals = Program.ConvertStringToSignalsList(myPoints);  
    currentBitmap = Program.CreateMouseHeatmap(Screen.width, Screen.height, signals);

    // Update old heatmap texture. 
    UpdateTextureFromBitmap();
    ri.texture = oneTexture;
    ri.rectTransform.sizeDelta = new Vector2(Screen.width, Screen.height);
    frameCount++;

    // Write points to Database.
    StartCoroutine(WriteToDB(xValue, yValue));  // <<<<< Comment out when playback.
}






private void UpdateTextureFromBitmap()
{
    // Convert Bitmap object into byte array instead of creating actual 
    // .bmp image file each frame.
    byte[] imageBytes = ImageToBytes(currentBitmap);
    BMPLoader loader = new BMPLoader();
    BMPImage img = loader.LoadBMP(imageBytes);

    // Only initialize the Texture once.
    if (frameCount == 0)
    { 
        oneTexture = img.ToTexture2D();
    }
    else
    {
        Color32[] imageData = img.imageData;
        oneTexture.SetPixels32(imageData);
        oneTexture.Apply();
    }
}

Мне было интересно, может ли кто-нибудь помочь мне улучшить скорость обновления изображения на экране? Я знаю, что можно сделать эту программу намного быстрее, но я настолько новичок в Unity и C #, что не знаю, как этого добиться. Кроме того, если у меня есть совершенно другой способ сделать это, я тоже открыт для этого. Любая помощь будет оценена. Спасибо!




Также ниже приведен скриншот Профилировщика, показывающий разбивку использования ЦП. В настоящее время каждый кадр занимает около 500 мс.

Program performance from profiler

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...