Vladimir "Dair" Lebedev-Schmidthof (dair_spb) wrote,
Vladimir "Dair" Lebedev-Schmidthof
dair_spb

Андроид и Китай

Прежде чем постить то же самое на stackoverflow и еще куда, напишу у себя, оно формализуется и утрясётся.
Пишем под Андроид.
Софтина (игра) на Open GL ES, на большинстве хороших современных андроидо-девайсов работает нормально.
Тут пролезаем за Великий Китайский Фаервол, поэтому, при помощи китайских коллег пытаемся стартовать на особенно китайских андроидодевайсах.
Ну, мы по началу серьезных проблем не ожидали, честно. Ну, думали, может тормозить, памяти не хватать, и прочее.

Но не тут-то было.

Сначала нам присылают китайское кино:


Налицо замена RGB на BGR.

Мы перелопачиваем нижний уровень кода, выясняем, что у нас при чтении граф.файлов есть подмена, и при выводе тоже она есть (она хитро заifdefлена, заметно не сразу, а везде работает нормально). Убрали, результат не изменился.
Open GL ES умеет (согласно официальной документации) только текстуры формата RGBA и RGB (если без альфа-канала), в отличие от Open GL, который умеет больше и лучше.

Сделали принудительный вывод как BGR, чисто провести эксперимент.

Есть три вида Андроидов:
1. "Западные" андроиды с "западной" прошивкой (если вы брали свой андроидотелефон не в Китае в ларьке, то у вас такой)
2. "Западные" андроиды с "китайской" прошивкой (их продают в Китае в нормальных магазинах)
3. "Китайские" андроиды с "китайской" прошивкой (их продают в Китае везде). Вот, выше такой Huawei.

Таблица работоспособности версий ВНЕЗАПНО такая:
Версия123
RGB++-
BGR-++


То есть, авторы китайских прошивок к "западным" телефонам что-то сделали такое...

Но ладно.

Я написал маленький тестик, который должен выводить 16 красных квадратов зеленого цвета, перепендикулярно друг другу квадратов цветов от 0x00000000 до 0xFFFFFFFF таким образом:
0   00000000
1   000000ff
2   0000ff00
3   0000ffff
4   00ff0000
5   00ff00ff
6   00ffff00
7   00ffffff
8   ff000000
9   ff0000ff
10  ff00ff00
11  ff00ffff
12  ffff0000
13  ffff00ff
14  ffffff00
15  ffffffff


Слева — образец, справа — китайская фотография китайского телефона:


От вида чернобелых квадратиков на нормальном месте мне стало нехорошо. Но я решил пока сосредоточиться на цвете и вместо нулей в предыдущем тесте поставил 0x55, т.е., цвета такие:
0	55555555
1	555555ff
2	5555ff55
3	5555ffff
4	55ff5555
5	55ff55ff
6	55ffff55
7	55ffffff
8	ff555555
9	ff5555ff
10	ff55ff55
11	ff55ffff
12	ffff5555
13	ffff55ff
14	ffffff55
15	ffffffff


Ответ такой:


Вот, в общем, так.
Знаете, в чём смертельный номер? В том, что левые, референсные картинки были (та-да!) сняты ddms'ом как пиксель-корректные скриншоты с того же Huawei, который сфотографирован справа, примерно в одно и то же время. То есть, эта дрянь показывает одно, а скриншотеру отдает другое. Точнее, наоборот. Скриншотеру оно отдает верные данные, а сама интерпретирует их неправильно.

Вот так и живем. Что делать — не знаю.

Update1: Вывел еще три квадратика — взял белую текстуру из квадратика15 (она везде благо белая), и вывел её три раза, применив перед ее выводом метод glColor4f, про который в документации английским по белому написано, что параметры у него red, green и blue.
Неа:


Update: проблему забороли.
Tags: android, work
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 24 comments