Megadreams Geplaatst: 21 juni 2011 Rapport Share Geplaatst: 21 juni 2011 Zoals jullie weten word het volgende zeer veel gebruikt als je een bepaald iets voor alle online spelers wil uitvoeren: for(new i;i<MAX_PLAYERS;i++) { if(IsPlayerConnected(i)) { // Hier wat je wil doen... } } Maar waarom eigenlijk de loop 500x uitvoeren als er toch maar bijvoorbeeld 5 spelers in de server zitten? Het kan in feite toch nog net wat efficiënter. Namelijk een variable die ik nu HID noem waarin de hoogste playerid in zit die zich op het moment in de server bevindt. Dan zal als er maar 5 spelers zijn in principe de loop dus maar 5x moeten lopen inplaats van die 500 (of iets anders als je de MAX_PLAYERS define redefined) keer. Dat brengt toch wat meer efficiëntie met zich mee. Bij OnPlayerConnect moet er nagekeken worden of de playerid van de speler die net heeft geconnect groter is dan de huidige ID die zich HID bevindt. Zoja dan zal HID moeten verhoogt worden, dit kan heel simpel zo: public OnPlayerConnect(playerid) { HID=(playerid>HID) ? playerid : HID; return 1; } Of als je het liever wat anders wilt al komt het wel op hetzelfde neer: public OnPlayerConnect(playerid) { if(playerid>HID) HID=playerid; return 1; } Maar wanneer de speler met de hoogste playerid de server verlaat moet HID dus weer verlaagt worden naar de dan hoogste playerid. We hebben eigenlijk 2 mogelijkheden, we laten HID naar de werkelijke op dat moment hoogste playerid gaan of we doen gewoon -1. Gezien het feit dat in een normale server de id nadat een speler de server verlaten heeft snel weer zal opgevuld worden. Mogelijkheid #1: Loop public OnPlayerDisconnect(playerid, reason) { if(playerid==HID) { for(new i;i<HID;i++) { if(IsPlayerConnected(i)) HID=i; } } return 1; } Mogelijkheid #2: -1 public OnPlayerDisconnect(playerid, reason) { if(playerid==HID) HID--; return 1; } Ik zou meer voor de 2de gaan aangezien deze efficiënter is en de playerid normaal wel opgevuld zou moeten worden. Althans dat is toch wat je hoopt... Wat vinden jullie van dit idee en de mogelijke mogelijkheden? Reageren Link to comment Delen op andere websites More sharing options...
Wanted Geplaatst: 22 juni 2011 Rapport Share Geplaatst: 22 juni 2011 Ik gebruik gewoon foreach. Deze loopt alleen door de spelers die daadwerkelijk online zijn, dus het "IsPlayerConnected" stukje is ook niet meer nodig. Reageren Link to comment Delen op andere websites More sharing options...
Megadreams Geplaatst: 22 juni 2011 Auteur Rapport Share Geplaatst: 22 juni 2011 Had ik eigenlijk niet aan gedacht dat is inderdaad toch wat makkelijker. Reageren Link to comment Delen op andere websites More sharing options...
Big Boss Geplaatst: 22 juni 2011 Rapport Share Geplaatst: 22 juni 2011 Foreach inderdaad, al zit daar wel wat meer achter dan wat Megadreams gepost heeft. Wat ik persoonlijk altijd doe is: #undef MAX_PLAYERS #define MAX_PLAYERS (50) De #undef is nodig omdat je anders een warning krijgt. Reageren Link to comment Delen op andere websites More sharing options...
Megadreams Geplaatst: 22 juni 2011 Auteur Rapport Share Geplaatst: 22 juni 2011 Dat is ook iets wat ik altijd doet maar omdat het niet zo efficiënt is bedacht ik dit. Helaas dacht ik niet meer aan het feit dat er een foreach bestaat (met dank aan Y_Less die dit maakte al zouden de makers van pawn het zelf hebben moeten maken...). Reageren Link to comment Delen op andere websites More sharing options...
Recommended Posts
Een reactie plaatsen
Je kan nu een reactie plaatsen en pas achteraf registreren. Als je al lid bent, log eerst in om met je eigen account een reactie te plaatsen.