先日リリースされたiOS12から、OpenGLはdeprecateにされました。
OpenGL ESの非推奨化
OpenGLを利用しているゲーム・アプリは、Metalに対応せざると得ません。
cocos2d-x などで単純なスプライトやパーティクルの表示しかしていない場合に、なるべく簡単に移植を済ませるにはどうしたら良いでしょうか?
Metal対応とは?
Metalに対応しているというのは、A7,A8のチップセットでiOS9以降のOSに対応するという事で良いと思います。iPhone5S / iPhone6 と iPad Air / iPad mini2 以降が対象で、古い端末は切り捨てる事になります。
既存アプリで使用していたOpenGLの代替
cocos2d-xを簡易的に利用していたアプリは、今回のMetal強制によって修正作業が将来的に発生してしまいました。iOS12の内はまだOpenGLで問題ありませんが、早ければ来年のiOS13ではアプリが弾かれるかもしれません。
大きく分けると、Uinty / UE4 などの開発環境に移植するのと、SpriteKit / SceneKit に置換する方向の2種類の方法があります。
Unity / UE4
Unity / UE4 では以前からMetalへの対応がされていたので、この機会に移植してしまうのも1つの手です。ただ、Unity / UE4 を触っていない人にとって、Unityを1から導入して既存の cocos2d-x アプリを移植するのは重い作業になります。
SpriteKit & SceneKit
SpriteKit & SceneKit は共に、Appleの用意しているフレームワークで、APIはMetalに対応してくれています。SpriteKit は2D、SceneKit は3Dですが、今回は cocos2d-x から SpriteKit への移植にテーマを絞ります。
SpriteKit
よく使われているクラスは以下の対応関係になるので、比較して移植を進めていきます。
cocos2d のクラスの置換
CCEAGLView | SKView・SKScene |
cocos2d::Sprite | SKSpriteNode |
cocos2d::Label | SKLabelNode |
cocos2d::ParticleSystemQuad | SKEmitterNode |
cocos2d::ActionInterval | SKAction |
std系やCGxxx系への置換
cocos2d::Map<>・cocos2d::Vec2 などcocos固有のクラスは、std::map<>・CGPoint などへ置換します。
対応出来なかった事・修正した事
・SKAction
cocos2d ではイージングの種類が豊富でしたが、用意されているイージングが少ないため自前で実装が必要です。
・SKLabelNode
テキスト表示が同じではないので、センタリングやベースラインなどでズレる場所が発生しました。ゲームなどでテキスト表示位置で大量の修正が発生するかもしれません。
・SKEmitterNode
cocos2d のパーティクルをそのまま移植は出来なかったので、Xcode上でsksを作成しました。2011-2012の頃に作成したものだったので、比較的最近のものであれば何か移植する手段があるかもしれないです。
まとめ
突然のOpenGLのdepricateにどのように対応してくか判断が難しいところだと思います。
アプリの本格的な Unity / UE4 などの開発環境への移植による対応はコスト的に無理なので、SpriteKitでdepricateに備えておきました。
結局、cocos2d-x がMetalに対応して何も修正が必要無いという可能性もあるのですが、どうしようか悩んでいる方の参考になれば幸いです。