Сборщик мусора вешает OpenGL на HTC Ev-es - PullRequest
1 голос
/ 16 февраля 2011

Я боролся с зависанием (тупиком) в OpenGL на прошлой неделе.Я наконец понял, что система зависает после запуска сборщика мусора.Вот пример из LogCat:

02-16 08:49:32.609: INFO/ActivityManager(98): Displayed activity com.southernstars.skysafari/.SkySafariActivity: 2219 ms (total 2219 ms)
02-16 08:49:37.369: DEBUG/dalvikvm(1863): GC_FOR_MALLOC freed 4144 objects / 387544 bytes in 46ms
02-16 08:49:37.389: ERROR/Adreno200-ES20(1863): gsl_device_waittimestamp failed in rb_timestamp_wait_on_timestamp
02-16 08:49:38.516: WARN/SharedBufferStack(1863): waitForCondition(LockCondition) timed out (identity=157, status=0). CPU may be pegged. trying again.

Каждый раз, когда LogCat показывает GC_FOR_MALLOC или GC_EXTERNAL_ALLOC, приложение зависает с OpenGL в этом условии LockCondition.Похоже, что GC_EXPLICT, по большей части, не вызывает проблем (возможно, это меньшие ресурсы, я не знаю).

В Интернете, кажется, что люди сообщают о таких вещах наТелефоны HTC.Обычно они говорят, что проблема очень спорадическая и ее трудно воспроизвести.Я могу легко воспроизвести его, просто поместив вызов System.gc () в свой поток приложений или выполнив что-то, что выделяет часть памяти, заставляя GC работать.

У меня есть эта проблема в HTC Evo.У моего партнера по разработке другой телефон, и я его не вижу.

Я совершенно не знаю, что делать дальше.Кто-нибудь видел что-то подобное или есть правдоподобное объяснение того, что происходит?Есть ли способ сделать что-то необычное, что мы делаем в приложении?Или это просто ошибка в системе HTC или драйверах?

Спасибо за любую помощь.

1 Ответ

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

I наконец отследил происходящее. Мы читаем активы из APK, используя прямой C-код. Я написал подпрограмму, основанную на некотором коде в сети, который возвращает файловый дескриптор и смещение к ресурсу, который нам нужно было прочитать. Исходный код будет дублировать () fd перед его возвратом. Я не мог понять, зачем нужен dup (). ФД, казалось, все равно увеличивалось, как будто его уже обманули. Во всяком случае, я прокомментировал дупл и оставил комментарий, который, по моему мнению, не был необходим.

Оказывается, это необходимо. Похоже, что где-то в коде файловой системы происходило какое-то повреждение памяти, которое вызывало зависания OpenGL. Когда я восстановил dup () все снова заработало.

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