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 Simulator, и свойство размера устройства всегда корректно: 256x256.
Я также пытался загрузить эту текстуру раньше, чтобы избежать возможных побочных эффектов. Тем не менее размер текстуры не так.
Стоит отметить, что это происходит не со всеми текстурами, но происходит со всеми текстурами 256x256, которые я загружаю. Текстура 128x256 сообщает о своем размере правильно.
Я также сделал чистую сборку, и я тестирую на Mavericks (13A603) с Xcode 5.0.1 (5A2053).
3 ответа
Видимо, эта проблема вызвана несовместимыми изображениями программ, в моем случае Inkscape всегда был виновником.
Файлы PNG, созданные Inkscape, работают правильно, но Sprite Kit сообщает неверный размер. В каждом случае это случалось со мной, исправление было просто открыть файл PNG в Seashore, а затем "Сохранить как" под тем же именем файла, чтобы заставить программу повторно сохранить файл PNG.
Я предполагаю, что открытие и сохранение с другими программами изображений может также работать, возможно, даже Preview может помочь исправить это или инструмент командной строки, такой как PNGCrush.
Также есть определенная согласованность, потому что размер текстуры Inkscape, как сообщается, меньше на 20%, то есть 204,8 для текстуры 256 или 0,8 для текстуры в 1 пиксель. Проблема, кажется, связана с настройкой Inpicape ppi (пикселей на дюйм), где он не допускает значения ниже 90 ppi. Но по умолчанию Photoshop составляет 72 ppi, что на 20% меньше. И я полагаю, что Sprite Kit предполагает, что PNG составляет 72 ppi, получает изображение 90 ppi и, следовательно, неправильно (или правильно?) Вычисляет размер PNG на 20% меньше, чем он есть на самом деле.
Вы создаете текстуру обычными методами или показываете ее на экране? У меня была похожая проблема с анимацией сегодня, и я думаю, что это связано с ленивым заполнением текстур. Они на самом деле не загружаются до тех пор, пока вы не будете использовать их. Попробуйте использовать это и проверить размер:
[tempTexture preloadWithCompletionHandler:^{}];
Это также может объяснить, почему прямоугольник 0,0,1,1
В предварительном просмотре изображения Finder вы можете увидеть
Dimensions
и изображения. Разрешение исходит из информации 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).