Seite 1 von 1

SpriteOutput(hSprite_bg)

Verfasst: 09.09.2008 05:33
von Toshy
Ich bin totaler Anfänger bei Grafiken und bin auf folgendes gestoßen:

Code: Alles auswählen

Debug SpriteOutput(hSprite_bg) 
Debug SpriteOutput(hSprite_bg) 
Debug SpriteOutput(hSprite_bg) 
Anzeige:
4359612
0
0
Noch hab ich keinen Code den ich hier funktionsfähig Posten kann, aber der Fehler geschieht ständig.
Mich hat immer gewundert warum der Debugger meckert das der "output" NULL ist obwohl die Debuganzeige vorher einen Wert anzeigt.
Warum setzt "spriteoutput()" dort irgend etwas auf NULL?

Toshy

[edit]

Code: Alles auswählen

InitSprite()
hwindow_map.l = OpenWindow(#PB_Any,0,0,410,310,"",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
hwindowScreen_map.l = OpenWindowedScreen(WindowID(hwindow_map),5,5,320,300,0,0,0)
hSprite_bg.l = CreateSprite(#PB_Any,320 ,300)
Debug "hSprite_bg = " + Str( hSprite_bg )
Debug SpriteOutput(hSprite_bg) 
Debug SpriteOutput(hSprite_bg) 
Debug SpriteOutput(hSprite_bg) 
Debug "hSprite_bg = " + Str( hSprite_bg )
Ausgabe:
hSprite_bg = 3944384
4345368
0
0
hSprite_bg = 3944384

Verfasst: 09.09.2008 08:29
von DarkDragon
Du kannst nur einmal ...Output() verwenden bis zum nächsten StopDrawing().

Verfasst: 09.09.2008 17:16
von Toshy
Das hab ich bemerkt, aber WARUM?
Das ist doch unlogisch und sieht eher nach einem Fehler aus. Außerdem steht davon NICHTS in der Hilfe.

Überall sonst wenn man eine "PBid" hat oder auch andere Funktionen oder apis mit denen man ein "Handle" erhält oder andere Dinge kann man selbstverständlich mit jeder Anfrage rausbekommen was "da drinn steht" bzw. das Ergebniss ist.

SpriteOutput gib hier nur die ID zu einem Sprite raus. Das Sprite besteht nach der Abrage noch und dann müßte normal auch Spriteoutput unbegrenzt funktionieren.
Das wäre ja als ob SpritID oder eines der anderen ....ID() Funktionen immer nur einmal Funktionieren würde.

Für mich sieht das bisher nach einem ungewollten Fehler aus /Bug aus.
Das Verhalten ist absolut unlogisch.

Und falls es doch gewollt wäre, so müßte so eine krasse Ausnahme UNBEDINGT in der Hilfe stehe.

Verfasst: 09.09.2008 17:21
von DarkDragon
Das ist gewollt, weil in dem Befehl SpriteOutput/ImageOutput bereits ein Speicherbereich bzw ein DeviceContext reserviert wird, den man mit StopDrawing wieder löscht. Das verhindert unnötige Speicherlecks.

Verfasst: 09.09.2008 19:15
von hardfalcon
Davon abgesehen ist das kein PB-"Bug", sondern ein Windows-"Bug"... :wink:

//EDIT: Hier unter Linux krieg ich übrigens keine Nullen raus, da krieg ich jedes Mal dasselbe Handle zurück von SpriteOutput(). Das liegt aber wie gesagt am Betriebssystem, nicht an PureBasic.

Verfasst: 26.09.2008 04:23
von Toshy
Kann ich kaum glauben.
Es hat ja nix mit Speicherleckt oder reservierten Speichern zu tun, wenn man nach einem Handle "fragt" so wie bei X anderen Funktionen. Wenn Windows einen Fehler macht, dann könnte man es testen wenn man die entsprechende WIndowsApi aufruft. Welche wäre das?

Aber gerade da es unter Linux KEINE NULLEN ausgibt, vermute ich das es doch ein BUG ist. Falls nicht, dann hätte Fred das wie an anderen Stellen in die Hilfe aufgenommen. Oder die Hilfe ist hier halt noch "fehlerhaft".

Also, gibt es dazu eine WindowsApi?

Gruß
Toshy

Verfasst: 26.09.2008 07:51
von DarkDragon
Das Problem hier ist PureBasic gibt mit "[...]Output()" einen Pointer auf diese Struktur zurück:

Code: Alles auswählen

  Structure DrawingInfoStruct
    Type.l    ; Type of the DC
    Window.l  ; Window associated to the DC (if any)
    DC.l      ; DC (Display Device Context)
    ReleaseProcedure.l ; Address to a procedure to release the DC when StopDrawing() is called
    PixelBuffer.l      ; Address of the memory pixel buffer (DirectX)
    Pitch.l            ; Bytes per line (DirectX)
    Width.l
    Height.l
    Depth.l
  EndStructure 
Dabei geht es unter Windows immer über DC und nicht über PixelBuffer (Unter Linux gibts kein DC, nur PixelBuffer). Nun will man Speicherlecks vermeiden, weil ReleaseDC() nur in StopDrawing aufgerufen wird.