Gamestudio Links
Zorro Links
Newest Posts
loading historical data 1st time
by AndrewAMD. 04/14/23 12:54
Trade at bar open
by juanex. 04/13/23 19:43
Bug in Highpass2 filter
by rki. 04/13/23 09:54
Adding Limit Orders For IB
by scatters. 04/11/23 16:16
FisherN
by rki. 04/11/23 08:38
AUM Magazine
Latest Screens
SHADOW (2014)
DEAD TASTE
Tactics of World War I
Hecknex World
Who's Online Now
3 registered members (AndrewAMD, Grant, Neb), 908 guests, and 6 spiders.
Key: Admin, Global Mod, Mod
Newest Members
rki, FranzIII, indonesiae, The_Judge, storrealba
18919 Registered Users
Previous Thread
Next Thread
Print Thread
Rate Thread
Objekt-Darstellungssystem für große Außenlevels #114862
03/03/07 14:19
03/03/07 14:19
Joined: Jan 2007
Posts: 651
Germany
R
RedPhoenix Offline OP
User
RedPhoenix  Offline OP
User
R

Joined: Jan 2007
Posts: 651
Germany
Hallo ich wollte hier mal meine Steuerungsskript posten, dass ich zur Zeit benutze um große Außenbereiche in einigermaßen guter Geschwindigkeit darzustellen. Die Überlegung hierbei war, dass Entities auch wenn man sie unsichtbar macht und ihre Aktionen reduziert noch Performance verbrauchen. Das System löscht einfach alle weit entfernten Objekte komplett und vermerkt ihre Positionen in arrays. So kann man praktisch unbegrenzt viele Objekte in ein Level einbauen, sofern man diese Zeitversetzt erzeugt. Nach der Erzeugung werden die Objekte die weit entfernt sind wieder gelöscht und sobald sich der player nähert erneut erzeugt. Dieses System lässt sich sehr gut mit den Grasaktionen von Loopix (EasyGrass) kombienieren, dieses Beispiel benutzt die Aktionen:


////////////////////////////Gras-Skript//////////////////////////////
DEFINE m_model1,5000;
DEFINE m_model2,5001;
DEFINE m_model3,5002;
DEFINE m_model4,5003;
DEFINE m_model5,5004;
DEFINE m_model6,5005;
var grass_zae = 0;
var setz_zae = 0;
var g_temp;
var s_temp;
var grass_id_arr[100000];
var grass_x_arr[100000];
var grass_y_arr[100000];
var grass_z_arr[100000];
var grass_j_arr[100000];

var op_sichtweite = 1;
var op_aktuali = 1;

//Grasmodelle und Grasskript von Loopix
string model1 = "grass1.mdl";
string model2 = "grass1.mdl";
string model3 = "grass1.mdl";
string model4 = "grass2.mdl";
string model5 = "strawberry.mdl";
string model6 = "grass_flower.mdl";

material plants_mat
{
/////some color_ambient and albedo adjustment. set up your desired values
ambient_blue = 70;
ambient_green = 120;
ambient_red = 130;
albedo = 10;


/////this is to eliminate the well known tga-sorting problem. It also allows you to use single sided poly models
/////YOU DO NOT REALY NEED THIS EFFECT/SHADER PART IF YOU USE ONLY GRASS LIKE MODELS AND IF THEY HAVE DOUBLE SIDED POLYS
effect=
"
texture entSkin1;


technique vegetation
{
pass p0
{
Texture[0]=<entSkin1>;
ZWriteEnable=True;
AlphaBlendEnable=True;
AlphaTestEnable=True;
AlphaFunc=Greater;
CullMode=None; // none when sigle sided polys, or ccw when double sided polys

ColorArg1[0]=Texture;
ColorOp[0]=Modulate2X;
ColorArg2[0]=Diffuse;
}
}
";
}

DEFINE ENT_ID,SKILL42;
DEFINE _WISSEN,SKILL43;
// das ist die Hauptaktion sie sollte im Main gecalled sein oder als Starter
//definiert
FUNCTION grass_verwalter() {
WAITT (16); //Warte die Definition aller Grasobjekte ab
WAIT (1);
WHILE (1) {
WHILE (grass_zae < 99999) {
IF (grass_id_arr[grass_zae] > 0 && grass_j_arr[grass_zae] == 0 && a500_dasein == 1) {
g_temp.x = grass_x_arr[grass_zae];
g_temp.y = grass_y_arr[grass_zae];
g_temp.z = grass_z_arr[grass_zae];
s_temp = vec_dist(player.pos,g_temp);
IF (s_temp < 3000*op_sichtweite) {
IF (grass_id_arr[grass_zae] == m_model1) { YOU = ent_create (model1,g_temp,grass_norm); }
IF (grass_id_arr[grass_zae] == m_model2) { YOU = ent_create (model2,g_temp,grass_norm); }
IF (grass_id_arr[grass_zae] == m_model3) { YOU = ent_create (model3,g_temp,grass_norm); }
IF (grass_id_arr[grass_zae] == m_model4) { YOU = ent_create (model4,g_temp,grass_norm); }
IF (grass_id_arr[grass_zae] == m_model5) { YOU = ent_create (model5,g_temp,grass_norm); }
IF (grass_id_arr[grass_zae] == m_model6) { YOU = ent_create (model6,g_temp,grass_norm); }
grass_j_arr[grass_zae] = 1;
YOUR.ENT_ID = grass_id_arr[grass_zae];
YOUR._WISSEN = grass_zae;
}
}
grass_zae += 1;
IF (grass_zae % 10000*op_aktuali == 0) { wait (1); }
}
grass_zae = 0;
WAIT (1);
}
}


Function map_grass() {
my.material = plants_mat;
my.transparent=on;
my.passable = On;
MY.INVISIBLE = ON;
my.pan=random(360);//gives to each grass/plant model a random pan angle before setting
my.alpha=90;
MY.SKILL1 = YOUR.SKILL1;
MY.SKILL2 = YOUR.SKILL2;
MY.SKILL4 = YOUR.SKILL4;
MY.SKILL5 = YOUR.SKILL5;
MY.SKILL20 = YOU;
wait(1);
my.X += random(MY.skill1) - MY.SKILL4;
my.Y += random(MY.skill2) - MY.SKILL5;
my.skill21 = random (5) + 1;
wait (my.skill21);
vec_set (temp, my.pos);
temp.z -= 10000;
trace_mode = ignore_me + ignore_sprites + ignore_models + ignore_passable;
my.z -= trace (my.pos, temp) + 3; //making the grass/plants sink 3 quants into the soil
wait (1);
//Ergänzung zum Basisgrasskript
MY._WISSEN = setz_zae;
grass_id_arr[setz_zae] = MY.ENT_ID;
grass_x_arr[setz_zae] = MY.X;
grass_y_arr[setz_zae] = MY.Y;
grass_z_arr[setz_zae] = MY.Z;
grass_j_arr[setz_zae] = 1;
setz_zae += 1;
while (1)
{
IF (vec_dist(player.X,MY.X) > 2000*op_sichtweite && vec_dist(MY.X,player.X) < 2900*op_sichtweite) { MY.ALPHA = 90 - FRC(vec_dist(My.X,player.X)/1000)*100; }
ELSE { MY.alpha = 90; }
IF (vec_dist(MY.X,player.X) >= 2900*op_sichtweite) { MY.INVISIBLE = ON; }
ELSE { MY.INVISIBLE = OFF; }
IF (vec_dist(MY.X,player.X) >= 3000*op_sichtweite) { grass_j_arr[MY._WISSEN] = 0; REMOVE (ME); return; }
wait(1);
}
/////
}

FUNCTION grass_norm {
my.material = plants_mat;
my.transparent=on;
my.passable = On;
MY.INVISIBLE = ON;
my.pan=random(360);//gives to each grass/plant model a random pan angle before setting
my.alpha=90;
//Ergänzung zum Basisgrasskript
while (1)
{
IF (vec_dist(player.X,MY.X) > 2000*op_sichtweite && vec_dist(MY.X,player.X) < 2900*op_sichtweite) { MY.ALPHA = 90 - FRC(vec_dist(My.X,player.X)/1000)*100; }
ELSE { MY.alpha = 90; }
IF (vec_dist(MY.X,player.X) >= 2900*op_sichtweite) { MY.INVISIBLE = ON; }
ELSE { MY.INVISIBLE = OFF; }
IF (vec_dist(MY.X,player.X) >= 3000*op_sichtweite) { grass_j_arr[MY._WISSEN] = 0; REMOVE (ME); return; }
wait(1);
}
}

Das System kann man für alle Vegetationsobjekte oder leblosen Entities benutzen auch für Terrains (wenn man viele kleinere Terrains aneinanderlegt). Mit op_sichtweite kann man die allgemeine Sichtweite verstellen mit op_aktuali die Geschwindigkeit mit der die Welt aktualisiert wird. Natürlich verbraucht die Hauptaktion umso mehr performance, je größer die arrays sind und je größer op_aktuali ist. Bei mir hat das die Framerate um 5-10 erhöht, ich wüsste gerne, was ihr für Erfahrungen damit macht. Hoffe das es euch was bringt und wenn euch ideen einfallen wie man den Code auch noch auf lebende Objekte (die sich bewegen und ja auch noch weiter Bewegen müssten, wenn sie nicht mehr existieren) übertragen könnte, dann postet das doch hier.

Re: Objekt-Darstellungssystem für große Außenlevel [Re: RedPhoenix] #114863
03/03/07 15:59
03/03/07 15:59
Joined: Aug 2002
Posts: 375
Germany
Salva Offline
Senior Member
Salva  Offline
Senior Member

Joined: Aug 2002
Posts: 375
Germany
Hi Redphoenix!!
On this problem of entity are spoken much in the forum, many already like you has created some script like this, some works well, some to the half, I believe that the best system of manage the objects, it would be all that locate behind the player to erase it from the memory like you tell, and then when the player turns around toward these objects, this should appear again, this must be combined together with the objects that locate to a certain distance not more visible for the player that goes erased (temporarily) also from the memory.However thank you for this contribution!!

Salva


Moderated by  adoado, checkbutton, mk_1, Perro 

Gamestudio download | chip programmers | Zorro platform | shop | Data Protection Policy

oP group Germany GmbH | Birkenstr. 25-27 | 63549 Ronneburg / Germany | info (at) opgroup.de

Powered by UBB.threads™ PHP Forum Software 7.7.1