Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mo Jul 14, 2025 17:30

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Sa Jan 28, 2012 20:54 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Ich programmiere momentan eine grafikkartenbasierte Bildbearbeitungssoftware.
Damit diese flüssiger läuft möchte ich alle geladenen Texturen auf der Grafikkarte behalten.

Das Problem ist jetzt, das irgendwann der Grafikkartenspeicher voll ist.
Dann möchte ich automatisch die am längsten nicht mehr verwendete Texture löschen.

Bloß wie krieg ich raus wann der Grafikkartenspeicher voll ist?
Ich suche sowas wie: (OpenTK)
Code:
  1. GL.GetInteger(GetPName.FreeGraphicMemory);


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 29, 2012 11:58 
Offline
DGL Member
Benutzeravatar

Registriert: So Sep 26, 2010 12:54
Beiträge: 238
Wohnort: wieder in Berlin
Programmiersprache: Englisch
http://developer.download.nvidia.com/opengl/specs/GL_NVX_gpu_memory_info.txt

http://www.opengl.org/registry/specs/ATI/meminfo.txt


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 29, 2012 12:24 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Danke, sieht beides ganz vernümftig aus. :D
Werd mich bei Gelegenheit durchackern. (Englisch ... bäh!!! :wink: )


Zuletzt geändert von OpenglerF am Mo Sep 23, 2013 17:04, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 29, 2012 14:14 
Offline
DGL Member
Benutzeravatar

Registriert: So Sep 26, 2010 12:54
Beiträge: 238
Wohnort: wieder in Berlin
Programmiersprache: Englisch
ja naja das eine is wohl nur für nvidias :D das andere für amd karten :)

Übrigens, Englisch ist besser als VB.NET :P


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 29, 2012 15:13 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Die Extension von Nvidea gefällt mir bedeutend besser, als die von AMD.
Außerdem kann ich die andere gar nicht testen, da ich nur Rechner mit Nvidea Karten besitze.

Ich habe mir eine Wrapperklasse geschrieben, hier mal der Code:
Code:
  1. namespace OpenGLHelp
  2. {
  3.     public static class GraphicMemory
  4.     {
  5.         #region NVX
  6.         //http://developer.download.nvidia.com/opengl/specs/GL_NVX_gpu_memory_info.txt
  7.  
  8.         /// <summary>
  9.         /// dedicated video memory, total size (in kb) of the GPU memory
  10.         /// </summary>
  11.         public const GetPName GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX = (GetPName)0x9047;
  12.  
  13.         /// <summary>
  14.         /// total available memory, total size (in Kb) of the memory
  15.         /// available for allocations
  16.         /// </summary>
  17.         public const GetPName GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX = (GetPName)0x9048;
  18.  
  19.         /// <summary>
  20.         /// current available dedicated video memory (in kb),
  21.         /// currently unused GPU memory
  22.         /// </summary>
  23.         public const GetPName GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX = (GetPName)0x9049;
  24.  
  25.         /// <summary>
  26.         /// count of total evictions seen by system
  27.         /// </summary>
  28.         public const GetPName GPU_MEMORY_INFO_EVICTION_COUNT_NVX = (GetPName)0x904A;
  29.  
  30.         /// <summary>
  31.         /// size of total video memory evicted (in kb)
  32.         /// </summary>
  33.         public const GetPName GPU_MEMORY_INFO_EVICTED_MEMORY_NVX = (GetPName)0x904B;
  34.  
  35.         public static bool Support_GL_NVX_gpu_memory_info = GLC.Extensions.Contains("GL_NVX_gpu_memory_info");
  36.         #endregion
  37.         #region ATI
  38.         //http://www.opengl.org/registry/specs/ATI/meminfo.txt
  39.         public const GetPName VBO_FREE_MEMORY_ATI = (GetPName)0x87FB;
  40.         public const GetPName TEXTURE_FREE_MEMORY_ATI = (GetPName)0x87FC;
  41.         public const GetPName RENDERBUFFER_FREE_MEMORY_ATI = (GetPName)0x87FD;
  42.  
  43.         public static bool Support_ATI_meminfo = GLC.Extensions.Contains("ATI_meminfo");
  44.         #endregion
  45.         #region WGL_GPU_AMD
  46.         //http://www.opengl.org/registry/specs/AMD/wgl_gpu_association.txt
  47.         public const GetPName WGL_GPU_RAM_AMD = (GetPName)0x87FD;
  48.  
  49.         public static bool Support_WGL_AMD_gpu_association = GLC.Extensions.Contains("WGL_AMD_gpu_association");
  50.         #endregion
  51.  
  52.         private static int ThrowNS()
  53.         {
  54.             throw new NotSupportedException("Das System unterstützt nicht die benötigten Extensions (GL_NVX_gpu_memory_info oder ATI_meminfo und WGL_AMD_gpu_association). Die Anwendung ist instabil, da die Größe des verfügbaren Grafikspeichers nicht ermittelt werden kann.");
  55.         }
  56.         public static int GetFreeMemoryKB(MemoryUsage MemoryUsage)
  57.         {
  58.             int Return = 0;
  59.             if (Support_GL_NVX_gpu_memory_info)
  60.             {
  61.                 //GL.GetInteger(GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX, out Return);
  62.                 GL.GetInteger(GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX, out Return);
  63.             }
  64.             else if (Support_ATI_meminfo)
  65.             {
  66.                 switch (MemoryUsage)
  67.                 {
  68.                     case MemoryUsage.Texture:
  69.                         GL.GetInteger(TEXTURE_FREE_MEMORY_ATI, out Return);
  70.                         break;
  71.                     case MemoryUsage.Vertices:
  72.                         GL.GetInteger(VBO_FREE_MEMORY_ATI, out Return);
  73.                         break;
  74.                     case MemoryUsage.Renderbuffer:
  75.                         GL.GetInteger(RENDERBUFFER_FREE_MEMORY_ATI, out Return);
  76.                         break;
  77.                     default:
  78.                         throw new ArgumentException("MemoryUsage ist mit " + MemoryUsage.ToString() + " ungültig!");
  79.                 }
  80.                 //ToDo
  81.             }
  82.             else
  83.             {
  84.                 ThrowNS();
  85.             }
  86.             return Return;
  87.         }
  88.         public static int GetTotalMemoryKB(MemoryUsage MemoryUsage)
  89.         {
  90.             if (GetTotalMemoryKB_V.HasValue)
  91.             {
  92.                 return GetTotalMemoryKB_V.Value;
  93.             }
  94.             else
  95.             {
  96.                 return (GetTotalMemoryKB_V = GetTotalMemoryKB_P()).Value;
  97.             }
  98.         }
  99.         private static int? GetTotalMemoryKB_V = null;
  100.         private static int GetTotalMemoryKB_P()
  101.         {
  102.             int Return = 0;
  103.             if (Support_GL_NVX_gpu_memory_info)
  104.             {
  105.                 GL.GetInteger(GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX, out Return);
  106.             }
  107.             /*else if (Support_ATI_meminfo)
  108.             {
  109.                 //ToDo
  110.             }*/
  111.             else if (Support_WGL_AMD_gpu_association)
  112.             {
  113.                 GL.GetInteger(WGL_GPU_RAM_AMD, out Return);
  114.                 Return *= 1024;
  115.             }
  116.             else
  117.             {
  118.                 ThrowNS();
  119.             }
  120.             return Return;
  121.         }
  122.     }
  123.     public enum MemoryUsage
  124.     {
  125.         Texture = 0,
  126.         Vertices = 1,
  127.         Renderbuffer = 2
  128.     }
  129.     //Andere Datei
  130.     public static class GLC
  131.     {
  132.         public static readonly string Vendor = GL.GetString(StringName.Vendor);
  133.         public static readonly string ShadingLanguageVersionStr = GL.GetString(StringName.ShadingLanguageVersion);
  134.         public static readonly string Renderer = GL.GetString(StringName.Renderer);
  135.         public static readonly string[] ExtensionsArr = GL.GetString(StringName.Extensions).Split(' ');
  136.         public static readonly IList<string> Extensions = (IList<string>)ExtensionsArr;
  137.         public static readonly float Version = Single.Parse(GL.GetString(StringName.Version).Substring(0, 3), System.Globalization.CultureInfo.InvariantCulture);
  138.    }
  139. }


Auf meiner Nvidea Karte funktionierts.
Mich würd halt intressieren in wie weit das auch auf AMD läuft... :wink:

Zitat:
Übrigens, Englisch ist besser als VB.NET

Wenn du meinst... :(
Deshalb entwickle ich auch mit C#, wobei das fast komplett das selbe ist.
Nur zb. die Möglichkeit von Unsafecode hat mich vor einigen Jahren nach C# gezogen. Unterandern auch deshalb, um mich mit dem C(++) Syntax vertraut zu machen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 29, 2012 16:56 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Als die AMD API erschien, hatte einer der Entwickler geschrieben, dass diese Werte nur grobe Werte sind und nicht den exakten Verbrauch darstellen. Da das Betriebssystem und der Grafiktreiber selber noch Speicher belegen und dieser von der API nicht mit einberechnet werden kann.
Der Grafiktreiber muss Verwaltungsdaten für den Speichermanager, die Texturen, VBO und so weiter auch auf der Grafikkarte hinterlegen, welche unterschiedlich groß sein können und dann noch fragmentierung.
Wie groß die Abweichungen sind, wurde aber nich erwähnt. Ich schätze, dass es im KB bis maximal in den MB Bereich geht.
NV hatte eine API nachgezogen und natürlich das gleiche Problem.
Die API ist nicht dafür gedacht, anhand der Werte zu entscheiden, ob ein 500KB Objekt noch rein passt oder nicht.
Eher dafür, ob noch 100MB für meine Spieldaten verfügbar sind, bevor man überhaupt ins Spiel kann.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 29, 2012 17:42 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Momentan habe ich mehrere Stufen programmiert.
Zb.
Wird ein Objekt wird unabhänig von der Grafikkartenlast nach 15 Minuten nicht verwendung gelöscht.
Ist im Grafikspeicher weniger Platz als 64MB, werden auch Daten gelöscht, die nur 10Sekunden nicht benutzt wurden...

Ich hoffe es passt so. :)

Danach bau ich etwas änliches noch für den Hauptspeicher ein. (Daten werden dann wenn sie nicht mehr gebraucht werden, auf der Festplatte hinterlegt...)



Kann man eigentlich damit rechnen das jeder Computer diese Extensionen unterstützt? :?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 29, 2012 17:46 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
OpenglerF hat geschrieben:
Kann man eigentlich damit rechnen das jeder Computer diese Extensionen unterstützt? :?

Schau doch in die grandiose glCapsViewer Datenbank (und schick gleich Reporte für deine Grafikkarten ein!). Einfach oben die Extension eingeben und schauen, wieviele Treffer du so bekommst.

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 29, 2012 18:12 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Meint ihr das diese Werte gut sind?:
  1. GL_NVX_gpu_memory_info 62
  2. WGL_AMD_gpu_association 122
  3. GL_ATI_meminfo 156

Mich wundert das die Extension GL_ARB_Imaging nur 8 Treffer bekommt. :cry:
Im Wiki steht das ich die aber brauche, wenn ich GL.BlendEquation(*) verwenden will.
Wenn die wirklich so wenig verfügbar ist, muss ich mir irgendwie an den ganzen Stellen bei denen ich Min\Max BlendEquations verwende, mir was anderes überlegen. (Mit Shadern oder so...)

Nur mal so neben bei, der Extension Viewer zeigt mir zwar die Extensionen an, wirft aber beim Laden, Bedienen oder Beenden mit Exceptions um sich. zb. die Registerkarte "Rendering Tests" lässt sich überhaupt nicht öffnen.


Zuletzt geändert von OpenglerF am Mo Sep 23, 2013 17:07, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 29, 2012 18:38 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich sehe deutlich mehr als 8 Treffer für GL_ARB_imaging…

greetings :)

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 29, 2012 19:05 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Es macht durchaus Sinn, das laden/entladen über ein Scenegraph laufen zu lassen.

Am besten gefällt mir aktuell das System von Unity3D.
Bei der Variante wird alles, was in der aktuellen Szene liegt in den Speicher geladen und wenn ein Node raus fällt und der Referencecounter auf 0 fällt, dann wird eine Ressource entladen. Das entladen wird verzögert, zwecks Optimierung. Man kann auch einzelne Nodes aktivieren/deaktiveren und damit sorgen, dass es nicht in der Szene verarbeitet wird aber der Referenzcounter nicht auf 0 fällt.

Überwiegend will man die API für Profiling und sicher zu gehen, dass die Hardware deine App verkraftet.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 29, 2012 19:36 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Also ich weiß nicht wie du auf mehr als 8 kommst.
Ein Beweißbild ist angehängt.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jan 30, 2012 10:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Das ist lustig. Ich hab in der Suche danach gesucht und deutlich mehr ergebnisse bekommen. Das scheint auch korrekt zu sein. Mal Sascha deswegen anhauen.

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.011s | 15 Queries | GZIP : On ]