правильно удалить текстуру - PullRequest
0 голосов
/ 08 февраля 2011

Я пытаюсь удалить текстуру, когда я закончу с ней на Android под управлением OpenGLES 1.1

В Galaxy S (телефон) и Droid X, кажется, все работает нормально.На самом деле это работает слишком хорошо, мне, кажется, даже не нужно удалять текстуру, когда я покончу с этим, мне никогда не хватает памяти ...

На другом устройстве (не разрешенона данный момент) кажется, что glDeleteTextures не работает.После того, как я загрузил 6 больших текстур (и ряд других мелких), новые текстуры не могут быть загружены, они просто выходят белыми.

На нексусе у меня есть отчет, что он становится белым и выбрасываетследующий журнал ошибок

E / Adreno200-EGL (632): eglLockWindowSurface: не удалось сопоставить память для fd = 37 offs = 4796416 E / Adreno200-EGL (632): eglLockWindowSurface: не удалось сопоставитьпамять для fd = 38 offs = 1662976 E / Adreno200-EGL (632): eglLockWindowSurface: не удалось отобразить память для fd = 37 offs = 4796416 E / Adreno200-EGL (632): eglLockWindowSurface: не удалось отобразить память для fd =38 offs = 1662976 E / Adreno200-EGL (632): eglLockWindowSurface: не удалось отобразить память для fd = 37 offs = 4796416 E / Adreno200-EGL (632): eglLockWindowSurface: не удалось сопоставить память для fd = 38 offs = 1662976E / Adreno200-EGL (632): eglLockWindowSurface: не удалось сопоставить память для fd = 37 offs = 4796416 E / Adreno200-EGL (632): eglLockWindowSurface: не удалось сопоставить память для fd = 38 offs = 1662976

Я далеко не эксперт по OpenGL, но: а) я не могу найти полный пример, который создает и удаляет текстуры, чтобы убедиться в правильности моего кода; б) точно такая же методика отлично работает на iPhone

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

Вам нужно сделать что-то особенное перед удалением текстуры, или вам следуетбыть в состоянии просто вставить glDeleteTextures () куда угодно в вашем потоке, и он должен работать?

Извинения за то, что я не опубликовал пример кода, в настоящее время у меня есть некоторые ограничения на него.

Ответы [ 2 ]

3 голосов
/ 10 октября 2012

Насколько я знаю, все функции OpenGL должны вызываться в том же потоке, в котором создано устройство. Применяются как OpenGL, так и OpenGL ES.

0 голосов
/ 19 февраля 2011

Кажется, я решил это. Некоторые устройства (не уверены, что это графические чипсеты или что-то еще с устройством), очевидно, могут удалять текстуры только из потока графического контекста. Мои текстуры удалялись при очистке моей основной переменной текстуры, которая, очевидно, не выполнялась в нужном месте. Теперь мой glDeleteTexuters () получает запрос в событии под GLSurface, поэтому он выполняется в нужном потоке в правильном контексте.

Не уверен, что это связано, но устройство, у которого возникла проблема, создает textureID в линейном порядке (например, 1, 2, 3, 4, затем я удаляю 2, оно создает 2, 5, 6 и т. Д.) поскольку галактика S без проблем, кажется, создает идентификаторы текстуры, которые являются случайными. Может быть, это показатель того, как чипсет обрабатывает текстуры? просто предположение.

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