Slightly off topic - do you know if Pixi is purely WebGL? Or does it handle Phaser's Canvas rendering as well? Here's a pretty cool use of skewing in a HTML5 game: http://m.spele.nl/games/brainteaser/jelly-madness/index.php?v=3

Yeah that's what I've done. Instead of looking specifically for just iOS 5, I'm setting the requirement to WebAudio. That'll be a much better solution since my game is not one that would work well with slowdowns.

Is there a way to disable the HTML audio tag use in Phaser? I'm all for pushing development forward and only use WebAudio. Disabling HTML audio tag would solve both that and my problem. Or I suppose I could just check the Device for webAudio API availability and if it's not there, just don't call the .play() on my sounds.

Yeah you're probably right. The big issue is that even if you've muted the game, it still slows down like that. Also, once it's slowed down, it's staying there. So you can't mute it after the fact to mitigate the problem. Also, during my testing, I've had some random firing of the actual sound in my phone. As in, I did hear the sound, but maybe 30 seconds from the press of the button. So, for now, my solution is to just make sure it's not iOS before I try to play a sound.

Sure, I've set one up here: http://waikiki.macklin.se/livefolder/audiotest/ Whichever I try to play on both Safari and Chrome on my iPhone with iOS 5.1.1, it jumps from 60fps to 5-7 fps and stays there. Just one play will do it. All except the OGG one which doesn't do anything, which is expected. That would be relevant when digging through the code. I've been looking at the source but I'm lost when it comes to finding where it actually triggers and fires the audio tag play. I assume it's the audio element tag in this case, since iOS5 doesn't have webaudio. If you have iOS 5 anywhere and try that page, please let me know how it turns out!

Using Safari or Chrome on iOS 5.1.1, an iPhone 4S, I'm trying to play audio. In a simple test case with 60 fps, trying to play a ~10kb wav file kills the performance instantly and puts it to ~2-3 fps and it stays there. If the main Phaser sound engine is muted before playing, this still results in this performance loss. In my game I'm working on, I've resorted to user agent sniffing in all calls to sound.play(), making sure I don't call any sound plays on iOS 5 at all. Would you try another solution? What I'm doing now works basically and it's a lost cause adhering to ALL os's and devices but since I have this in my arsenal I might as well adjust to it.

My guess is that if there is any performance difference between canvas mobile played in the browser vs embedded in an app, it would perform worse in an app. My tip only leads you to step one - canvas browser based, not android/iphone app. There are things, like Phonegap, Cordoba and others. I have very little experience with this however.

I managed to solve this after much hair tearing I was using the full screen mobile template as you know. That uses an IIFE to trigger the boot of the game. Instead, I put it in a function which runs on <body onload="startGame"> That gives the browser the needed time to get its shit together, so this is solved with that. Trivial in one way - but significant in that without it, games that uses dragging gestures are ruined in Android Firefox without this fix. Update:Sorry, I was too early on the trigger, this was due to something else. I could only get the problem to go away by making sure that I set up all my screen settings in the preload function of the Boot state rather than in the create function.Also, I needed to make sure I ended the section with a call to game.scale.refresh(); So, for example, my Boot state's preload function is now: preload: function () { // Here we load the assets required for our preloader (in this case a background and a loading bar) this.load.image('preloader-bg', 'img/preloader-bg.png'); this.load.image('preloader-bar', 'img/preloader-bar.png'); this.load.image('pplogo', 'img/pplogo.png'); if (this.game.device.desktop) { this.game.scale.scaleMode = Phaser.ScaleManager.SHOW_ALL; this.game.scale.minWidth = 320; this.game.scale.minHeight = 480; this.game.scale.maxWidth = 800; this.game.scale.maxHeight = 1200; this.game.scale.pageAlignHorizontally = true; this.game.scale.pageAlignVertically = true; this.game.scale.setScreenSize(true); } else { this.game.scale.scaleMode = Phaser.ScaleManager.SHOW_ALL; this.game.scale.minWidth = 277; this.game.scale.minHeight = 416; this.game.scale.maxWidth = 640; this.game.scale.maxHeight = 960; this.game.scale.pageAlignHorizontally = true; this.game.scale.pageAlignVertically = true; this.game.scale.forceOrientation(false, true); this.game.scale.hasResized.add(this.gameResized, this); this.game.scale.enterIncorrectOrientation.add(this.enterIncorrectOrientation, this); this.game.scale.leaveIncorrectOrientation.add(this.leaveIncorrectOrientation, this); this.game.scale.setScreenSize(true); this.game.scale.setShowAll(); this.game.scale.refresh(); } }, The important thing here being that it is no longer in the create function, and that I have the refresh() call. I'm actually not sure why this is a problem but this fixed it for me.

Using this: https://github.com/photonstorm/phaser/tree/master/resources/Project%20Templates/Full%20Screen%20Mobile You could make something like this: http://gamepyong.com/ints/ints.php Try it on desktop and mobile, see what you think! Explanation: the template is just a starting template (read the code in it). It's not 100% (I'm having trouble right now with a bug on Android Firefox) but it will get you VERY far!