Naja... Letztendlich ist es das doch auch (also generell)
T_T
Sie sind in Begriff, Armaworld | Die Arma - Community für den DACH Raum zu verlassen, um auf die folgende Adresse weitergeleitet zu werden:
Bitte beachten Sie, dass wir für den Inhalt der Zielseite nicht verantwortlich sind und unsere Datenschutzbestimmungen dort keine Anwendung finden.
Naja... Letztendlich ist es das doch auch (also generell)
T_T
Neue Version. Bewegung der Einheiten und rudimentäres caching hinzugefügt.
@commy2 Das musst du mir jz aber erklären... Was ist denn ein PFH sonst, bzw was sollte er sein?
mach ich dann mal:
PerFrameHandler
@Sarogahtyp das war dort nicht die Frage er weiß was PFH ausgeschreiben heißst
@Sarogahtyp das war dort nicht die Frage er weiß was PFH ausgeschreiben heißst
oki, ich hatte das "sonst" überlesen und auch nicht das ganze topic durchgeackert... war quasi ein Schnellschuss
Umbau von PFH auf execNextFrame und entfernen der großen count Schleifen um einzelne Frames nicht zu überlasten.
Allerdings friert mein game nach kurz nach der init ein. Hat jemand eine Idee woran das liegen könnte?
Gigantische Array's im "call" bearbeiten...
"CBA_fnc_execNextFrame" callt den Input.
Kleiner Tipp am Rande "enableSimulationGlobal" verwenden für Multiplayer.
Gigantische Array's im "call" bearbeiten...
"CBA_fnc_execNextFrame" callt den Input.
? Wieso im call bearbeiten? Ich dachte Arrays werden bei Referenz übergeben. Dabei muss es doch überhauptnicht verarbeitet werden.
? Wieso im call bearbeiten? Ich dachte Arrays werden bei Referenz übergeben. Dabei muss es doch überhauptnicht verarbeitet werden.
Referenz hin oder her darauf kommt es hier nicht an.
Deine "fn_nextFrameHandler" ist Leistungs fressend für einen call, da dein "_units" Array recht groß ist.
wieso kommt es darauf nicht an? es wird doch nur die addresse übergeben.
Auch der Select darf eigentlich nicht das problem sein.
Höchstens der Count.
Aber es wird sowieso nochmal geändert werden. Mit execNextFrame wird ja alles viel zu oft überprüft
Kannst die Version mal testen läuft sehr gut bei mir
So ein Blödsinn, der hier geschrieben wird. :facepalm:
http://pastebin.com/PTGn859h
das ist meine version. mit Tags, Ohne Spawn, und einen Zentralen PFH
So ein Blödsinn, der hier geschrieben wird. :facepalm:
Geht das etwas genauer?
http://pastebin.com/PTGn859h
das ist meine version. mit Tags, Ohne Spawn, und einen Zentralen PFH
Wieso Tagst du die Variablen doppelt?
Bei großen ki Mengen wäre dein Scipt mit 0,5 sec zu langsam.
Außerdem sind das mir viel zu viele globale Variablen.
Kannst die Version mal testen läuft sehr gut bei mir
Alles anzeigenCode
- /*
- //Configuration
- #define CivTown_Tag "civtown"
- #define CivTown_CacheDistance 2000
- #define CivTown_AiPerKm 250
- */
- if (!isServer) exitWith {};
- CivTown_Tag = "civtown";
- CivTown_CacheDistance = 2000;
- CivTown_AiPerKm = 250;
- fn_createRandomPosition = {
- params ["_marker"];
- (getMarkerPos _marker) params ["_markerPositionX","_markerPositionY","_markerPositionZ"];
- (getMarkerSize _marker) params ["_markerSizeX","_markerSizeY"];
- _createPosition = [(_markerPositionX-(_markerSizeX)+(random [0,_markerSizeX,_markerSizeX*2])),(_markerPositionY-(_markerSizeY)+(random [0,_markerSizeY,_markerSizeY*2])),0] findEmptyPosition [0,500];
- _createPosition
- };
- fn_moveRandomPos = {
- if((unitReady _this) && !(isFormationLeader _this)) then {
- _marker = _this getVariable[CivTown_Tag,""];
- if(!(_marker!="")) then {
- _this doMove( _marker call fn_createRandomPosition);
- };
- };
- };
- fn_cacheUnit = {
- _this enableSimulationGlobal false;
- _this hideObjectGlobal true;
- };
- fn_uncacheUnit = {
- _this enableSimulationGlobal true;
- _this hideObjectGlobal false;
- };
- fn_nextFrameHandler = {
- params ["_index","_units"];
- private _unit = _units select _index;
- if({(_x distance2D _unit) < CivTown_CacheDistance} count allPlayers > 0) then {
- _unit call fn_uncacheUnit;
- _unit call fn_moveRandomPos;
- } else {
- _unit call fn_cacheUnit;
- };
- _index = _index + 1;
- if(_index isEqualTo count _units) then {
- _index = 0;
- };
- [_index ,_units] spawn fn_nextFrameHandler;
- };
- _units = [];
- {
- if((_x select [0, (count CivTown_Tag)]) == CivTown_Tag) then {
- (getMarkerSize _x) params ["_markerSizeX","_markerSizeY"];
- _aiCount = round(((_markerSizeX*_markerSizeY)/250000)*CivTown_AiPerKm);
- _group = createGroup civilian;
- for "_i" from 1 to _aiCount do {
- _createPosition = _x call fn_createRandomPosition;
- if (!(_createPosition isEqualTo [])) then{
- _unit = _group createUnit ["C_man_1", _createPosition, [], 0, "NONE"];
- _unit forceWalk true;
- _unit setVariable [CivTown_Tag, _x];
- _units pushback _unit;
- };
- };
- };
- nil
- } count allMapMarkers;
- [0, _units] spawn fn_nextFrameHandler;
Werde es gleich mal testen. Gefällt mir noch am besten. Vor allem kommt es ohne CBA aus.
Das script von CreedCoder ist performance Killer. weil er immer und immer wieder neue threads erstellt und nicht mal pausen einlegt.
warum "so viele" globale variable. weil es die Performanteste varinate ist.
warum "Doppel tag" weil ich mein Tag vorhänge und da ich viele script habe ich dann das auch noch definiere und keine versehendliche doppel definition habe. weil man in SQF keine Namespaces hat.
das währe also ungefähr wie JK.CitiTown.Function. normale anwendung bei Module basierter entwicklung
Ich verstehe nicht, warum man kritisiert, dass man alle 0.5s durch ein Array iteriert, aber dann 60 mal pro Sekunde durch "allPlayers" mit "distance2D" durchläuft.
Ich bin mal ne Woche nicht da und der Thread eskaliert in ein Feuerwerk von Halbwahrheiten und Fehlinformationen.
Das script von CreedCoder ist performance Killer. weil er immer und immer wieder neue threads erstellt und nicht mal pausen einlegt.
Es wurden mit Absicht keine Sleep Befehle eingebaut, wegen dem Performance Text. Kann ja beliebig eingebaut werden.
Alles auf Seite 2 ist falsch. Ich würde Fabi empfehlen, sich eine Methode herauszusuchen und dann dabei zu bleiben. Egal ob nun while-Schleife, PFH oder was-weiß-ich (nur bitte keine rekursiven spawns, lol).