Unity - Android, C # - Утечка памяти в C ++ - PullRequest
0 голосов
/ 16 октября 2018

В настоящее время я работаю над проектом Unity, который работает на Windows и Android.В основном я использую класс Unity WebCamTexture для доступа к подключенной камере, а затем отправляю изображение в мой код C ++ (dll в Windows и Android), который работает с opencv для дальнейшей обработки.

Хотя в Windows все работает нормально, точно такой же код вызывает утечку памяти в Android (использование ОЗУ постоянно увеличивается с каждым кадром).Я искал несколько возможных решений о том, как поделиться изображением с моим кодом C ++.Каждое решение прекрасно работает в Windows и вызывает утечки памяти в Android (обработка изображений также работает в Android, проблема заключается только в утечке)

Вот один пример рабочего кода:

C #

    Color32[] color = webcamTexture.GetPixels32();
    byte[] data = Color32ArrayToByteArray(color);
    IntPtr unmanagedArray = Marshal.AllocHGlobal(data.Length);
    Marshal.Copy(data, 0, unmanagedArray, data.Length);

    PrepareImage(unmanagedArray, camW, camH);

    Marshal.FreeHGlobal(unmanagedArray);

C ++

    void PrepareImage(unsigned char* data,int w, int h){

    cv::Mat textureC4(h, w, CV_8UC4, data);

    cv::Mat textureC3;

    cv::cvtColor(textureC4,textureC3,cv::COLOR_RGBA2RGB);

    }

Утечка памяти начинается, как только я пытаюсь внести какие-либо изменения в переменную "texture" в части C ++ (например, изменение с 4 каналов на 3).

Поскольку у меня нет опыта работы с C ++, я не удивлен тем, что сталкиваюсь с такими проблемами, но больше всего меня смущает то, что он отлично работает на Windows.Я буду рад любым предложениям, указывающим мне новое направление.Спасибо!

Обновление:

Несколько дополнительных сведений об окружении:

Версия Unity: 2018.2.8f1

ПротестированоВерсии NDK: 13b и 16b

Протестированные телефоны: 1x Samsung S9, 2x Note 8

Эти дополнительные решения также были протестированы и дают такие же результаты:

Ссылка 1

Ссылка 2

Кроме того, я также попытался создать указатель на C ++, пусть C # использует этот указатель и, наконец, C ++ очищаетобъем памяти.Это вызывает все те же утечки.На данный момент мне интересно, если это проблема установки, поэтому я собираюсь создавать новые проекты и позже сообщать о результатах

... Я сейчас создал новый проект Unity, который выполняет только приведенный выше код +Веб-камера Текстура.По-прежнему точно такое же поведение.На данный момент я подозреваю, что это проект Android Studio для моего кода C ++.

... Теперь я создал проект Visual Studio для создания файла .so.Память все еще течет, даже с почти пустым проектом.

1 Ответ

0 голосов
/ 25 октября 2018

В конце концов, это была проблема с проектом Android Studio.Я создал новый проект на третьем компьютере.Я скопировал точно такой же код.Теперь все работает без утечек.Спасибо всем, кто мне помог!:)

...