(Gast)
n/a Beiträge
|
AW: Beschleunigung von Laderoutine
17. Aug 2016, 20:06
Zitat:
Bei der von mir vorgeschlagenen Lösung würdest du jeweils maximal 25 Texturen behalten, aber müsstest trotzdem immer nur Eine neu laden.
Danke das tut meine Version auch.. Trotz allem Danke für dein Beispiel.
Beim Start werden all Texturen mit NoCoverTexturen befüllt.
Delphi-Quellcode:
// fill all Quads with NoCoverTexture
if FileExists(FullDataPath + 'images\Default\NoCover.JPG') then
begin
LoadTexture(FullDataPath + 'images\Default\NoCover.JPG', NoCoverTexture, False);
for q := 0 to QuadCount - 1 do
quadTexture[q] := NoCoverTexture;
end
else
NoCoverTexture := 0;
Anschließend wird die INI eingeladen.
Delphi-Quellcode:
procedure LoadINI;
var
I: Integer;
str: string;
tmpList: TStringList;
begin
tmpList := TStringList.Create;
try
With AlbumIni do
begin
aCovers.Clear;
CoverCount := StrToInt(ReadString('AlbumCover', 'Count', '0'));
if CoverCount > 0 then
begin
for I := 0 to CoverCount - 1 do
begin
str := ReadString('AlbumCover', 'Folder' + IntToStr(I), '');
if (Length(str) > 0) then
if FileExists(str) then
aCovers.Add(str)
else
tmpList.Add(str);
end;
end;
end;
finally
if tmpList.count > 0 then
begin
AlbumIni.EraseSection('AlbumCover');
for I := 0 to aCovers.count - 1 do
AlbumIni.WriteString('AlbumCover', 'Folder' + IntToStr(I), aCovers.strings[I]);
end;
tmpList.Free;
end;
AlbumIni.Free;
end;
In aCovers stehen jetzt alle 25 Pfade zu den Album Covers.
Jetzt werden all NoCoverTexturen mit den vorhandenen Covers gefüllt.
Delphi-Quellcode:
if (aFileName = 'FOLDER') or (aFileName = Name) then
begin
if quadTexture[I] = NoCoverTexture then
LoadTexture(aCovers[I], quadTexture[I], False);
// add to List
LstCoverPath.Add(aCovers[I]);
end;
Und hier wird jetzt nur noch 1 Cover geladen..
Delphi-Quellcode:
if (aCovers.count > QuadCount) then
begin
// delete first Cover
aCovers.Delete(0);
// move textures from destination to source
for I := 0 to (aCovers.count - 1) do
begin
quadTexture[I] := quadTexture[I + 1];
// add to List
LstCoverPath.Add(aCovers[I]);
// Load last Testure
if I = (QuadCount - 1) then
begin
// extract Filename
aFileName := ExtractFileName(aCovers[I]);
// extract extension
aFileName := Copy(aFileName, 1, Length(aFileName) - Length(ExtractFileExt(aFileName)));
// uppercase
aFileName := AnsiUpperCase(aFileName);
Name := ExtractFileName(GetAlbumArtistName);
if Name <> '' then
Name := Copy(Name, 1, Length(Name) - Length(ExtractFileExt(Name)));
if (aFileName = 'FOLDER') or (aFileName = Name) then
begin
if quadTexture[I] <> NoCoverTexture then
glDeleteTextures(1, @quadTexture[I]);
LoadTexture(aCovers[I], quadTexture[I], False);
end;
end;
end;
end
Der erste Eintrag in der Liste für die Pfade zu den Cover Bildern wird geöscht.
aCovers.Delete(0);
Hier werden die Texturen verschoben
quadTexture[I] := quadTexture[I + 1];
Jetzt wird die Liste zu den Cover Bildern aktualisiert
LstCoverPath.Add(aCovers[I]);
Wenn I das gleiche wie Maximaler Cover Count -1 dann wird die letzte Texture gelöscht
glDeleteTextures(1, @quadTexture[I]);
und nur noch einmalig für dieses Album geladen
LoadTexture(aCovers[I], quadTexture[I], False);
Das geht schnell ohne merklichen Performance Verlust.
Ich weiß das Rendern von dir ist nur ein Beispiel aber da steckt im Original einiges mehr an Funktionen drin
Delphi-Quellcode:
procedure RenderAlbum(aDeltaTime: single);
// Diese Funktion zeichnet die Quader. ColorScale skaliert dabei die Farbwerte der oberen beiden Ecken
procedure DrawQuads();
var
I: Integer; // index der for-schleife
QuadAngle: single; // die Rotation des aktuellen Quads
aPos: TGLVectord3; // die finale Position des aktuellen Quads [aPos = array[0..2] of single]
begin
glEnable(GL_TEXTURE_2D);
glInitNames;
glPushName(0);
// alle Quads durchgehen
for I := 0 to QuadCount - 1 do
begin
// Position initialisieren (aPos[0] = 0, aPos[1] = 0, aPos[2] = 10)
aPos := Vector_Make3f(0, 0, 12);
// Die Rotation des Quads (um den Mittelpunkt des Kreises, der durch die Quads gebildet wird)
// + ListAnge, also die Rotation, die mit der Maus gemacht wird
QuadAngle := DegToRad(360 / (QuadCount) * I) + ListAngle;
// Den Positionvektor um den Mittelpunkt des Kreises um die Y-Achse rotieren
aPos := Vector_Rotatef3(aPos, Vector_Make3f(0, 0, 0), QuadAngle, False, True, False);
glBindTexture(GL_TEXTURE_2D, quadTexture[I]);
if I = CurrentQuad then
begin
// Jetzt brauchen wir Blending
glEnable(GL_BLEND);
// nun die Blending-Funktion setzen
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glColor4f(1, 1, 1, 0.7);
// move to foreground
StayOnTop(aPos, 1.5);
// show only available cover
if not(quadTexture[I] = NoCoverTexture) then
begin
win.IMGTexture := quadTexture[I];
win.bRenderGUI := True;
end;
end
else
begin
// Original Farben setzen
glColor4f(1, 1, 1, 1);
// Blenden ausschalten
glDisable(GL_BLEND);
end;
if not(LastAddCover = Round(NoCoverTexture)) then
if LastAddCover = Trunc(quadTexture[I]) then
begin
glColor3f(1.0, 1.0, 1.0);
glDisable(GL_TEXTURE_2D);
// rahmen zeichnen
glLineWidth(1);
glBegin(GL_LINE_LOOP);
glVertex3f(aPos[0] - QuadSizeS, aPos[1] + QuadSizeS * 2, aPos[2]);
glVertex3f(aPos[0] - QuadSizeS, aPos[1], aPos[2]);
glVertex3f(aPos[0] + QuadSizeS, aPos[1], aPos[2]);
glVertex3f(aPos[0] + QuadSizeS, aPos[1] + QuadSizeS * 2, aPos[2]);
glEnd;
glEnable(GL_TEXTURE_2D);
// Quad zeichnen
glBegin(GL_QUADS);
glTexCoord2f(0, 1);
glVertex3f(aPos[0] - QuadSizeS, aPos[1] + QuadSizeS * 2, aPos[2]);
glTexCoord2f(0, 0);
glVertex3f(aPos[0] - QuadSizeS, aPos[1], aPos[2]);
glTexCoord2f(1, 0);
glVertex3f(aPos[0] + QuadSizeS, aPos[1], aPos[2]);
glTexCoord2f(1, 1);
glVertex3f(aPos[0] + QuadSizeS, aPos[1] + QuadSizeS * 2, aPos[2]);
glEnd();
end;
// Quad zeichnen
glBegin(GL_QUADS);
glTexCoord2f(0, 1);
glVertex3f(aPos[0] - QuadSize, aPos[1] + QuadSize * 2, aPos[2]);
glTexCoord2f(0, 0);
glVertex3f(aPos[0] - QuadSize, aPos[1], aPos[2]);
glTexCoord2f(1, 0);
glVertex3f(aPos[0] + QuadSize, aPos[1], aPos[2]);
glTexCoord2f(1, 1);
glVertex3f(aPos[0] + QuadSize, aPos[1] + QuadSize * 2, aPos[2]);
glEnd();
glLoadName(I + 1);
end;
glPopName;
end;
begin
glDepthMask(ByteBool(GL_TRUE));
// Kamera ausrichten, damit man was sieht
glTranslatef(0, -7, -30);
// Maus verarbeiten
if FMousePos.X > 0 then
begin
if FMousePos.X < 30 then
ListAngle := ListAngle - pi / 4 * aDeltaTime
else if FMousePos.X > _FNormal.Image1.Width - 30 then
ListAngle := ListAngle + pi / 4 * aDeltaTime;
end;
// Wichtig für die Spiegelung
glDisable(GL_CULL_FACE);
glEnable(GL_BLEND);
// Jetzt spiegel wir alles an der x-z-Ebene
glScalef(1, -1, 1);
// Jetzt zeichnen wir zuerst die Reflektionen der Quads
DrawQuads();
glDisable(GL_BLEND);
// Dann spiegel wir wieder zurück
glScalef(1, -1, 1);
// und zeichnen die eigentlichen Quads
DrawQuads();
// Jetzt brauchen wir Blending
glEnable(GL_BLEND);
// nun die Blending-Funktion setzen
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBegin(GL_QUADS);
glColor4f(0.0, 0.0, 0.0, 0.7);
glVertex3f(-15, 0, 15);
glVertex3f(-15, 0, -15);
glVertex3f(15, 0, -15);
glVertex3f(15, 0, 15);
glEnd();
glDisable(GL_BLEND);
glLoadIdentity;
end;
gruss
Geändert von EWeiss (17. Aug 2016 um 20:21 Uhr)
|