Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

19.04.2010, 22:00

KI mit Threads lösen?

Ahoi,

ich bin neu hier bei spieleprogrammierer.de und hoffe hier eine nette Community gefunden zu haben.

Ich hätte auch gleich ein Problem das ich alleine so nicht lösen kann.

Ich programmiere derzeit ein kleines ORPG. Die Kommunikation zwischen Server und mehreren Clients funktioniert soweit recht gut.

Die Server/Client Kommunikation ist derzeit in einem Thread untergebracht und nun habe ich mir überlegt, wie ich Gegner (KI) gleichzeitig agieren lassen kann.

Dazu hab ich mir gedacht ich nehme auch einen neuen Thread für die Gegner.

Nun meine eigentliche Überlegung:
Jeder Gegner ist in einem Schlafmodus solange, bis ein Spieler einen bestimmten Umkreis des Gegners betritt und erst dann agiert der Gegner -> er bewegt sich, greift spieler an etc.

Nun das würde bedeuten ich hätte für jeden Gegner einen eigenen Thread mit einer while-Schleife
while(!Schlafmodus)
{
do something
}

Irgendwie denke ich mir, dass wenn ich 1-2 Gegner habe dies schön funktioniert, was aber wenn 100 oder sogar 1000 Gegner auf diese Art und weise agieren?
Das stelle ich mir ziemlich systemauslastend vor.

Wäre es eine gute Idee die KI so zu implementieren?

Da ich relativ neu bei Spieleprogrammierung bin wäre ich für jede Antwort und jeden Lösungsvorschlag dankbar

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

19.04.2010, 22:16

willkommen im forum.

ich glaube nicht, dass es eine gute idee ist so viele threads zu benutzten.
du kannst die ki doch in der normalen serverschleife laufen lassen. aktualisierst die KI in jedem frame, öfter bringt dir sowieso nichts.

abhängig von der technik wie du überprüft ob ein gegner in der nähe ist würd ich überlegen vllt die spieler die gegner aktivieren zu lassen und nicht die gegner auf die reagieren zu lassen.
aber ich weiß ja nicht wie das in deinem rpg läuft^^
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

3

19.04.2010, 22:28

ich glaube nicht, dass es eine gute idee ist so viele threads zu benutzten.
du kannst die ki doch in der normalen serverschleife laufen lassen. aktualisierst die KI in jedem frame, öfter bringt dir sowieso nichts.

abhängig von der technik wie du überprüft ob ein gegner in der nähe ist würd ich überlegen vllt die spieler die gegner aktivieren zu lassen und nicht die gegner auf die reagieren zu lassen.
aber ich weiß ja nicht wie das in deinem rpg läuft^^
Ich hab mir schon überlegt alle KI's in einer einzigen Schleife zu überprüfen, aber da habe ich wiederum die befürchtung, dass wenn das Spiel wirklich 1000+ KI's hat, die Synchronisation darunter leiden würde.

Ehm ja, es war auch so gedacht, dass Spieler die KI aktivieren. Wenn sich ein Spieler bewegt werden die neu geladenen Tiles in jener Richtung, in der sich der Spieler bewegt, auf Gegner überprüft und die gegner gegebenenfalls aktiviert :)

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

4

19.04.2010, 22:36

achso. ich dachte du willst jeden gegner überprüfen ob sich in der nähe eines spielers befindet. wenn du das andersherum machst hast du doch kein problem bei 1000+gegnern. nur not kannst du in jedem frame auch nur einen teil überprüfen. ob du nun einen thread benutzt der die schleife langsamer macht oder die schleife an sich langsamer machst ist egal. ach ich vergess immer, dass wir heute mehrere kerne haben... da wird wohl nen einzelner KIthread schneller sein. aber bitte nicht für jeden gegner einen thread.

edit: wer weiß wie die entwicklung weiter geht. vllt haben wir bald alle 800kerne. da würde das vllt wieder sinn machen xD
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

5

19.04.2010, 22:37

Allgemein gilt: halte die Updateaufgaben unabhängig voneinander "sprich wenn dann muss man sich auf den alten Zustand berufen". So kann man später auch noch Threads nutzen. Falls du mit einem Thread nicht mehr weiter kommen solltest, schau dir mal das Threadpool-Konzept an. So kann man die vorhandenen Kerne noch am besten auslasten ohne zuviel Overhead. Ist jedenfalls besser als 1000 Threads ;) .
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

6

20.04.2010, 16:39

Danke NachoMan & Nox für eure tolle Hilfe.

Ich bin mit meinen Überlegungen jetzt schon viel weiter gekommen.

Werbeanzeige