Gedanken zu Sichtfeldern
Übersicht

AvaGastBetreff: Gedanken zu Sichtfeldern |
![]() Antworten mit Zitat |
|
---|---|---|
Hallöchen!
Ava macht sich gerade Gedanken um die "Sichtfeldberechnung" ihrer Einheiten. *lalala* Berechnung habe ich mal in Anführungstriche gesetzt, da ich bisweilen (und das schon jaaahrelang) die Sichtfelder meiner Einheiten immer durch vorgefertigte Bilder und den drawImage() Befehl gesetzt habe. Ja ja, und ich durfte für diese Methode schon so manchen Spott ernten! ... ![]() Genau dies ist nun aber auch mein Problem! - denn ich hätte gern eine besserere, schnellerere, schöööönerere Methode! ![]() Also sitze ich nun hier und mache mir meine Gedanke zu dem Thema. Ansätze gibt es genug ... aber jeder einzelne besitzt seine Schwächen. Die sind mal mehr und mal weniger schwerwiegend, aber an meine bisherige Methode heranreichen - oder sie gar übertreffen - konnte bisher noch keine meiner Überlegungen meine bisherige Methode. ![]() Banks wären natürlich sehr naheliegend; der Zugriff ist selbstverständlich sehr viel schneller als auf eine Bitmapdatei. Der Sichtbereich jeder einzelnen Einheit könnte schneller ein- und ausgelesen werden und es würde ansich auch bessere Möglichkeiten für Zusatzinformationen bieten. Auch das saubere Ausblenden von sichtbaren zu nicht-sichtbaren Beriechen könnte sehr viel schöner gestaltet werden. Allerdings gibt es dann in BB keine Möglichkeit, diese bytes schnell genug in visuelle Daten umzusetzen. Denn wie könnte ich bitte ein bspw. 1024x1024 Sichtfeld nach dieser Methode permanent aktuell halten? Ich kann ja schlecht in jedem Loop die 1024x1024 Pixel per writePixelFast aktualisieren, um meine grafische Maske zu erstellen. ![]() Anstatt einer Bitmapmaske habe ich in diesem Zusammenhang auch schon mal über vertexColor und vertexAlpha nachgedacht, um den Sichtbereich darzustellen. Aber das Ergebnis finde ich nicht sehr schön (und letzteres sollte ich eh besser gleich aus meinen Gedanken streichen / flag 32 führt ja sowieso nur zu Problemen ![]() Also los Leutchens, unterstützt mich mal ein bisschen beim Brainstorming! Ich brauche eine Methode, die bei ~ 1000 Einheiten noch vernünftig läuft! (und da hat meine leider nur noch etwa 10 fps / ohne dass sonst irgendwas passiert ![]() Ich hab leider keine Ahnung, wie das in professionellen/kommerziellen Spielen wie bspw. Starcraft geregelt ist. Sonst könnte ich mich dort etwas orientieren. Aber die haben sicher auch sehr viel bessere Möglichkeiten, mit ihren Daten flexibler (und schneller) rumzuhantieren. ![]() Lieben Gruss, + Ava + |
||
![]() |
stfighter01 |
![]() Antworten mit Zitat ![]() |
---|---|---|
hmm so wie ich das von warcraft in errinerung habe gibt es dort eine art sichtbarkeitsraster.
jeder punkt im raster gibt quasi ein kleines rechteckchen (oder kann auch ein kreis sein) an, welcher, je nachdem ob sie schon von deinen einheiten entdeckt wurden, sichtbar oder verdeckt sind (oder bereits gefunden wurden, aber nicht mehr aktuallisiert werden). du muss nur von jeder einheit strahlen in jede richtung aussenden und sie solange laufen lassen bis sie ihre maximale sichtweite erreicht haben oder an ein hindernis stossen. alle punkte am raster durch die diese strahlen laufen gibst du frei. die anderen bleiben verdeckt. [edit] die aktuallisierung für eine einheit muss natürlich nur vorgenommen werden, wenn sich die einheit bewegt. ausserdem würde ich mir cos und sin werte vorberechnen, denn die wirst du in hülle und fülle brauchen. mfg stfighter |
||
Denken hilft! |
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Ach stfighter01, du bist putzig. ![]() Na die Mathematik und überhaupt das Berechnen der Strahlen ist ja gar nicht mein Problem. In diesen Bereichen habe ich eigentlich schon sehr viel Erfahrung sammeln können. Es geht nur darum, was ich letztendlich mit diesen Daten anstelle, um den Sichtbereich darzustellen. Wie bereits geschrieben, habe ich dies bisher so geregelt, dass ich den Sichtbereich direkt in ein Image eingezeichnet habe (indem ich andere Images mit entsprechend grossen Kreisformen an die Einheiten-Positionen zeichne). Ich könnte die Bereichne natürlich genauso gut berechnen (dann könnte man sogar noch die Sicht hinter Hindernissen ausblenden und andere lustige Details verwenden). Ich habe auch schon entsprechende Routinen geschrieben, die noch bei einer sehr grossen Anzahl von Einheiten gut laufen. Aber wie bringe ich diese Daten dann in eine sichtbare Darstellung, ohne das der grosse Geschwindigkeitsverlust an dieser Stelle alle Vorteile wieder zunichte macht? ![]() |
||
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Also um es noch einmal spezifischer zu formulieren:
Wie bekomme ich eine Bank mit 1024 x 1024 Einträgen auf eine entsprechende Bitmap übertragen und dies in Echtzeit mit minimalen Geschwindigkeitseinbussen. Das geht nicht, oder? keine Chance ... ? Es gibt da bei BB ja nix schnelleres, als direkt mit Images zu arbeiten ... ? (Ich brauche da momentan für 500 Einheiten per Loop ~ 0,06 Sek.) Andere Vorschläge ? ![]() |
||
![]() |
wunderkind |
![]() Antworten mit Zitat ![]() |
---|---|---|
Meiner Meinung nach musst du dich vom Gedanken der direkten Übertragung lösen und das Ganze abstrakter betrachten. Du weißt, wo sich die jeweilige Einheit befindet, welche Blickrichtung sie hat und wie groß ihr Sichtradius ist. Vielmehr musst du doch nicht wissen. Sicher noch, wo die anderen Einheiten sind und welchen Radius sie selbst haben.
Vielleicht habe ich dich auch falsch verstanden und es geht darum, was auf dem Bildschirm angezeigt wird?! |
||
![]() |
stfighter01 |
![]() Antworten mit Zitat ![]() |
---|---|---|
wenn dus genauso machst wie dus beschrieben hast dann glaub ich nicht das du ernsthafte perfoming prob. bekommst.
einfach ein pufferimage machen (grösse nach auflösung angepasst) und dunkelgrau löschen und an der stelle wo der raster auf sichtbar gesetzt ist nen schwarzen kreis reinzeichnen (um ne maske zu erhalten) du brauchst auch nur die stellen des rasters in dein pufferimage zeichenen die am schirm zu sehen sind. das werden ca. 50 kreise pro frame sein und sollte somit kein prob darstellen. was ist eigentlich genau das problem??? das clipping auf dein image hin? das zeichnen auf dein image mittels writepixelfast? mfg stfighter |
||
Denken hilft! |
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Ja, genau. Es geht eigentlich nur darum, was wie auf dem Bildschirm angezeigt wird.
Also, das Endergebnis der Sicht soll eine entsprechende Darstellung auf einer Textur mit der Grösse 1024 x 1024 (die dann anschliessend über die Karte geblendet wird). Ich würde also am liebsten zuerst sämtliche Sichtdaten sammeln und diese dann auf die Textur einzeichnen. Und da ich damals für meine bisherige Methode immer sehr verhohnt wurde, würde mich gern mal eine Alternative zum drawImage() interessieren! ![]() Die Methode funktioniert zwar sehr gut und ist von der Geschwindigkeit her auch "okay". Aber eine Optimierung wäre halt sehr schön. |
||
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Hehe, doch bei über 500 Einheiten bekomme ich leider Performingprobleme. Starcraft zb. läuft mit seinen hunderten von Einheiten immer noch genauso flüssig, wie mit nur wenigen Einheiten. Bei meiner Methode habe ich bei 1000 Einheiten halt nur noch wenige Frames (und das nur für die Sichtfelderstellung). ![]() [/edit] Ansonsten mache ich es in etwa genauso, wie Du beschrieben hast. Also sollte ich bei dieser Methode zu bleiben? (und versuchen, sie vielleicht noch ein klein wenig zu optimieren?) Ich fühl mich halt nur etwas verunsichert. Mir wurde damals immer gesagt, diese Methode wäre dumm. Und ich würd nun gern die beste Möglichkeit nutzen, die man dafür verwenden kann. |
||
- Zuletzt bearbeitet von Ava am So, Nov 14, 2004 0:01, insgesamt einmal bearbeitet
![]() |
stfighter01 |
![]() Antworten mit Zitat ![]() |
---|---|---|
hmm ich halte es theoretisch für möglich ne bank in ein image zu kopieren.
allerdings geht das dann nur über dlls. im englischen forum hat mal wer ne alphablending prozedur geschrieben. dazu hat er glaub ich die imagebuffer() werte an eine dll übergeben und dort manipuliert. würde vorschlagen das kannst du auch versuchen, schliesslich ist ein image nichts anderes als ne bank mit ein paar headereinträgen am anfang. |
||
Denken hilft! |
![]() |
stfighter01 |
![]() Antworten mit Zitat ![]() |
---|---|---|
wir reden da ein wenig aneinander vorbei vor lauter schnell schreiben *g*.
die performanceprob. können bei meiner lösung aber nur durch die strahlenberechnungen der vielen einheiten auftreten, das zeichnen auf den imagebuffer sollte mir nahezu konstanter geschw. laufen. |
||
Denken hilft! |
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Ja genau, darüber habe ich auch schon nachgedacht. Das wäre natürlich eine fantastische Möglichkeit, wenn man das so machen könnte! (bank in image übertragen / blöd halt, dass man auf die Image-Einträge nicht genauso schnell und flexibel zugreifen kann, wie auf andere Banks) | ||
- Zuletzt bearbeitet von Ava am So, Nov 14, 2004 0:03, insgesamt einmal bearbeitet
![]() |
eXceptION |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ava hat Folgendes geschrieben: Banks wären natürlich sehr naheliegend; der Zugriff ist selbstverständlich sehr viel schneller als auf eine Bitmapdatei.
das stimmt solange das bitmap auf platte (als datei) vorliegt... wenn es in memory geloadet ist, ist die zugriff ähnlich schnell wie banks... hätten wir nur die gelegenheit banks zu accessen ohne jedes mal den index neu auszurechnen bzw. an den function als parameter geben, wäre ich mit die aussage einverstanden... ![]() @mark sibly: ich will mit pointers arbeiten!!! ![]() EDIT: bitmaps sind natürlich nur ähnlich schnell wenn du readpixelfast/writepixelfast benutzt... |
||
Norweger...
Spreche aber verdammt gut 8086 |
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
stfighter01 hat Folgendes geschrieben: wir reden da ein wenig aneinander vorbei vor lauter schnell schreiben *g*.
die performanceprob. können bei meiner lösung aber nur durch die strahlenberechnungen der vielen einheiten auftreten, das zeichnen auf den imagebuffer sollte mir nahezu konstanter geschw. laufen. Bei meiner jetzigen Methode werden ja keine Strahlen berechnet; es wird direkt nur das Sichtfeld gezeichnet! Auf eine Strahlenberechnung würde ich nur umsteigen, wenn mir jemand eine schnelle Möglichkeit verrät, wie ich die Daten dann anschliessend auch in das Image bekomme! ![]() Vielleicht ist Dein Vorschlag mit der DLL eine solche Möglichkeit. Ich werde mir das mal anschauen, nur leider habe ich mit DLLs noch überhaupt gar keine Erfahrungen! ![]() |
||
![]() |
stfighter01 |
![]() Antworten mit Zitat ![]() |
---|---|---|
hab noch deinen beitrag von vorher gelesen, und ich glaube eigentlich NICHT das du es so machst wie ich es mit vorstelle.
ich denke du berechnest eine raster für den bildschirm. mir schwebt ein raster vor, der gross genug ist für die ganze weltkarte und stets aktuell gehalten wird. dein maskenimage wird stets neu gezeichnet, verwendet aber nur die rastereinträge welche wirklich wichtig für das maskenimage sind. das sind immer ca. gleich viele einträge und somit eine konstante framerate. mfg stfighter |
||
Denken hilft! |
![]() |
stfighter01 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@exeption bin nicht sicher ob der zugriff auf images so schnell ist wie auf banks.
die images werden meines wissens im grafikkartenspeicher gehalten, von wo aus das ein und auslesen elendiglich langsam funktioniert. (und danke an mark das wir uns an dieser stelle nicht mit pointer abquälen müssen ![]() mfg stfighter |
||
Denken hilft! |
![]() |
eXceptION |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich hab's probiert... ![]() |
||
Norweger...
Spreche aber verdammt gut 8086 |
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Irgendwie reden wir wirklich etwas aneinander vorbei, stfighter01.
Also im Prinzip verwende ich überhaupt kein extra Raster. Alles wird direkt in das Image eingezeichnet/ausgelesen. Dieses deckt die komplette Karte ab und wrd in jedem Loop komplett neu gezeichnet, aktualisiert. das ist auch insofern unumgänglich, da man es ja auch auf der Minikarte angezeigt bekommt. Naja, ich werde dann wohl bei dieser Methode bleiben. *viel Wind um nix* Sorry. ![]() Aber vielleicht kapier ich das mit den DLLs ja noch. Und wenn es dann wirklich sehr schnell funktioniert, werde ich mich damit mal ausführlich auseinandersetzen. ![]() |
||
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
EDIT: Sorry, muss ich mir nicht antun. | ||
- Zuletzt bearbeitet von D2006 am So, Nov 14, 2004 1:10, insgesamt einmal bearbeitet
MaGus |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Für die Minikarte reicht doch auch ne kleinere Auflösung, oder?
Dann könntest du von der 1024*1024-Textur nur den sichtbaren Bereich aktualisieren...für die minikarte reicht, denke ich, eine Auflösung von vielleicht 128*128...Diese zu aktualisieren dürfte vergleichsweise schnell gehn. Naja nur ein Vorschlag. |
||
![]() |
stfighter01 |
![]() Antworten mit Zitat ![]() |
---|---|---|
nun, ich würds trotzdem in ein extra raster speichern, weil du damit dein strahlensystem anwenden kannst, und nicht bloss einen kreis um deine einheiten siehts , sondern wirklich nur die dinge die sie aus ihrer sicht sehen können.
sieh dir mal das bgnb projekt an, die machen das glaub ich auch so. und für die minikarte zeichnest du ja nur ein paar pixel ein, das sollte auch nicht so performance fressend sein. und wenn du noch ein bissl sprit sparen willst, kann ich dir empfehlen alle änderungen (und nur die änderungen) in der minikarte zu aktualisieren. mfg stfighter |
||
Denken hilft! |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group