Not logged inClonkspot Forum
Forum Home Help Search Register Login
Up Topic Deutsch / Hilfestellung / SetObjDrawTransform-Performanz
- - By TLK (More than 200 posts.) Date 08.06.2017 16:23
Ich habe mal einen soliden schwarzen Block Maße 1000*1000 gemacht der sich mit einer Funktion Resize() auf eine Größe anpassen lässt. Mit GrowToSize wächst er graduell auf die gewünschte Größe. Auf meinem Rechner läuft das ganze ziemlich gut und macht keine Probleme, allerdings hat das ganze in einem Netzwerktest zu extremen Lags geführt. Hier der Code

func Resize(iX,iY,iWidth,iHeight){
  //Mittelpunkt bestimmen;
  var iXMid = (iX+iX+iWidth)/2;
  var iYMid = (iY+iY+iHeight)/2;
  //Abweichung vom Mittelpunkt
  var gX = GetX()-iXMid;
  var gY = GetY()-iYMid;
  //SetPosition(iXMid,iYMid);
  SetObjDrawTransform(iWidth,,-gX*1000,,iHeight,-gY*1000);
  SetSolidMask(,,iWidth,iHeight,iX,iY);

  //Lokale Variablen im Objekt für den Effekt
  iCX = iX;
  iCY = iY;
  iCWidth = iWidth;
  iCHeight = iHeight;
}

func GrowToSize(iX,iY,iWidth,iHeight){
  AddEffect("GrowToSize",this(),20,1,this(),,iX,iY,iWidth,iHeight);
}

func FxGrowToSizeStart(pTarget,iEffectNumber,iTemp,iX,iY,iWidth,iHeight){
  EffectVar(0,pTarget,iEffectNumber) = iX;
  EffectVar(1,pTarget,iEffectNumber) = iY;
  EffectVar(2,pTarget,iEffectNumber) = iWidth;
  EffectVar(3,pTarget,iEffectNumber) = iHeight;
}

func FxGrowToSizeTimer(pTarget,iEffectNumber){
  var iXR = EffectVar(0,pTarget,iEffectNumber);
  var iYR = EffectVar(1,pTarget,iEffectNumber);
  var iWidthR = EffectVar(2,pTarget,iEffectNumber);
  var iHeightR = EffectVar(3,pTarget,iEffectNumber);

  var iX = iCX;
  var iY = iCY;
  var iWidth = iCWidth;
  var iHeight = iCHeight;
  //Die zu setzenden Werte aus den Momentanen (C) und zu Erreichenden (R) errechnen
  if(iCX > iXR) iX = iCX-1;
  if(iCY > iYR) iY = iCY-1;
  if(iCWidth < iWidthR) iWidth = iCWidth+2;
  if(iCHeight < iHeightR) iHeight = iCHeight+2;

  //Log("iXR: %d iYR: %d iWidthR: %d iHeightR: %d",iXR,iYR,iWidthR,iHeightR);
  //Log("iCX: %d iCY: %d iCWidth: %d iCHeight: %d",iCX,iCY,iCWidth,iCHeight);
  //Log("iX: %d iY: %d iWidth: %d iHeight: %d",iX,iY,iWidth,iHeight);
  Resize(iX,iY,iWidth,iHeight);
  for(var pClonk in FindObjects(Find_Func("IsClonk"),Find_OCF(OCF_Alive),Find_InRect(AbsX(iX),AbsY(iY),iWidth,iHeight)))
    SetPosition(GetX(pClonk),iY-10,pClonk);

  if( (iCX == iXR) && (iCY == iYR) && (iCWidth == iWidthR) && (iCHeight == iHeightR) ){
    GameCall("DoneResizing");
    //Schedule("RemoveObject(this())",1,,this());
    return -1;
  }
}


Fällt jemandem Spontan ein was man da machen kann? Oder einen anderen Ansatz einen Block zu machen der SolidMask hat und Wachsen kann?
Parent - - By Marky (More than 200 posts.) Date 08.06.2017 16:32
Ich denke, dass die Änderung der SolidMask den Lag verursacht.
Parent - - By TLK (More than 200 posts.) Date 08.06.2017 16:44
Hmmmm, das kann natürlich auch sein. Dann müsste ich nur den Effekt so anpassen das die Clonks weggeflingt werden statt sie einfach auf den Block zu setzen. Ist SolidMask bekannt dafür das es unperformant ist?
Parent - By Marky (More than 200 posts.) Date 08.06.2017 17:09
Es verändert sozusagen die Landschaft, das ist normalerweise unperformant. Je nachdem wie lange das Anwachsen dauert, könnte es auch sinnvoll sein einfach die Objekte jeden Frame an die Stelle zu setzen, wo sie sein müssten wenn der Block seine SolidMask jedesmal ändern würde, und erst am Ende die SolidMask tatsächlich auf den neuen Wert zu setzen.
Parent - By Fulgen (More than 500 posts.) Date 08.06.2017 17:27
Um ein Beispiel aus dem SGGP - Pack zu nennen: Im Betarelease 9 hat ein Objekt jeden Frame seine SolidMask gesetzt, was dazuführte, dass die Framerate pro Objekt um 2-3 FPS sank.
Up Topic Deutsch / Hilfestellung / SetObjDrawTransform-Performanz

Powered by mwForum 2.29.7 © 1999-2015 Markus Wichitill