header YouTube
Clonk Livestream auf Twitch.tv!

Clonkspot

SetObjDrawTransform-Performanz

#1

Ich habe mal einen soliden schwarzen Block Maße 10001000 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 © und zu Erreichenden ® 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?

0 Likes

#2

Ich denke, dass die Änderung der SolidMask den Lag verursacht.

0 Likes

#3

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?

0 Likes

#4

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.

0 Likes

#5

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.

0 Likes