iMedre

SKTexture Sınıfı Nedir 1 – Sprite Kit Derinlikleri #15

Merhaba, bu yazıda SKTexture sınıfını inceleyeceğim. Keyifli okumalar.

SKTexture Nedir?

SpriteKit’te kullanılmak üzere bir görüntünün  temsilidir.

Genel Bakış

Bir SKTexture nesnesi SKSpriteNode ve SKShapeNode nesnelerine, SKEmitterNode nesnesinin oluşturduğu parçacıklara veya SKTileMapNode’da kullanılan karolara uygulanabilen bir resimdir. Bir doku nesnesi, görüntüyü oluşturmak için gereken doku verilerini ve grafik kaynaklarını yönetir. Çoğu doku nesnesi, uygulama grubunuzda depolanan kaynak resimlerden oluşturulur. Oluşturulduktan sonra, bir doku nesnesinin içeriği değişmezdir. Birden fazla sprite, tek bir kaynağı paylaşarak aynı doku nesnesini paylaşabilir.

SKTexture nesnesini oluşturmak için init (imageNamed 🙂 yöntemini kullanın. Doku nesnesi bir görüntü dosyası kullanılarak başlatıldığında, SpriteKit, grafikleri sprite etmek için kullanmadan önce iki adımı gerçekleştirmelidir. İlk olarak, doku verilerini dosyadan yüklemelidir. İkincisi, grafik donanımı tarafından kullanılacak doku verilerini hazırlamalıdır. Bu adımların ikisi de diğer SpriteKit işlemlerine kıyasla zor olabilir. Özellikle, bir dokudan bir dosya yüklemek çok pahalıdır. SpriteKit, dokuyu olabildiğince uzun yüklemeye ve hazırlamaya karşı koyar ve bu adımları kontrol etmek için kullanabileceğiniz yöntemler de sağlar.

Doku verileri şu durumlarda yüklenir:

  1. Doku nesnesindeki size () yöntemi çağrılır.
  2. Doku nesnesini kullanan yeni bir SKSpriteNode nesnesi oluşturmak gibi, dokunun boyutunu gerektiren başka bir yöntem denir.

 

Doku verileri aşağıdaki durumlarda oluşturulmaya hazırlanır:

  • Dokuyu kullanan bir hareketli parçacık veya parçacık, işlenmekte olan düğüm ağacının bir parçasıdır.

SKTexture nesnesi oluşturmaya hazır olduğunda, doku nesnesine yapılan tüm güçlü referanslar kaldırılıncaya kadar hazır kalır.

Doku nesneleri çalışma zamanında oluşturulan verilerden oluşturulabilir. Örneğin, bir Quartz 2D görüntüsünden, ham piksel verilerinden veya varolan bir dokuya bir Core Image filtresi uygulayarak doku oluşturabilirsiniz. Ayrıca, dokuya bir düğüm ağacı oluşturmak için texture (from: ) yönteminden de çağırabilirsiniz. Bu dokulardan hiçbiri, doku oluşturulduğunda verileri zaten bellekte olduğundan yüklenmemelidir. Ancak, doku, oluşturulmadan önce hala SpriteKit tarafından hazırlanmalıdır.

Doku Belleğini Yönetme

Doku nesneleri, kaynak verilerinizin boyutuna bağlı olarak çok fazla bellek tüketebilir. Ve genellikle, hazırlanan dokular için mevcut olan bellek donanım tarafından sınırlandırılmıştır, çünkü dokular VRAM’a yüklenmelidir. Dolayısıyla, çoğu oyun dokular tarafından kullanılan belleği dikkatli bir şekilde yönetmelidir. Oyununuzu oluştururken aşağıdaki ipuçlarını düşünün:

  1. Bir doku nesnesine yalnızca gerektiğinde erişin ve oyununuz tarafından artık gerekmediğinden emin olduğunuzda nesneyi atın. Bu, belleği serbest bırakır ve diğer doku nesnelerine sunar.
  2. Oluşturma döngüsünden tek geçişte çok fazla doku yüklemekten kaçının. Bunu yaparsanız, SpriteKit doku verilerini yüklemeyi tamamlamak için bir veya daha fazla çerçeveyi atlayabilir. Bunun yerine, oyununuzu başlatmadan önce içeriğinizi önceden yükleyin.
  3. Aynı dokuyu aynı anda sprite’larınızı işlemek için kullanıyorsanız, her bir dokuyu ayrı bir görüntü dosyasından yüklemeyin. Bunun yerine, doku görüntülerini mantıksal olarak bir veya daha fazla doku atlasına gruplayın. Daha fazla bilgi için SKTextureAtlas’a bakın.

Normal Harita Dokuları

Normal bir harita dokusu görüntü dokusuna benzer, ancak ekranda görüntülenecek görüntü verilerini tutmak yerine, her bir metin normal bir vektörü temsil eder. Normal harita dokuları, 3D aydınlatmayı simüle etmek için kullanılır (normalTexture özelliğine bakın) veya hız değerleri oluşturmak için kullanılır (bkz. VelocityField (with :)).

Normal haritaları iki farklı şekilde oluşturabilirsiniz. Öncelikle, mevcut bir görüntü haritasını alıp normal bir harita oluşturmak için kullanabilirsiniz. SpriteKit, dokudaki renk verilerini filtreler ve ardından piksel kontrastına dayalı bir harita oluşturmak için kullanır. Alternatif olarak, normal bir görüntü dosyası yükleyebilir ancak normal bir harita olarak kullanabilirsiniz.

Aşağıdaki görüntü, her ikisi de aynı dokuya sahip iki hareketli düğüm göstermektedir. Sağdaki düğüm, generatingNormalMap () yöntemi kullanılarak oluşturulan aynı gürültü yapısından normal bir haritaya sahiptir.

Bir Dokunun İçeriğini Çıkarma

CgImage () özelliği, bir kağıdın içeriğini Quartz Resmi olarak döndürür. Örneğin, sahnenin ekran görüntüsünü almak için, sahnenin içeriğini bir dokuya dönüştürmek için texture (from: ) yönteminden yararlanın ve sonra o dokunun cgImage () özelliğini okuyun.

Belleğe Dokuları Önceden Yüklemek

SpriteKit’in önemli bir avantajı, sizin için otomatik olarak çok sayıda bellek yönetimi gerçekleştirmesidir. Yeni bir animasyon karesi oluştururken, SpriteKit geçerli kareyi oluşturmak için bir dokuya gerekip gerekmediğini belirler. Bir doku gerekiyorsa ancak oluşturma için hazır değilse, SpriteKit doku verilerini dosyadan yükler, verileri grafik donanımının kullanabileceği bir formata dönüştürür ve grafik donanımına yükler. Bu işlem arka planda otomatik olarak gerçekleşir. Bir kerede çok fazla sayıda boyanmamış dokuya ihtiyaç duyulursa, tüm dokuları tek bir animasyon karesinde yüklemek imkansız olabilir ve bu da kare hızının bozulmasına neden olur. Bu sorunu önlemek için, özellikle büyük veya karmaşık oyunlarda, dokuları belleğe önceden yüklemeniz gerekir.

Liste 1, bir SKTexture nesnesi dizisinin nasıl yükleneceğini gösterir.  preload(_: withCompletionHandler : ) yöntemi, tüm dokular belleğe yüklendikten sonra tamamlama işleyicisini çağırır. Bu örnekte, oyunun belirli bir seviyesi için tüm dokular tek bir işlemle önceden yüklenmiştir. Dokular bellekte olduğunda, tamamlama işleyicisi çağrılır. Sahneyi oluşturur ve sunar. (Bu doku nesnelerini sahnelere sunmak için kod eklemeniz gerekir; bu kod burada gösterilmez).

SKTexture.preload(textureArrayForLevel1) {
    // The textures are loaded into memory. Start the level.
    let gameScene = GamePlayScene(size: CGSize(width: 768, height: 1024))
    
    if let spriteView = view as? SKView {
        spriteView.presentScene(gameScene)
    }
}

Oyununuzun veya uygulamanızın tasarımını yakından tanıdığınız için, yeni dokulara ihtiyaç duyulduğunda bilmeniz gereken en iyi kişi sizsiniz. Önyükleme kodunuzun kesin tasarımı oyun motorunuza bağlı olacaktır. İşte dikkate alınması gereken birkaç tasarım var:

  • Küçük bir oyun veya uygulama için, uygulama başlatıldığında tüm dokularını önceden yükleyebilir ve daha sonra bunları sonsuza dek hafızada tutabilirsiniz.
  • Daha büyük bir oyun veya uygulama için, dokuları seviyelere veya temalara bölmeniz gerekebilir. Her seviye veya temanın dokuları, belirli bir miktarda belleğe sığacak şekilde tasarlanmıştır. Oynatıcı yeni bir seviyeye başladığında, o seviyenin tüm doku nesnelerini önceden yüklersiniz. Oyuncu seviyeyi bitirdiğinde, bir sonraki seviye için gerekli olmayan dokular atılır. Seviyeleri önceden yükleyerek, oyun başlamadan önce yükleme süresi tamamen açıktır.
  • Bir oyun belleğe sığabilecek daha fazla dokuya ihtiyaç duyarsa, oyun oynanırken dokuları dinamik olarak önceden yüklemeniz gerekir. Tipik olarak, bir seviyenin başlangıcında bazı dokular önceden yüklersiniz ve daha sonra ihtiyaç duyulacaklarını düşündüğünüzde başka dokular yüklersiniz. Örneğin, bir yarış oyununda, oyuncu her zaman aynı yönde hareket eder, böylece her bir kare için oyuncu görmek üzere olduğu içerik için yeni bir doku getirebilirsiniz. . Oyuncu kontrollü harekete izin veren bir macera oyununda, bir oyuncu belirli bir yönde hareket ettiğinde geçici olarak doku yüklemeniz gerekebilir.

Bellekten bir Doku Kaldırma

Grafik donanımın belleğine bir doku yüklendikten sonra, referans SKTexture nesnesi silinene kadar bellekte kalır. Bu, seviyeler arasında (veya dinamik oyunda), bir doku nesnesinin silinmiş olduğundan emin olmanız gerektiği anlamına gelir. Aşağıdakileri içeren güçlü referansları kaldırarak bir SKTexture nesne nesnesini silin:

  1. Oyununuzdaki SKSpriteNode ve SKEffectNode nesnelerine ait tüm doku referansları
  2. Kendi kodunuzdaki dokuya güçlü referanslar
  3. Texture nesnesini oluşturmak için kullanılan bir SKTextureAtlas nesnesi

Erdem Özgür

Yorum Ekle

Bizleri Sosyal Medyadan Takip Edebilirsiniz

Utanmana gerek yok, bizimle iletişim kurabilirsin. İnsanlarla tanışmayı ve yeni arkadaşlar edinmeyi seviyoruz.