Registrierung Häufig gestellte Fragen Suche Mitgliederliste Portal - Planet Skyrim.de Kalender Moderatoren und Administratoren Startseite
Morrowind&OblivionForum.de - PMM-Projects Network » The Elder Scrolls IV: Oblivion » Oblivion Editor Help » Scriptperformance dezentralisierung kontra zentralisierung » Hallo Gast [registrieren|anmelden]
« Vorheriges Thema Nächstes Thema » Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Autor
Beitrag
madmaxx
Ehrenmitglied




Dabei seit: Januar 2003
Geschlecht:
Herkunft:
Beiträge: 3257

madmaxx ist offline
  Scriptperformance dezentralisierung kontra zentralisierungAntwort mit Zitat Beitrag editieren/löschen Nach weiteren Beiträge von  suchen Diesen Beitrag einem Moderator melden        IP Adresse Zum Anfang der Seite springen

Ich schreibe eine etwas aufwändigere Modifikation die einiges an Scripten fordert.
Die habe ich auch größtenteils schon fertig doch jetzt stellt sich mir eine Performancefrage.
Ist es besser möglichst viel in ein Script zu packen (weniger globale Variablen, weniger Scripte im speicher) oder es zu dezentralisieren wie es immoment ist (gibt schneller ein return). Dazu sollte man sagen, alle Scripte laufen die ganze Zeit, natürlich nicht völlig durch.
Insgesamt sind es immoment so um die 1000 Zeilen Code.

Immoment sieht das so aus:



Kursiv die globalen Variablen (alle short es sei denn es steht anders dabei).
Kommt noch einiges an Kram zu.

//EDIT//

Natürlich hier die Scripts (sorry für die Länge):

code:
ScriptName MadCityBudget

; this script edits the city's budget
; VERSION 1.0 ALPHA
; madmaxx
; last edit: 1/1/07
; licence: do whatever you want

short GoldBefore ; Variables for the msgbox at the end of the week.
short GoldAfter
short Costs
short Withdraws
short displayed

begin GameMode


if ( MadCityCityStatus <= 79 ) ; only if you have at least a mine
return
endif

if ( MadCityDone == 0 ) ; only once a week ;) see 'MadCityDayspassed'-Script

set GoldBefore to MadCityBudget

if ( MadCityCityStatus >= 80 ) ; mine
set MadCityBudget to MadCityBudget + MadCityMineWithdraw
endif

if ( MadCityCityStatus >= 200 ) ; Schmelze
set MadCityBudget to MadCityBudget + MadCityMeltingWithdraw
endif

if ( MadCityCityStatus >= 220 ) ; taxes
set MadCityBudget to MadCityBudget + MadCityTaxes
endif

if ( MadCityCityStatus >= 320 ) ; port
set MadCityBudget to MadCityBudget + MadCityPortWithdraw
endif


if ( MadCityBudget <= MadCityGuardCost + MadCityArcherCost + MadCityEliteGuardCost + MadCityPoliceCost + MadCityArmyCost + MadCityMineCost + MadCityMeltingCost ) ; to go shure that MadCityBudget don't become negative.
set MadCityGuardBudget to 0 ; Otherwise, the MadCityModifier1 - script would set it back
set MadCityChangedGuard to 1 ; so the MadCityModifier1 - script calculate all the modifiers
set MadCityArcher Budget to 0
set MadCityChangedArcher to 1
set MadCityEliteGuardBudget to 0
set MadCityChangedEliteGuard to 1
set MadCityPoliceBudget to 0
set MadCityChangedPolice to 1
set MadCityArmyBudget to 0
set MadCityChangedArmy to 1
set MadCityMineBudget to 0
set MadCityMeltingBudget to 0
set MadCityBudget to 0 ; sounds pretty hard, but thats life.
MessageBox "Eurer kleinen Ansiedlung ist das Geld ausgegangen, zumindest kann nicht der Sold all Eurer Männer bezahlt werden.. Eure Leute haben alles genommen, was noch in der Kasse war und ihre Arbeit niedergelegt, bis Ihr wieder bezahlen könnt oder es zumindest versprecht. Geht zu Eurem Buchhalter und regelt die Sache!", "Und das nach allem, was ich für sie getan habe.."
endif

if ( MadCityCityStatus >= 80 ) ; mine
set MadCityBudget to MadCityBudget - MadCityMineCost
endif

if ( MadCityCityStatus >= 120 ) ; manager
if ( MadCityBudget >= 100)
set MadCityBudget to MadCityBudget - 100
endif
endif

if ( MadCityCityStatus >= 200 ) ; Schmelze
set MadCityBudget to MadCityBudget - MadCityMeltingCost
endif

if ( MadCityCityStatus >= 110 ) ; guards
set MadCityBudget to MadCityBudget - MadCityGuardCost
endif

if ( MadCityCityStatus >= 140 ) ; archer
set MadCityBudget to MadCityBudget - MadCityArcherCost
endif

if ( MadCityCityStatus >= 170 ) ; eliteguards
set MadCityBudget to MadCityBudget - MadCityEliteGuardCost
endif

if ( MadCityCityStatus >= 240 ) ; police
set MadCityBudget to MadCityBudget - MadCityPoliceCost
endif

if ( MadCityCityStatus >= 290 ) ; army
set MadCityBudget to MadCityBudget - MadCityArmyCost
endif

set GoldAfter to MatCityBudget
set Costs to MadCityMineCost + MadCityMeltingCost + MadCityGuardCost + MadCityArcherCost + MadCityEliteGuardCost + MadCityPoliceCost + MadCityArmyCost + 100
set Withdraw to MadCityMineWithdraw + MadCityMeltingWithdraw + MadCityTaxes + MadCityPortWithdraw

set displayed to Withdraw - Costs

set MadCityDone to 1

if ( Costs > Withdraw )
MessageBox "Eine weitere Woche ist vergangen. Am Anfang dieser Woche hattet Ihr %.2f Gold in eurer Kasse. Nun habt ihr noch %.2f. Dies entspricht einem Verlust von %.2f .", GoldBefore, GoldAfter, displayed "Verdammt!"
endif

if ( Withdraw > Costs )
MessageBox "Eine weitere erfreuliche Woche ist vergangen! Anfangs hattet Ihr %.2f Gold in eurer Kasse, nun sind es schon %.2f. Das entspricht einem Gewinn von %.2f !", Gold Before, GoldAfter, displayed "Damit hab ich mir ein Bier verdient!"
endif

if ( Withdraw == Costs )
MessageBox "Eine weitere Woche ist vergangen, doch an dem Inhalt Eurer Schatztruhe hat sich nichts geändert. Nach wie vor sind %.2f Gold darin.", displayed "Nun gut.."

endif

end


#############


scn MadCityModifier1

; this script calculates the very basic modificators of the mod. this is the heart of everything! all scripts are working closely
; together in a pretty complex way. if you want to change something, you should proceed to another script unless you know what you
; are doing or BAD THINGS WILL HAPPEN!
; it calculates the overall modifiers for vandalism, assasination, riots and theft in percent. these are used in the other scripts
; to calculate if something will happen or not. also, the costs for army, guards, ... are calculated for the MadCityBudget script.
;
; VERSION 1.0 ALPHA
; madmaxx
; last edit 1/1/07
; license: do whatever you want

short MadCityGuardModifier ; negative theft modifier
short MadCityArcherModifier ; negative vandalism modifier
short MadCityEliteGuardModifier ; negative assasination modifier
short MadCityArmyModifierB ; negative vandalism mofifier
short MadCityArmyModifierR ; negative riot modifier
short MadCityArmyPoliceModifierB ; negative vandalism modifier
short MadCityArmyPoliceModifierT ; negative theft modifier
short MadCityArmyPoliceModifierR ; negative riot modifier
short MadCityArmyMadCityTaxModifierB ; vandalism modifer
short MadCityArmyMadCityTaxModifierT ; theft modifier
short MadCityArmyMadCityTaxModifierR ; riot modifier

begin GameMode


if ( MadCityChangedGuard == 0 && MadCityChangedArcher == 0 && MadCityChangedEliteguard == 0 && MadCityChangedArmy == 0 && MadCityChangedTax == 0 ) ; if nothing was changed..
return
endif


if ( MadCityChangedGuard == 1 ) ; if the guard budget was changed, calculate cost and modifier for the guards
if ( MadCityGuardBudget == 0 )
set MadCityGuardCost to 0
set MadCityGuardModifier to 0
endif
if ( MadCityGuardBudget == 10 )
set MadCityGuardCost to 50
set MadCityGuardModifier to 30
endif
if ( MadCityGuardBudget == 20 )
set MadCityGuardCost to 70
set MadCityGuardModifier to 60
endif
[usw - 246 Zeilen exakt wie die oben]
set MadCityChangedGuard to 0 ; everything ok now.
endif

; set all the modificators for the other scripts

set MadCityTheftMod to MadCityTaxModifierT + MadCityPortModT - MadCityPoliceModifierT - MadCityGuardModifier
set MadCityBeschMod to MadCityTaxModifierB + MadCityPortModB - MadCityPoliceModifierB - MadCityArcherModifier -MadCityArmyModifierB
set MadCityRiotMod to MadCityTaxModifierR - MadCityArmyModifierR - MadCityPoliceModifierR
set MadCityAttackMod to MadCityEliteGuardModifier

end


#################


****scn MadCityAttackScript ; * heißt WIP

; this script calculates if assasins attack you because you have used your people for swordtraining.
;
; VERSION 1.0 ALPHA
; madmaxx
; last edit 1/1/07
; license: do whatever you want

short attackchance
short myday

begin GameMode

if ( MadCityDaysPassed == myday )
return
endif

if ( MadCityDaysPassed =! myday )
set myday to MadCityDaysPassed
endif

if ( IsPCSleeping == 1 )
if ( GetRandomPercent >= 90 ) ; this is a balancing value. Bigger means it is more unlikely that you will be attacked.

if ( MadCityAttackMod >= GetRandomPercent - 10 ) ; this is to determine if your guards will be killed.
set MadCityEGuardsDead to 1 ; there's a script on the guards themself
endif

player.PlaceAtMe Assasin 1 256 1
player.PlaceAtMe Assasin 1 250 1
player.PlaceAtMe Assasin 1 260 1

WakeUpPC

if ( Assasin.GetDead == 1 )
if ( MadCityEguardsDead == 1 )
Messagebox "Es waren einfach zu wenig Wachen als das sie etwas hätten unternehmen können. Sie wurden alle getötet, bevor ihr wach wurdet." "OK"
else
Messagebox "Wer Euch diese Meuchelmörder auf den Hals gehetzt hat wird wohl auf ewig im Dunkeln bleiben, zum Glück wurden eure Leibwächter nicht im Schlaf überrascht." "OK"
endif
endif
endif
endif
end


############


ScriptName MadCityDayspassed

; this script is a global counter - counts till 6 (a week)
; VERSION 1.0 ALPHA
; madmaxx
; last edit: 1/1/07
; licence: do whatever you want

begin GameMode

short myday

if ( MadCityDayspassed == 0 )
set myday to day
endif

if ( myday != day )
set MadCityDayspassed to MadCityDayspassed + 1
set myday to day
endif

if ( MadCityDayspassed >=6 )
set MadCityDayspassed to 0
set MadCityDone to 0 ; after that, MadCityMine, MadCityMelting, MadCityPort and MadCityBudget will start to work
endif
end


##########


scn MadCityPort

; this script calculate the withdraw from the port
;
; VERSION 1.0 ALPHA
; madmaxx
; last edit 1/1/07
; license: do whatever you want


begin GameMode


if ( MadCityCityStatus <= 319 ) ; only if it exists
return
endif

if ( MadCityDone == 0 ) ; only once a week ;) check the 'MadCityDayspassed' and the 'MadCityBudget' scripts

set MadCityPortModT to 30
set MadCityPortModB to 20


set MadCityPortWithdraw to GetRandomPercent+GetRandomPercentcent*25
if ( MadCityPortWithdraw <= 850 )
set MadCityPortWithdraw to MadCityPortWithdraw + 850
endif
endif
end


#############


ScriptName MadCityMineBudget

; this script calculates the mine withdraw and mine cost
; (MadCityMineWithdraw ; MadCityMineCost)
; VERSION 1.0 ALPHA
; madmaxx
; last edit 1/1/07
; license: do whatever you want

begin GameMode

; MineBudget 0: no work

; MineBudget 10-40: normal mine

; MineBudget 50-80: manager

; MineBudget 90-120: big mine

if ( MadCityCityStatus <= 79 ) ; only if there IS a mine actually
return
endif

if ( MadCityDone == 0 ) ; only once a week ;) check the 'MadCityDayspassed' and the 'MadCityBudget' scripts

if ( MadCityMineBudget == 0 )
set MadCityMineCost to 0
set MadCityMineWithdraw to 0
return
endif

if ( MadCityMineBudget == 10 )
set MadCityMineCost to 100
set MadCityMineWithdraw to GetRandomPercent+GetRandomPercent+GetRandomPercent ; wird noch geändert auf GetRandomPercent*x
if ( MadCityMineWithdraw <= 79 ) ; the smallest withdraw of the mine at this point is 80 gold
set MadCityMineWithdraw to MadCityMineWithdraw + 80
endif
return
endif

[usw 100 Zeilen entfernt]
return
endif
endif
endif
end

#########

Schmelzenbudget wie oben

#########


scn MadCityTheftScript

; this script calculates if thieves get in your house and ruin your plan of getting rich.
;
; VERSION 2.0 ALPHA
; madmaxx
; last edit 1/1/07
; license: do whatever you want

short TheftMod
short myday
short difference
short randomstolen

begin GameMode

if ( MadCityDaysPassed == myday )
return
endif

if ( MadCityDaysPassed =! myday )
set myday to MadCityDaysPassed
endif

; yes, it will happen once every single day, but the chances are only about 5%
set TheftMod to MadCityTheftMod
set TheftMod to TheftMod + 67 ; this is a balancing constant, because MadCityTheftMod is always a negativ number, bigger means bigger chance of theft.

if ( MadCityDaysPassed == randomday )
if ( GetRandomPercent <= TheftMod ) ; if TRUE, the thieves will get in.
set randomstolen to GetRandomPercent - 20
set difference to MadCityBudget
set MadCityBudget to MadCityBudget / 100 * randomstolen ; so randomstolen percent are.. stolen.
set difference to difference - MadCityBudget
Messagebox "Eure Wachen haben versagt! Bei euch wurde eingebrochen! Es wurden Gegenstände im Wert von %.2f entwendet..", difference "Diese verdammten..."
endif
endif

end


__________________

"Die Flamme unsrer Väter wird nie erlöschen
sie lodert in uns auf Ewigkeiten
die Zeit steht kurz still, wir erinnern uns
mit stolzem Gefühl."

Das aktuelle TESCSKompendium & einiges mehr findet ihr hier

01.01.2007, 20:18 Profil von Füge  deiner Freunde-Liste hinzu Email an madmaxx senden Homepage von madmaxx Füge madmaxx in deine Contact-Liste ein
Xartas
Erzmagister
Verwarnung: 1




Dabei seit: Oktober 2005
Geschlecht:
Herkunft: ...
Beiträge: 1362

Xartas ist offline
  Antwort mit Zitat Beitrag editieren/löschen Nach weiteren Beiträge von  suchen Diesen Beitrag einem Moderator melden        IP Adresse Zum Anfang der Seite springen

Ich kann es mir nicht verkneifen:

Das ist ein Mod, mit dem man eine Stadt verwalten kann, oder?

/edit
Omg. da schreibt man etwas, und plötzlich sind da viele zeilen code...


__________________


Wählt der Schreitende den Pfad,
oder der Pfad den Schreitenden?
Garth Nix, Sabriel

01.01.2007, 20:27 Profil von Füge  deiner Freunde-Liste hinzu Email an Xartas senden Homepage von Xartas Füge Xartas in deine Contact-Liste ein
madmaxx
Ehrenmitglied




Dabei seit: Januar 2003
Geschlecht:
Herkunft:
Beiträge: 3257

madmaxx ist offline
  Antwort mit Zitat Beitrag editieren/löschen Nach weiteren Beiträge von  suchen Diesen Beitrag einem Moderator melden        IP Adresse Zum Anfang der Seite springen

Vielleicht.


__________________

"Die Flamme unsrer Väter wird nie erlöschen
sie lodert in uns auf Ewigkeiten
die Zeit steht kurz still, wir erinnern uns
mit stolzem Gefühl."

Das aktuelle TESCSKompendium & einiges mehr findet ihr hier

01.01.2007, 20:39 Profil von Füge  deiner Freunde-Liste hinzu Email an madmaxx senden Homepage von madmaxx Füge madmaxx in deine Contact-Liste ein
Van Helsing
a.k.a. R.I.O.T.




Dabei seit: Juli 2004
Geschlecht:
Herkunft: Österreich/Steiermark
Beiträge: 6640

Van Helsing ist offline
  Antwort mit Zitat Beitrag editieren/löschen Nach weiteren Beiträge von  suchen Diesen Beitrag einem Moderator melden        IP Adresse Zum Anfang der Seite springen

Performence-Technisch würde ich eher zu einem großen Script raten. Kommt dann halt auch auf die Art des Scripts an bzw. was es macht ob ein schnellerer Return erforderlich ist. Das musst du selbst wissen.
Im Endeffekt denke ich, ist es egal wie du es machst....

btw. nice dass du noch "lebst" madmaxx. Bin begeistert dass du wirklich noch an der Mod arbeitest die du vor langer Zeit mal so nebenbei "angekündigt" hast! Freu mich drauf.


__________________
Wenn man im Wort "Mama" nur 4 Buchstaben austauscht kommt "Bier" heraus........ erstaunlich!

01.01.2007, 21:27 Profil von Füge  deiner Freunde-Liste hinzu
madmaxx
Ehrenmitglied




Dabei seit: Januar 2003
Geschlecht:
Herkunft:
Beiträge: 3257

madmaxx ist offline
  Antwort mit Zitat Beitrag editieren/löschen Nach weiteren Beiträge von  suchen Diesen Beitrag einem Moderator melden        IP Adresse Zum Anfang der Seite springen

Wahrscheinlich werde ich wieder völlig gefrustet aufhören und es bei dem nächsten TES wieder auspacken. Aber dann hab ich schon ein bisschen mehr.


__________________

"Die Flamme unsrer Väter wird nie erlöschen
sie lodert in uns auf Ewigkeiten
die Zeit steht kurz still, wir erinnern uns
mit stolzem Gefühl."

Das aktuelle TESCSKompendium & einiges mehr findet ihr hier

01.01.2007, 21:31 Profil von Füge  deiner Freunde-Liste hinzu Email an madmaxx senden Homepage von madmaxx Füge madmaxx in deine Contact-Liste ein
Van Helsing
a.k.a. R.I.O.T.




Dabei seit: Juli 2004
Geschlecht:
Herkunft: Österreich/Steiermark
Beiträge: 6640

Van Helsing ist offline
  Antwort mit Zitat Beitrag editieren/löschen Nach weiteren Beiträge von  suchen Diesen Beitrag einem Moderator melden        IP Adresse Zum Anfang der Seite springen

Zieh dein Ding durch. Was ich da so aus den Scripten herausfischen kann hört sich schon mal interessant an und macht Lust auf die Mod....


__________________
Wenn man im Wort "Mama" nur 4 Buchstaben austauscht kommt "Bier" heraus........ erstaunlich!

01.01.2007, 21:39 Profil von Füge  deiner Freunde-Liste hinzu
Garak
Admin




Dabei seit: Juli 2002
Geschlecht:
Herkunft: Cardassia Prime
Beiträge: 9256

Garak ist offline
  Antwort mit Zitat Beitrag editieren/löschen Nach weiteren Beiträge von  suchen Diesen Beitrag einem Moderator melden        IP Adresse Zum Anfang der Seite springen

Ich bezweifle, dass das in der Performance irgend wie mess- oder Merkbar ist, da Du keine rechenintensiven Funktionen für die Vergleiche verwendest - detected oder LOS-Kram wäre viel schlimmer.

Entscheide lieber nach Übersichtlichkeit - und achte auf die Gefahr durch Race-Conditions, da man die Reihenfolge der scritpabarbeitung nicht vorhersehen kann - will sagen, pass auf, dass nicht mehrere routinen gleichzeitig versuchen, die selbe Variable zu ändern.


__________________
drei mal dürft ihr raten, wer grade seine Signatur geschrottet hat...geht aber wieder - allerdings solltet Ihr noch die Finger von den Avataren lassen

02.01.2007, 00:28 Profil von Füge  deiner Freunde-Liste hinzu Email an Garak senden Homepage von Garak Füge Garak in deine Contact-Liste ein
madmaxx
Ehrenmitglied




Dabei seit: Januar 2003
Geschlecht:
Herkunft:
Beiträge: 3257

madmaxx ist offline
  Antwort mit Zitat Beitrag editieren/löschen Nach weiteren Beiträge von  suchen Diesen Beitrag einem Moderator melden        IP Adresse Zum Anfang der Seite springen

Zitat:
Original von Garak
[...]
will sagen, pass auf, dass nicht mehrere routinen gleichzeitig versuchen, die selbe Variable zu ändern.



Das wirds wahrscheinlich sein. Ich pack einfach alles was mit Budget zu tun hat in ein Script und alles was täglich durchläuft ebenfalls, dann habe ich das Problem nicht - hoffe ich.


__________________

"Die Flamme unsrer Väter wird nie erlöschen
sie lodert in uns auf Ewigkeiten
die Zeit steht kurz still, wir erinnern uns
mit stolzem Gefühl."

Das aktuelle TESCSKompendium & einiges mehr findet ihr hier

02.01.2007, 16:20 Profil von Füge  deiner Freunde-Liste hinzu Email an madmaxx senden Homepage von madmaxx Füge madmaxx in deine Contact-Liste ein
  « Vorheriges Thema Nächstes Thema »
Neues Thema erstellen Antwort erstellen
Gehe zu:

Design by: Garak - Powered by: Burning Board 1.1.1 © 2001 WoltLab GbR