--JPThread API JPThread.activate ( sUserToken, sActivationKey ) sID = JPThread.create ( fFunction, vOptParam0, vOptParam1, vOptParam2, vOptParam3, vOptParam4, vOptParam5, vOptParam6, vOptParam7, vOptParam8, vOptParam9, vOptParam10, vOptParam11, vOptParam12, vOptParam13, vOptParam14, vOptParam15 ) JPThread.addYieldPoint ( ) JPThread.cancel ( sID ) JPThread.pause ( sID ) JPThread.resume ( sID ) JPThread.cancelAllThreads ( ) JPThread.pauseAllThreads ( ) JPThread.resumeAllThreads ( )
JPThread est un autre des cas packs magiques, qui vous permet de penser la conception de votre jeu différemment. Il vous permet d'exécuter le code d'une fonction sur plusieurs trames.
JPThread.create ( this.preloadSceneResources )
function MyAIModel.preloadSceneResources ( ) for i = 0, table.getSize ( this.tTextures ( ) ) - 1 do local sTextute = table.getAt ( this.tTextures ( ), i ) application.forceResourceToStayLoaded ( sTexture, application.kResourceTypeTexture, true ) JPThread.addYieldPoint ( ) end end
Le résultat sera que le chargement sera exécuté sur plusieurs trames, à la vitesse de 1 chargement de texture par trame. Votre jeu en sera alors beaucoup plus fluide. JPThread.addYieldPoint ( ) signifie que l'exécution de la fonction set mets en pause à cet endroit et qu'elle sera repris à la prochaine trame. Bien sur, vous pouvez ajouter cet appel plusieurs fois dans le code de votre fonction.
Voici un screenshot du Performance Reporter dans ShiVa, vous pouvez voir clairement que la fonction ne crée pas du tout un freeze car elle est exécutée sur plusieurs trames :
Comparaison des performances avec JPThread Cette fonctionalité est aussi très pratique dans de nombreux autres cas, pensez par exemple à comment vous chargez un fichier dans le cache actuellement. Maintenant, vous pourrez le faire avec un seul appel de fonction::
function MyAIModel.loadFile ( sFile, sUrl ) cache.addFile ( sFile, sUrl ) while ( cache.getFileStatus ( sFile ) >= 0 and cache.getFileStatus ( sFile ) < 1 ) do JPThread.addYieldPoint ( ) end local nStatus = cache.getFileStatus ( sFile ) if ( nStatus == 1 ) then --Success else --Fail end end
C'est un pack vraiment puissant.