В настоящее время я работаю над проектом 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.Память все еще течет, даже с почти пустым проектом.