質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
SpriteKit

SpriteKitは、iOSやOS Xで使用できるApple社製の2Dゲーム開発フレームワークです。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

1856閲覧

swiftの物理演算で、処理が異常に重くなる

yaoriku_ava

総合スコア25

SpriteKit

SpriteKitは、iOSやOS Xで使用できるApple社製の2Dゲーム開発フレームワークです。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2018/12/17 15:05

編集2022/01/12 10:55

SpriteKitで物理演算をしようと思い、二種類の方法でSKPhysicsBodyをSKSpriteNodeに組み込んだのですが、一方の方法がものすごい重くなってしまいます。Xcodeで処理中のCPUの使用率の遷移を見ると、重くなっている方では症状が現れる瞬間にPhysicsの項目がとても高くなっていました。行ったのは以下の2つの手法です。

画像ファイルの名前はapple.pngとします。

①通常通り、ソースコードと同じ階層にあるpngファイルを読み込み、物理ボディをつける。

swift

1let sprite = SKSpriteNode(imageNamed: "apple.png") 2print(sprite.size) // =>(547.0, 456.0) 3sprite.physicsBody = SKPhysicsBody(texture: sprite.texture, size: sprite.size) 4self.addChild(sprite)

この方法だと、複数のapple同士がぶつかっても滑らかに描画が行われました。

②アプリのローカルディレクトリからpngファイルを読み込み、物理ボディをつける。

swift

1let path = NSHomeDirectory() + "/Library/Application Support/pngPictures/apple.png" 2let texture = SKTexture(imageNamed: path) 3print(texture.size()) // =>(547.0, 456.0) 4let sprite = SKSpriteNode(texture: texture) 5print(sprite.size) // =>(547.0, 456.0) 6sprite.physicsBody = SKPhysicsBody(texture: sprite.texture, size: sprite.size) 7self.addChild(sprite)

このように、アプリのローカルディレクトリにあるpng形式の画像ファイルを読み込み、それに対して物理ボディを付加すると、複数のapple同士がぶつかる直前からfpsが60→4のような異常な落ち込みを見せ、cpu使用率のphysicsの項目が跳ね上がります。なぜ、ファイルの場所が変わっただけで全く同じファイルなのにこんなにも処理速度に違いが生まれてしまうのでしょうか...

自分が作っているアプリではどうしてもアプリのローカルディレクトリから画像を読み込みたいのですが、この二番目の手法でも描画速度を落とさないためにはどうすれば良いでしょうか?なんでもいいので、気づいたことがあればアドバイスいただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2018/12/18 00:52 編集

それぞれの sprite.size と sprite.texture.size() を教えて下さい。【追記】画像apple.pngのサイズも教えて下さい。
yaoriku_ava

2018/12/18 10:16

質問を編集させていただきました。 二つの手法ともに、sprite.size、texture.size()、pngのサイズは幅547.0、高さ456.0となっています。
guest

回答1

0

見た感じ全く同じやり方ではないようですが、
②を①と同じ書き方で実行するとどうでしょう?

swift

1let path = NSHomeDirectory() + "/Library/Application Support/pngPictures/apple.png" 2let sprite = SKSpriteNode(imageNamed: path) 3sprite.physicsBody = SKPhysicsBody(texture: sprite.texture, size: sprite.size) 4self.addChild(sprite)

投稿2018/12/19 08:52

takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yaoriku_ava

2018/12/19 09:09

ご回答ありがとうございます! 早速試してみましたが変わりませんでした... ちなみに、この時もそれぞれのサイズは変わらず幅547.0、高さ456.0でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問