問題タブ [sktextureatlas]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - ゲーム内の複数のレベルで SKTextureAtlas を分割する最良の方法は何ですか?
現在、大きすぎてすばやくロードできない SKTextureAtlas があります。ゲーム内のすべての敵のテクスチャが含まれています。ゲームが特定のレベルに必要なテクスチャのみをロードするように、アトラスを分割したいと考えています。ただし、一部の敵は複数のレベルに出現します。アトラスを分割するにはどうすればよいですか? レベルごとにアトラスを作成するのは避けたいと思います。なぜなら、繰り返される敵の画像ファイルを複製する必要があり、レベルがたくさんあると煩わしくなるからです。よりエレガントなアプローチはありますか?
ios - Xamarin.iOS でビルドされた iOS ゲームとアプリのサイズを小さくするにはどうすればよいですか?
Apple Developer Guide へのリンクは次のとおりです。
そのリンクには、「App Review のためにアプリを送信する 」というセクションがあり、次のメッセージが表示されます。
"異常に大きなビルド ファイルは、通常、アプリ バンドル内のリソースとしてではなく、コンパイルされたバイナリ自体に画像などのデータを保存した結果です。画像または大きなデータセットをバイナリにコンパイルする場合は、このデータを、アプリによって動的にロードされるリソースに分割します。」
私のゲームで使用する PNG 画像の合計サイズは約 130 Mb です。テストのためにゲームをコンパイルして iPad にロードすると、ゲームの合計サイズが iPad に表示されているように約 190 MB であることがわかります。
Xamarin スタジオの " resource "フォルダー内に既に PNG 画像を配置しており、ゲームをコンパイルしてビルドする前に、コードによってこれらの画像がテクスチャ アトラスにビルドされます。
したがって、上記のメッセージにある Apple の提案「このデータをアプリによって動的にロードされるリソースに分割するのが最善です」ということで、私の質問は次のとおりです。
(1) 「ゲームで動的にロードできる別のリソースに画像を配置する」ことで、ゲームのサイズをさらに縮小できますか? (または、この場合「App Thinning」が役立ちますか?)
(2) 上記の質問 (1) の答えが「はい」の場合、その方法を教えてください。または、その方法を示す Xamarin Web サイトへのリンクを送っていただけますか?
どうもありがとうございました。
swift - assets.xassets で作成されたスプライト アトラスのテクスチャ フォーマットを RGBA4444 に変更する方法
だから、これは私の最初のアプリで、私は立ち往生しており、ほぼ1週間解決策を見つけることができません. さまざまなキャラクターのアニメーションをたくさん作成しましたが、ゲームのメモリ使用量が約 200 MB であることがわかりました。多くの初心者と同じように、png テクスチャを圧縮するとこのサイズも小さくなると考えていたので、以前はこれについて心配していませんでした。しかし、そうはなりませんでした。それで、私はそれについて何ができるかを探し始め、テクスチャ形式をデフォルトの RGBA8888 から RGBA4444 に変更すると、メモリ使用量をほぼ半分に削減できることがわかりました。
Sprite Kit Texture Atlas: Define Image Format (RGBA4444, RGB565, …)という回答が見つかりました。Build Settings > Output Texture Atlas Format から出力フォーマットを変更できると書かれています。しかし、私のアトラスは assets.xassets フォルダーに作成されているため、それはうまくいきません。「Build Settings > Output Texture Atlas Format」設定は、プロジェクト フォルダーにアトラスを作成し、assets.xassets フォルダーに作成しない場合にのみ存在します。
そこで私の次のステップは、TexturePacker でテクスチャ フォーマットを手動で変更することでした。私はそれを行いましたが、問題はこれらの新しいテクスチャを assets.xassets フォルダに追加したときです。品質は低くても、RGBA8888 形式のテクスチャと同じメモリ使用量が残っています。
多くのリソースを読みましたが、Sprite Atlas が assets.xassets フォルダーにある場合に Output Texture Atlas Format を変更する方法に関する情報は見つかりませんでした。
この時点で何をすべきかわかりません。私の質問は、assets.xassets フォルダーにあるスプライト アトラスのテクスチャ フォーマットを RGBA4444 に変更するにはどうすればよいですか? 前もって感謝します。
objective-c - XCODE 8.0 を使用した SKTextureAtlas preloadWithCompletionHandler でのメモリ リーク
誰かがこの問題の答えを見つけるのを手伝ってくれることを願っています. 数週間前にアップルにバグレポート (28684035) を提出しましたが、彼らはまだ私のレポートに応答していません。Apple フォーラムも役に立ちません。私のゲームは開発中で、SKTextureAtlas preloadWithCompletionHandler メソッドを呼び出すだけでプリロード時にクラッシュすることがあります。
詳細は下記をご覧ください。問題についてご不明な点がございましたら、お気軽に投稿してください。
概要: テスト プロジェクトを作成し、touchUpAtPoint に次のコードを追加するだけです。
SKTextureAtlas* atlas = [SKTextureAtlas atlasNamed:@"GlobalMap"];
}];
計測器を調べたところ、このメソッドが呼び出されるたびにメモリ リークが発生します。最終的にはクラッシュします。このリークを発見したのは、進行中のゲーム プロジェクトで、ゲームの開始時にいくつかのアトラスをプリロードしたためです。コードを XCODE 8.0 に更新し、iPhone を IOS 10.0 に更新すると、クラッシュし始めました。
再現する手順:
- テスト プロジェクトを作成する
- プロジェクトにアトラスを追加する
- preloadWithCompletionHandler コードを追加します。
- アプリを実行し、Instruments でメモリの割り当てとリークを監視する
- 画面に数回タッチします (または 1 回でも - リークが表示されます)。
バージョン: iOS 10.0.2 構成: iPhone 6
ios - SKTextureAtlas を削除すると、SpriteKit のパフォーマンスが大幅に低下する
のキャッシュされたインスタンスを消去するときに、非常に奇妙な問題が発生しますSKTextureAtlas
。
つまり、ゲームが開始する前にSKTextureAtlas
withをプリロードtextureAtlas.preload(completionHandler:)
し、完了ハンドラーでアトラスへの参照をプライベート プロパティに保存して、後で使用できるようにメモリに保持します。
しばらくすると、このテクスチャ アトラスは不要になり、クリーンで健全な記憶を維持するために削除したいと考えています。
問題
私が抱えている問題は、(アトラスへの参照を保持していたプロパティを に設定することによって) テクスチャ アトラスを消去するとnil
、パフォーマンスが数秒間大幅に低下することです。大幅に、一定の 60 fps から 40 fps を意味します。
この時点で残されたそのアトラスへの他の参照は絶対にないことに注意してください.
興味深い: パート 1
iOS 10 でのみ発生します。iOS 9 では、はるかに古いデバイスでも完全に動作します。
興味深い: パート 2
アトラスが の形式で定義されている場合にのみ発生.spriteatlas
し.xcassets
ます。ただし、アトラスが の.atlas
外部のフォルダーである場合はそうではありません.xcassets
。
.atlas
の代わりに先に進んで使用できることはわかっていますが、そのままで app-thinning をサポートしています.spriteatlas
が、サポートしていません。.spriteatlas
.atlas
興味深い: パート 3
アトラスに少数の小さなテクスチャがある場合、パージは正常に機能します。これは、アトラスの合計サイズに関連する内部の問題がある可能性があることを示しています。しかし、なぜ?
動機
この問題の解決策/回避策を見つける背後にある動機は、バインド/描画呼び出しのバッチ処理です。同じテクスチャを使用する子ノードはすべて 1 回の描画パスでレンダリングされるため、もちろんパフォーマンスが大幅に向上します。
この問題により、基本的に複数のアトラスを作成する必要があり、その結果、複数の描画呼び出しが発生し、全体的なパフォーマンスに影響を与えます。
どんな助けでも大歓迎です。
アップデート
@Knight0fDragon によって提案されたソリューションを実装しようとしました。これは、それ自体ではなくSKTexture
s をキャッシュすることを提案していますが、残念ながら私の場合はうまくいきませんでした。SKTextureAtlas
SKTextureAtlas
元の質問で忘れていたのは、この問題はほとんどの場合発生するが、常に発生するわけではないということです。〜5回の試行ごとに完全に正常に動作します。
解決
誤って重複としてマークされた後、質問を再度開くことができなかったので、見つけた解決策をここに投稿します。
問題は、バックグラウンドで実行されているアニメーションでした。このアニメーションはこのように設定されました
のレイヤーで実行されていましたUIImageView
。このイメージ ビューは、最終的にゲーム シーンを含む別のビュー コントローラーを提示するビュー コントローラーに配置されました。
beginAppearanceTransition
これらの 2 つのビュー コントローラー間のトランジションはカスタムです。カスタム トランジション アニメーターに呼び出しを追加するのを忘れたためendAppearanceTransition
、ビュー コントローラーのライフサイクル メソッド ( viewWillAppear:
、viewWillDisappear
) は呼び出されませんでした。アニメーション。したがって、アニメーションはバックグラウンドで実行され続けました。
とはいえ、アニメーションがバックグラウンドで実行されていたとしても、キャッシュされたアトラスのクリアなど、まったく関係のないことを妨げるべきではありません。
注: 問題のあるアニメーションを含む画像ビューの画像は、問題のあるテクスチャ アトラスでは定義されていません。
ios - SpriteKit: SKTextureAtlas のプリロード中のパフォーマンス ヒット
プリロード時にパフォーマンス ヒットが発生していますSKTextureAtlas
。
パフォーマンス ヒットとは、FPS が短時間で 50 まで低下することを意味します。
でテストしTime Profiler
、ドキュメントInstruments
に記載されているように、この作業が実際にワーカー スレッドで行われていることを確認しました。
以下の画像は、Time Profiler
アトラスのプリロードによって引き起こされたスパイクのキャプチャを示しています。ご覧のとおり、スパイクのほとんどは 2 つのワーカー スレッドによって引き起こされており、私が理解できる限り、これらはすべて画像データを読み込んでいるようです。ただし、これによりメインスレッドの IMHO でパフォーマンスが低下することはありません。
注 1 :.spriteatlas
プリロードするのはそれほど大きくありません: 約 4 つのアセット。1000x1000
サイズ。
注2:iPhone 6、iOS 10、Xcode 8でテストしています。
注 3 : 同時に行われている実質的な作業は他にありません。CPU は常に ~30% でホバリングしています。GPUも同様です。
注 4 : アトラスのプリロードは、そのアトラスのテクスチャが必要になる前に要求されるため、プリロードするのに十分な時間が必要です。
どんな助け/指示も大歓迎です!
アップデート
プリロードが発生する完全なコード ブロック:
更新 2
アトラスプリロードブロックだけで空のプロジェクトを作成しました。パフォーマンスの低下は引き続き発生します。アセットが 1 つしかないアトラスでも、複数のアトラスを試してみました。
この空の新しいプロジェクトで@Sezが提案したことも試しました(以下を参照)が、その場合、完了ブロックも呼び出されませんでした。これはSKTextureAtlas
クラスの別のバグのようです。(?!)
更新 3
を削除して、同じテクスチャで.spriteatlas
を作成しようとしました.atlas
が、(ほとんど) パフォーマンス ヒットはありません。ただし、最初.atlas
に使用したいのはスライスをサポートしていないためです。.spriteatlas