2011-07-16, 02:02
  #1
Medlem
Bigtimepommess avatar
Godkväll Flashback!
Rubriken kanske är lite förvirrade, men jag ska försöka förklara så gott jag kan. Anledningen att jag postar detta i övriga utvecklingsfrågor är för att mitt problem är egentligen inte bundet till ett speciellt programmeringsspråk. Det är egentligen bara principen (hur det ska göras) jag behöver. Alltså, ingen kod, utan bara hur jag ska göra det.

Hur som helst, till topic.

Var femte minut så uppdateras en lista med spelare online och alla dess namn. Jag hämtar dessa via PHP och sparar sedan ner hur många som är online, varje spelares namn samt tiden den spelaren var online.
Min databas består av tre olika tabeller,
1. Characters - Här hamnar namnet på varje ny spelare som hittas i online listan (inga dubbletter)
2. General data - Här sparas det antalet spelare som var online och vilken tid det var
3. Timestamps - Här sparas varje spelare som finns i onlinelistan samt tiden då den spelaren var online

Jag vet inte om detta är det mest optimala sättet att spara data på, då tabellen timestamps fylls på extremt snabbt. Som sagt, var femte minut så läggs varje spelare till där, samt tidstämpel på när det var.

Det jag tänkte göra med all denna data är att försöka göra en algoritm för att räkna ut vilken spelare som troligen är vem med hjälp av den data jag hämtar (baserad på sannolikhet). På varje konto kan endast en spelare vara online åt gången. Så för att lista ut vilka det kan vara, så har jag jämfört spelaren man söker på (spelare A)'s alla timestamps online mot ALLA andras spelares timestamps online. Om någon spelare ALDRIG har varit online samtidigt som spelare A, så läggs den till i en lista/array. Därmed har jag nu en lista med alla spelare som inte varit online samtidigt som spelare A. Härifrån så sitter jag fast. Jag behöver nu något sätt att rangordna dessa spelare efter störst sannolikhet är spelare A. Jag behöver mer precision. Ett sätt antar jag är att samla EXTREMT mycket data ända tills det bara är ett få antal spelare kvar, men det bör finnas ett annat sätt. Jag vet att detta ska gå att lösa, då jag blivit inspirerad av en sida som troligen gör samma sak(fast för pengar).

Om ni har några frågor/funderingar så är det bara att fråga. Jag ska göra så gott jag kan för att förklara!

Mvh
Citera
2011-07-16, 04:07
  #2
Medlem
Citat:
Ursprungligen postat av Bigtimepommes
Godkväll Flashback!
Rubriken kanske är lite förvirrade, men jag ska försöka förklara så gott jag kan. Anledningen att jag postar detta i övriga utvecklingsfrågor är för att mitt problem är egentligen inte bundet till ett speciellt programmeringsspråk. Det är egentligen bara principen (hur det ska göras) jag behöver. Alltså, ingen kod, utan bara hur jag ska göra det.

Hur som helst, till topic.

Var femte minut så uppdateras en lista med spelare online och alla dess namn. Jag hämtar dessa via PHP och sparar sedan ner hur många som är online, varje spelares namn samt tiden den spelaren var online.
Min databas består av tre olika tabeller,
1. Characters - Här hamnar namnet på varje ny spelare som hittas i online listan (inga dubbletter)
2. General data - Här sparas det antalet spelare som var online och vilken tid det var
3. Timestamps - Här sparas varje spelare som finns i onlinelistan samt tiden då den spelaren var online

Jag vet inte om detta är det mest optimala sättet att spara data på, då tabellen timestamps fylls på extremt snabbt. Som sagt, var femte minut så läggs varje spelare till där, samt tidstämpel på när det var.

Det jag tänkte göra med all denna data är att försöka göra en algoritm för att räkna ut vilken spelare som troligen är vem med hjälp av den data jag hämtar (baserad på sannolikhet). På varje konto kan endast en spelare vara online åt gången. Så för att lista ut vilka det kan vara, så har jag jämfört spelaren man söker på (spelare A)'s alla timestamps online mot ALLA andras spelares timestamps online. Om någon spelare ALDRIG har varit online samtidigt som spelare A, så läggs den till i en lista/array. Därmed har jag nu en lista med alla spelare som inte varit online samtidigt som spelare A. Härifrån så sitter jag fast. Jag behöver nu något sätt att rangordna dessa spelare efter störst sannolikhet är spelare A. Jag behöver mer precision. Ett sätt antar jag är att samla EXTREMT mycket data ända tills det bara är ett få antal spelare kvar, men det bör finnas ett annat sätt. Jag vet att detta ska gå att lösa, då jag blivit inspirerad av en sida som troligen gör samma sak(fast för pengar).

Om ni har några frågor/funderingar så är det bara att fråga. Jag ska göra så gott jag kan för att förklara!

Mvh
Har några tankar/idéer. För det första kan du väl göra om strukturen i `timestamps` till något liknande:

id, character_id, login_time, logout_time.

När du uppdaterar kollar du först efter rader där logout_time är null och jämför de med listan, om en rad existerar i tabellen men inte i listan så läggs logout_time till. Detta fungerar ju dock endast om online-listan du parsar är pålitlig men beroende på hur ofta du uppdaterar datan kan detta hjälpa till lite med datamängden. Du behöver ju egentligen inte `General data` heller, du kan lika gärna köra något i stil med:

Kod:
SELECT COUNT(*) FROM timestamps WHERE '$datetime' BETWEEN login_time AND logout_time

Dock kan det kanske vara smart att strunta i det och låta det ligga kvar i en separat tabell om du använder datan ofta då det bör ge en ytterst liten prestandaförbättring.

Har även lite tankar på hur du kan räkna ut vem som är vem. Jag tycker du ska jämföra login-tider med logout-tider. Vet inte vilket spel det rör sig om, men om en karaktär loggar ut och en annan karaktär loggar in direkt efteråt ökar sannolikheten för att det är samma person. Det här bevisar självklart inte någonting om det bara hänt ett par gånger och aktiviteten på servern är hög (d.v.s. det loggar in/ut karaktärer hela tiden), men om det hänt säg 50 gånger så ger det en ganska klar bild. I grund och botten handlar det om att samla stora mängder data att bearbeta. Ett problem med detta är att det baserar sig på hur ofta du har möjlighet att hämta ny data och hur ofta listan du parsar uppdateras, ju kortare intervaller ju mer pålitligt bör det bli.

Det finns säkert fler sätt att göra det på, men detta var det första jag kom att tänka på. Gonatt!
__________________
Senast redigerad av Frited 2011-07-16 kl. 04:13.
Citera
2011-07-16, 10:44
  #3
Medlem
The Barrs avatar
Citat:
Ursprungligen postat av Bigtimepommes
Godkväll Flashback!

Mvh

Istället för att logga tiden för alla användare var 5'e minut i en tabell skulle jag försöka hålla koll på användarens in och utloggningstid och spara dessa i typ UserSession(userId, startTime, EndTime). Kanske genom att hålla koll på _en_ tidsstämpel för en aktiv användarens senaste aktivitet, om det inte händer något på exempelvis en minut så loggas han ut automatiskt, vilket t.ex. kan kollas varje gång det sker ett request till eller från spelaren eller med regelbundna intervall. Om han nu inte loggar ut aktivt förstås.

Om det är säkert att en användare inte kan vara inloggad på olika spelare samtidigt (vilket kanske inte alls är fallet om detta är ett webbaserat spel?) bör väl tidsjämförelsen gallra ut de flesta och tillsammans med IP kan jag tänka mig att du gallrar ut nästan alla.

Annars får du väl göra en bredare analys av användarens beteende utifrån parametrar som man kan tänka sig är desamma för spelarens karaktärer. Vilka tider spelaren brukar spela kanske, vilka ord han/hon brukar använda om det finns någon chatfunktion, hur spelmönstren ser ut och så vidare. Kan möjligtvis vara lite krångligt speciellt med tanke på att man kanske går in i olika roller med olika karaktärer... En teknisk egenskap att undersöka kanske kan vara karaktärernas pingtider?
__________________
Senast redigerad av The Barr 2011-07-16 kl. 10:47.
Citera
2011-07-16, 14:47
  #4
Medlem
Bigtimepommess avatar
Tacksam för era svar! Det har fått mig att fundera lite!
Angående datan jag hämtar, så är det från spelets hemsida som uppdaterar exakt var femte minut, så jag kan inte hämta data oftare än så. Det där ni säger med att spara login och logout tider så blir det med 5 minuters precision. Och som ni säger så bör det minska datan markant.

Pratade även med några vänner och vi kom fram till (som ni även nämnde) att jämföra login och logout tider. Det bör förbättra resultaten lite åtminstone. Sen de spelare som fanns i listan på troliga matchar ska även jämföras mot varandra, då de inte bör vara online samtidigt som någon annan heller (om de då är på samma konto)

Får ta och pilla lite på det senare när jag kommer hem! Återigen tack!
Citera
2011-07-17, 00:17
  #5
Medlem
The Barrs avatar
Jahaaa... Det är alltså inte ett eget spel du har? Missförstod dig, då blir det ju lite krångligare.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in