valueerror Posted March 1, 2014 Share Posted March 1, 2014 I'm unsure what these options actually do... I thought in JavaScript there is no sleep() .. I hope someone can clear this up for me... Thank you! Link to comment Share on other sites More sharing options...
george Posted March 1, 2014 Share Posted March 1, 2014 This is related to the physics engine p2.If a body is allowed to sleep the physic engine can put it in a state where it gets excluded from some expensive physics calculations- for example the collision detection. To determine if a body should sleep or wake up the engine checks if the body changed significantly during a calculation step.FALL SLEEP: If the body is awake and it's activity level, determined by its velocity, is below a given threshold it will sleep.WAKE UP: If the body's velocity is sleeping and its velocity is above a threshold it will wake up and becoming a fully functional member of the physics community again A sleeping body cannot be fully excluded from the collision calculation list, as it needs to be seen by other bodies awake (so they can collide with the sleeping body).I guess it heavily depends of the chosen broadphase/collision algorithm when a body wakes up or is allowed to participate in a collision. This is the code I read to explain you this behaviour as I was curious about the current sleep implementation of p2.//from p2.Body, the physics engine in Phaser/** * @method sleepTick * @param float time The world time in seconds * @brief Called every timestep to update internal sleep timer and change sleep state if needed. */Body.prototype.sleepTick = function(time){ if(!this.allowSleep) return; var sleepState = this.sleepState, speedSquared = vec2.squaredLength(this.velocity) + Math.pow(this.angularVelocity,2), speedLimitSquared = Math.pow(this.sleepSpeedLimit,2); if(sleepState===Body.AWAKE && speedSquared < speedLimitSquared){ this.sleepState = Body.SLEEPY; // Sleepy this.timeLastSleepy = time; this.emit(Body.sleepyEvent); } else if(sleepState===Body.SLEEPY && speedSquared > speedLimitSquared){ this.wakeUp(); // Wake up } else if(sleepState===Body.SLEEPY && (time - this.timeLastSleepy ) > this.sleepTimeLimit){ this.sleep(); }};// from Broadphase.js/** * Check whether two bodies are allowed to collide at all. * @method canCollide * @param {Body} bodyA * @param {Body} bodyB * @return {Boolean} */Broadphase.canCollide = function(bodyA, bodyB){ // Cannot collide static bodies if(bodyA.motionState == Body.STATIC && bodyB.motionState == Body.STATIC) return false; // Cannot collide static vs kinematic bodies if( (bodyA.motionState == Body.KINEMATIC && bodyB.motionState == Body.STATIC) || (bodyA.motionState == Body.STATIC && bodyB.motionState == Body.KINEMATIC)) return false; // Cannot collide kinematic vs kinematic if(bodyA.motionState == Body.KINEMATIC && bodyB.motionState == Body.KINEMATIC) return false; // Cannot collide both sleeping bodies if(bodyA.sleepState == Body.SLEEPING && bodyB.sleepState == Body.SLEEPING) return false; return true;}; RegardsGeorge Link to comment Share on other sites More sharing options...
valueerror Posted March 1, 2014 Author Share Posted March 1, 2014 Hey wow..thank you very much for this detailed information... So I definitely should use this functionality my test game sucks in mobile because of to many things to calculate i guess.. Link to comment Share on other sites More sharing options...
george Posted March 1, 2014 Share Posted March 1, 2014 Yes, I would do so too. In fact it defaults to true in the very famous and mature Box2D C++ physic library. How many objects are involved in your physics currently ? 50 ? Or even more ? It seems that on mobile any js physics engine is breaking due to the required performance. The only solution I see is using web workers which is itself highly difficult to manage a physics engine with. But there are other problems with web workers, of course See that post from Stefan, the author of p2, about web workers.http://granular.cs.umu.se/browserphysics/?p=2125 Here an excellent introduction to web workershttp://www.html5rocks.com/en/tutorials/workers/basics/ Performance of other physics engines:1. Look at this Box2D JS port.It's using the very recent Box2D version 2.3 and is compiled by using googles closure compiler. It seems to be pretty fast on the desktop.Nobody seems to know or use that port, so I do not know about the performance in comparison. (Everybvody is only talking about the outdated Box2D Web (C->Flash->JS) Port based on 2.1 alpha).BUT try the examples on your mobile or tablet. The are running pretty slick until you break some body count threshold. Run the 'stacked boxes' example vs. 'pyramid'. Pyramid is awful slow on my iphone 5.https://code.google.com/p/box2d-html5/ 2. Same here with chipmunk js.Logo smash with those many particles nearly kills my mobile- well it's not performant on my laptop either https://dl.dropboxusercontent.com/u/2494815/demo/index.html 3. Physics JSAgain. Many objects, bad performance.http://wellcaffeinated.net/PhysicsJS/examples/showcase.html#demo-2 Mobile is simply not desktop, particularly in a non-native environment like a web browser Link to comment Share on other sites More sharing options...
valueerror Posted March 1, 2014 Author Share Posted March 1, 2014 Yes.. 50+ objects, all animated, 4 layers parallax in x and y axis..but I guess this should not be to much compared with whats happening on logosmash.. (3fps on my nexus) BUT I just found out that there isn't any notable Performance issue in my testgame with phaser when forcing Canvas instead of webgl.. With webgl on a nexus7 2013 I have.. Let's say 20 frames.. With canvas 60..Interesting read about web workers btw. Link to comment Share on other sites More sharing options...
Recommended Posts