Skocz do zawartości
Taneno

[Problem] Nie jestem pewny czy będzie dobrze z optymalizacją

Rekomendowane odpowiedzi

Witaj.

Więc tak, moje pierwsze przemyślenia były takie aby wykonać to w ten sposób, ale zastanawiam się czy nie będzie to powodowało problemów.

a drugie brzmiały żeby gameid obiektu zapisać do zmiennej zamiast pętli i przy końcczeniu edycji poprostu go pobierać i resztę już wiemy.

Który sposób będzie bardziej optymalny? 

	public OnPlayerEditDynamicObject(playerid, objectid, response, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz)
{
  if(response == EDIT_RESPONSE_FINAL)
  {
    for(new i = 0; i < MAX_OBIEKT; i++)
    {
      if(objectid == Object[i][oGameid])
      {
        new query[256];
        Object[i][oPosX] = x;
        Object[i][oPosY] = y;
        Object[i][oPosZ] = z;
        Object[i][oRotX] = rx;
        Object[i][oRotY] = ry;
        Object[i][oRotZ] = rz;
	        SetDynamicObjectPos(Object[i][oGameid], Object[i][oPosX], Object[i][oPosY], Object[i][oPosZ]);  SetDynamicObjectRot(Object[i][oGameid], Object[i][oRotX], Object[i][oRotY], Object[i][oRotZ]);
	        format(query, sizeof(query), "UPDATE dev_objects SET ob_posx ='%f', ob_posy = '%f', ob_posz = '%f', ob_rotx = '%f', ob_roty = '%f', ob_rotz = '%f' WHERE ob_uid = '%d'", x, y, z, rx, ry, rz, Object[i][oUID]);
        mysql_query(query);
	      }
    }
  }
  return 1;
}
Edytowane przez Taneno

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Kod żywcem z mojego gamemodu myślę ze optymalniej sie nie da

//zmienne
enum    e_objData
{
	objDataSQLID,
	objDataUID, 
	Float:objDataX,
	Float:objDataY,
	Float:objDataZ,
	Float:objDataRX,
	Float:objDataRY,
	Float:objDataRZ
};

//Tworzenie obiektu ...
new objectid = CreateDynamicObject(..., x, y, z, ...);

new data[e_objData];
data[objDataSQLID] = mysql_insert_id();
data[objDataUID] = pInfo[playerid][player_U]; 
data[objDataX] = x;
data[objDataY] = y;
data[objDataZ] = z;
data[objDataRX] = 0.0;
data[objDataRY] = 0.0;
data[objDataRZ] = 0.0;

Streamer_SetArrayData(STREAMER_TYPE_OBJECT, objectid, E_STREAMER_EXTRA_ID, data);
	

//edycja	
stock U_OnPlayerEditDynamicObject(playerid, objectid, response, Float: x, Float: y, Float: z, Float: rx, Float: ry, Float: rz)
{
	switch(response)
	{
	    case EDIT_RESPONSE_CANCEL:
	    {
	        new data[e_objData];
	        Streamer_GetArrayData(STREAMER_TYPE_OBJECT, objectid, E_STREAMER_EXTRA_ID, data);
			
			if(data[objDataUID] != pInfo[playerid][player_U]) return 0;
			
	        SetDynamicObjectPos(objectid, data[objDataX], data[objDataY], data[objDataZ]);
	        SetDynamicObjectRot(objectid, data[objDataRX], data[objDataRY], data[objDataRZ]);
	    }
	    case EDIT_RESPONSE_FINAL:
		{
		    new data[e_objData];
		    Streamer_GetArrayData(STREAMER_TYPE_OBJECT, objectid, E_STREAMER_EXTRA_ID, data);
			
			if(data[objDataUID] != pInfo[playerid][player_U]) return 0;
			
		    data[objDataX] = x;
		    data[objDataY] = y;
		    data[objDataZ] = z;
            data[objDataRX] = rx;
            data[objDataRY] = ry;
            data[objDataRZ] = rz;
            SetDynamicObjectPos(objectid, data[objDataX], data[objDataY], data[objDataZ]);
	        SetDynamicObjectRot(objectid, data[objDataRX], data[objDataRY], data[objDataRZ]);
	        Streamer_SetArrayData(STREAMER_TYPE_OBJECT, objectid, E_STREAMER_EXTRA_ID, data);

		}
	}
	
	return 1;
}

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Po co zapisywać pozycję i rotację obiektu, skoro można to pobrać poprzez funkcje? Jeśli anulujemy edycję obiektu (EDIT_RESPONSE_CANCEL), to funkcje GetDynamictObjectPos/Rot zwrócą stare pozycje.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
18 godzin temu, Beata_Szydlo_2015 napisał:

Kod żywcem z mojego gamemodu myślę ze optymalniej sie nie da


// ...

//edycja	
stock U_OnPlayerEditDynamicObject(playerid, objectid, response, Float: x, Float: y, Float: z, Float: rx, Float: ry, Float: rz)
{
	switch(response)
	{
		case EDIT_RESPONSE_CANCEL:
		{
			new data[e_objData]; // <<
			// ...
		}
		case EDIT_RESPONSE_FINAL:
		{
			new data[e_objData]; // <<
			// ...
		}
	}

	return 1;
}

 

Zły nawyk.

20 godzin temu, Taneno napisał:

Który sposób będzie bardziej optymalny?

Optymalniej to możesz jedynie indeksować utworzoną tablicę obiektów po id streamer'a zamiast iterować.

if (objectid == Object[i][oGameid]) // << chodzi o to

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
2 minuty temu, PrzMas napisał:

Zły nawyk

Eee? że niby z  czym? 

 

3 minuty temu, PrzMas napisał:

Optymalniej to możesz jedynie indeksować utworzoną tablicę obiektów po id streamer'a zamiast iterować.


if (objectid == Object[i][oGameid]) // << chodzi o to

 

W tedy w zależności od ilości wszystkich obiektów musiałby mieć bardzo duża tablice. 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×