1: 2018-06-28 (木) 13:31:25 njf[4] [5] [6] | 現: 2018-06-28 (木) 14:54:39 njf[4] [7] [8] | ||
---|---|---|---|
Line 2: | Line 2: | ||
mainRenderTexture = new RenderTexture(200, 200); | mainRenderTexture = new RenderTexture(200, 200); | ||
+ | |||
mainRenderTexture.draw(image); //StarlingのImageオブジェクトなどを書き込める。 | mainRenderTexture.draw(image); //StarlingのImageオブジェクトなどを書き込める。 | ||
+ | |||
var mainImage:Image = new Image(mainRenderTexture);//Textureとして使える | var mainImage:Image = new Image(mainRenderTexture);//Textureとして使える | ||
- | 例えばゲームで背景をマップチップ画像から作りたいとき、StarlingのImageで製作してしまうと、Imageオブジェクトが大量にできてしまい、負荷が大きくなってしまいます。 | + | 例えばゲームで背景をマップチップ画像から作りたいとき、StarlingのImageで製作してしまうとオブジェクトが大量にできてしまい、負荷が大きくなってしまいます。 |
そんなときにRenderTextureを使うと、一枚の画像扱いになるので負荷が大幅に減らせます。 | そんなときにRenderTextureを使うと、一枚の画像扱いになるので負荷が大幅に減らせます。 | ||
Line 13: | Line 13: | ||
つまり、AS3のBitmapdataのようなものと考えると良いでしょう。 | つまり、AS3のBitmapdataのようなものと考えると良いでしょう。 | ||
- | ただし、このRenderTextureはわかりにくいバグの原因になることがあります。 | + | &font(Red){ただし、このRenderTextureはわかりにくいバグの原因になることがあります。}; |
RenderTextureのコンストラクタの定義は以下の通りです。 | RenderTextureのコンストラクタの定義は以下の通りです。 | ||
Line 19: | Line 19: | ||
RenderTexture(width:int, height:int, persistent:Boolean = true, scale:Number = -1, format:String = bgra) | RenderTexture(width:int, height:int, persistent:Boolean = true, scale:Number = -1, format:String = bgra) | ||
- | 第四引数にscaleがあり、これを指定するとwidthとheightをscale倍したTextureを作成します。 | + | 第四引数にscaleがあり、これを指定すると内部ではwidthとheightをscale倍したTextureを作成します(外部からアクセスするときにはscaleの違いを意識する必要はありません)。 |
- | これが縮尺にもかかわらずデフォルト値が-1となっています。これは-1を指定すると、「Starling.contentScaleFactor」を使うことになります。ちなみにこの事実は公式ドキュメントにも見あたらず、ソースを見ないとわかりません。また、Textureにも同じscale変数がありますが、デフォルトは1になっています。 | + | これが縮尺にもかかわらずデフォルト値が-1となっています。これは-1を指定すると、「Starling.contentScaleFactor」を使うフラグの役目をすることになります。ちなみにこの事実は公式ドキュメントにも見あたらず、ソースを見ないとわかりません。 |
- | するとwidthなどに大きな値を入れると、Textureのサイズ制限(通常2048x2048)に引っかかって以下のようなランタイムエラーが発生します。 | + | するとwidthなどに大きな値を入れると、Textureのサイズ制限(通常2048x2048)に引っかかる場合があります。例えばheightを1300とかにしていて、Starling.contentScaleFactorが2なら2x1300=2600となり、2048を超えてしまうのです。すると以下のようなランタイムエラーが発生します。 |
ArgumentError: Error #3683 | ArgumentError: Error #3683 | ||
Line 28: | Line 28: | ||
Starling.contentScaleFactorは端末によって異なります。 | Starling.contentScaleFactorは端末によって異なります。 | ||
- | たまたまこれが大きな端末をテスト用に所持していないと、テスト時には気付かないエラーとなり、リリース後に問題が発覚することになります。 | + | たまたまこれが大きな端末をテスト用に所持していないと、テスト時には気付かないエラーとなり、リリース後に問題が発覚することになります。そして、発覚しても手持ちのデバイスでは再現できないので、どうしようもない、ということになります。 |
+ | |||
+ | 私はこのデバッグのために怪しい場所にtry文を入れて、catchでエラーメッセージをサーバーに送るようにしました。つまりデバッグ用に新たにサーバーを立てることになりました。そしてエラーメッセージが一つ送られ、原因が分かるとそのサーバーは役目を終えました。 | ||
+ | |||
+ | 対応が非常に面倒なエラーとなるので、RenderTextureを使う時は第四引数のscaleにテクスチャのサイズを意識した値を必ず入れるようにしましょう。 | ||
+ | |||
+ | 今後Starling.contentScaleFactorが大きな端末が多くなっていくと予想されるので、いままでうまくいっていたアプリが突然落ちることもありえ、注意が必要です。 | ||
- | 対応が非常に面倒なエラーとなるので、RenderTextureを使う時は第四引数のscaleに必ず値を入れるようにしましょう。 | + | すでにリリースしたアプリに使っている場合は見直した方が良いでしょう。 |
(This host) = https://njf.jp