eloipuertas / ES2015A

VideoJoc Curs Enginyeria Software 2015
GNU General Public License v3.0
14 stars 7 forks source link

Ghost AI when reloading game (it coexists with new AI) #522

Open c30zD opened 8 years ago

c30zD commented 8 years ago

Pel que he vist, sembla que a la memòria hi ha alguna instància de la IA que no hauria de ser (i potser també del Player, però no està confirmat).

Buscant una solució pel problema que no es mostra la pantalla de finalització del joc —#517 —, he trobat que tot s'inicialitza bé, però sembla que de vegades s'utilitza informació vella. Tot i així, hi ha alguna instància que sí que és nova, la qual cosa em sembla molt estrany, perquè en principi hauria de ser un singleton. Ara, bé, sospito que en realitat no és la IA, sinó que té alguna cosa a veure amb el FOW.

c30zD commented 8 years ago

Fent debug, veig aquesta informació a la IA fantasma:

ghost_ai1

Si us hi fixeu, el AIController és null, la qual cosa també passa amb altres objectes, com ara el MissionController, observat des del MissionStatus que pertany al BasePlayer del qual n'és fill. A més a més, la informació dels edificis enemics és vella (i de fet surt com a null):

ghost_ai_enemybuildings1

c30zD commented 8 years ago

En canvi, també hi ha una instància bona de la IA:

not_ghost_ai1

En aquesta sí que hi ha els valors nous. A més a més, com que just he començat a jugar, també podeu observar que la informació dels edificis enemics està buida:

not_ghost_ai_enemybuildings1

c30zD commented 8 years ago

No sé si passa amb el joc normal (suposo que no), però en tot cas, crec que el problema té alguna cosa a veure amb el fet de no alliberar la memòria del Subscriber a la IA, ja que aquesta situació es produeix durant una crida al FOWManager.LateUpdate(). Ara ho provaré, però potser és alguna altra cosa, ja que la informació bona hi és, en algun lloc.

gpascualg commented 8 years ago

Vaig estar l'altre dia fent refactoring de diverses clases que mantenien referencies estàtiques a clases antigues, per tant no seria gens raro que això passés.

Efectivament els Subscriber(s), en general, són singletons i per tant mai alliberarant la memòria a menys que explicitament se'ls hi digui (la pròpia classe conté una referència a sí mateixa, per tant el GC mai fa una passada sobre aquest).

Des del refactoring tot singleton (que hereti de Singleton<T>) té un mètode Clear que allibera tal punter.

Supossant que saps tots els Subscribers que vols alliberar (probablement tots els referents a SubscribableActor<T>), podries anar cridant:

Subscriber<.., ..>.Clear()

I probablement un bon lloc seria en el mètode EndGame, on ja vaig implementar en el refactoring. Ara sóc a classe, però pots mirar aquest commit per referència:

f97fe98e8b5688f18f89f3323d93b930b1e39f98

Cap a les 7 seré per casa, per si vols parlar per Hangouts o com vulguis

gpascualg commented 8 years ago

@c30zD Com ho portes? Necesites un cop de mà o quelcom?

c30zD commented 8 years ago

@gpascualg D'això, no sé què fer. Començo a pensar que té més a veure amb Unity que no amb el codi, però no sé... Sembla un problema amb el sistema d'events, i específicament amb el FOW, ja que no executa la funció que està registrada, però només passa (no sempre) amb l'stronghold, ja que fins ara no he vist que passi amb altres edificis.

gpascualg commented 8 years ago

@c30zD Hablemos por hangouts a ver si lo sacamos adelante. Creo que Juan te está poniendo en la conver, sino comentaselo pls.

gpascualg commented 8 years ago

En principi i fins on vaig poder provar ja ho vaig arreglar :) per la meva part ja es pot tancar la issue