Sprite Kit OS X: неправильное свойство размера SKTexture

Я тестирую игру на версии Sprite Kit для OS X и обнаруживаю, что некоторые текстуры неправильно сообщают о своем размере. Мне интересно, видит ли кто-нибудь еще эту проблему и есть ли этому объяснение?

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

Загружаю вот эту текстуру, она размером 256х256 пикселей:

введите здесь описание изображения

Когда я регистрирую SKTexture, созданную из этого изображения, описание SKTexture дает мне правильный размер, но свойство size нет, оно говорит, что изображение имеет размер 204,8 x 204,8.

tex = <SKTexture> 'Tileset_GeometryB.png' (256 x 256)
tex.size = {204.80000000000001, 204.80000000000001}  // Huh? WTF?!?
tex.textureRect = {{0, 0}, {1, 1}}

Я загружаю одну и ту же текстуру, используя один и тот же код на симуляторе iOS и на устройстве — свойство размера всегда правильное: 256x256.

Я также попытался загрузить эту текстуру перед чем-либо еще, чтобы избежать возможных побочных эффектов. Тем не менее размер текстуры неправильный.

Стоит отметить, что это происходит не со всеми текстурами, но происходит со всеми текстурами 256x256, которые я загружаю. Текстура 128x256 правильно сообщает свой размер.

Я также сделал чистую сборку и тестирую Mavericks (13A603) с Xcode 5.0.1 (5A2053).


person LearnCocos2D    schedule 02.11.2013    source источник
comment
Я сообщил об этом как об ошибке в Apple. Идентификатор ошибки: 15377856   -  person LearnCocos2D    schedule 03.11.2013
comment
Хорошо, сразу после того, как я это сделал, я открыл PNG в Seashore, чтобы снова сохранить его. После этого свойство размера правильное.   -  person LearnCocos2D    schedule 03.11.2013


Ответы (3)


По-видимому, эта проблема вызвана несовместимостью программ обработки изображений, в моем случае виновником всегда был Inkscape.

Файлы PNG, созданные Inkscape, по-видимому, работали правильно, но Sprite Kit неверно сообщал о размере. В каждом случае, когда это случалось со мной, исправление заключалось в том, чтобы просто открыть файл PNG в Seashore, а затем "Сохранить как" под тем же именем файла, чтобы заставить программу повторно сохранить файл PNG.

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

Существует также определенная согласованность, поскольку размер текстуры Inkscape сообщается как на 20% меньше, то есть 204,8 для текстуры 256 или 0,8 для текстуры 1 пиксель. Проблема, похоже, связана с настройкой Inkscape ppi (пикселей на дюйм), где она не допускает значений ниже 90 ppi. Но по умолчанию Photoshop составляет 72 ppi, что ровно на 20% меньше. И я полагаю, что Sprite Kit предполагает, что PNG составляет 72 ppi, получает изображение с разрешением 90 ppi и, таким образом, неправильно (или правильно?) вычисляет размер PNG как на 20% меньше, чем он есть на самом деле.

person LearnCocos2D    schedule 20.04.2015
comment
Хорошая находка. Судя по всему, SVG (аля inkscape) имеет разрешение 90 dpi, тогда как большинство других программ используют 72 dpi. Я думаю, что основным виновником является поведение NSImage против UIImage, что очень расстраивает. - person bw1024; 12.12.2015

Вы создаете текстуру обычными методами или показываете ее на экране? Сегодня у меня была аналогичная проблема с анимацией, и я думаю, что это связано с ленивой загрузкой текстур. На самом деле они не загружаются до того времени, когда вам нужно их использовать. Попробуйте использовать это и проверить размер:

    [tempTexture preloadWithCompletionHandler:^{}];

Это также может объяснить, почему прямоугольник равен 0,0,1,1.

person Dvole    schedule 02.11.2013
comment
Нет, тот же результат. Между прочим, прямоугольник текстуры правильный, он выражается в коэффициенте, где ширина/высота 1 означает всю ширину/высоту текстуры. - person LearnCocos2D; 03.11.2013

В предварительном просмотре изображения Finder вы можете увидеть Dimensions и Resolution изображения. Разрешение исходит из информации EXIF. Простое решение — удалить эту информацию EXIF.

Вы можете легко добиться этого с помощью ImageMagick:

convert image.png -strip image-with-no-exif.png

или вы можете изменить изображение на месте:

convert -strip image.png

Если вы посмотрите сейчас в Finder, поле Resolution должно исчезнуть.

Вы также можете просмотреть подробную информацию EXIF ​​с помощью:

identify -verbose image.png

После удаления информации EXIF ​​размер, сообщаемый SpriteKit, представляет собой размер в пикселях (проверено на Xcode 12.2).

person endavid    schedule 25.12.2020