Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Przeliczanie przed draw'em


xenex

Rekomendowane odpowiedzi

Opublikowano

Napisałem sobie widget do obserwacji poziomu ramu w komputerze. Wszystko działałoby pięknie, gdyby nie mruganie zielonych pasków wskazujących poziom ramu:

 

1344688202-U67561.png

 

Na każdym screenie widać dobrze zarysowany poziom (aktualnie 56%), lecz na ekranie prawa część obrazka mruga :/

chciałbym aby pierw skrypt przeliczył CO ma narysować, a dopiero potem wysłał to jako JEDEN obraz.

jakaś pomoc?

Oddajcie minusy! :(

Opublikowano

Najpierw narysuj sobie obrazek w GDI funkcjami _GDIPlus_Graphics..., potem wyświetl.

Twoja stara robi catch the clowny w Game Makerze.

Opublikowano

Dokładnie o to mi chodzi! O te wyświetl...

Bo całą resztę mam już dawno zrobioną...

 

For $i = 0 to 101
If not $i = 0 then $x[$i-1] = $x[$i]
If $memory >= $i Then
_GDIPlus_GraphicsDrawLine($hGraphic,$i,100,$i,100-$x[$i],$hPen)
EndIf
Next

 

Myślałem jeszcze nad jedną opcją - aby wyłapywało najniższy wskaźnik - robiło prostokąt aż do tej wartości - a nadwyżki wypełniało w liniach...

 

Dopiero zaczynam się bawić _GDIPLUS, gdyż nigdy nie było mi potrzebne...

Oddajcie minusy! :(

Opublikowano

Zrób podwójne buforowanie..

 

#Edit

#include <GUIConstants.au3>
#include <GDIplus.au3>

Global Const $width = 600
Global Const $height = 400
Global $title = "GDI+"

; Build your GUI here
Opt("GUIOnEventMode", 1)
$hwnd = GUICreate($title, $width, $height)
GUISetOnEvent($GUI_EVENT_CLOSE, "close")
GUISetState()

; Load your GDI+ resources here:
_GDIPlus_Startup()
$graphics = _GDIPlus_GraphicsCreateFromHWND($hwnd)
$bitmap = _GDIPlus_BitmapCreateFromGraphics($width, $height, $graphics)
$backbuffer = _GDIPlus_ImageGetGraphicsContext($bitmap)


While 1
   _GDIPlus_GraphicsClear($backbuffer)

   ; wrzucasz do backbuffer'a wszystko...
For $i = 0 to 101
       If not $i = 0 then $x[$i-1] = $x[$i]
       If $memory >= $i Then
       _GDIPlus_GraphicsDrawLine($backbuffer,$i,100,$i,100-$x[$i],$hPen)
       EndIf
Next

   _GDIPlus_GraphicsDrawImageRect($graphics, $bitmap, 0, 0, $width, $height)
   Sleep(10)
WEnd

Func close()
   _GDIPlus_GraphicsDispose($backbuffer)
   _GDIPlus_BitmapDispose($bitmap)
   _GDIPlus_GraphicsDispose($graphics)
   _GDIPlus_Shutdown()
   Exit
EndFunc ;==>close

Opublikowano

Cóż, o to mi chyba chodziło..tylko w jakikolwiek sposób bym tego nie łączył - nic mi się nie pokazuje xD (tzn samo tło i czasem mrugnie 1 z paseczków)

Ale dziękuję za pomoc, doceniam i się pobawię

Oddajcie minusy! :(

Opublikowano

Po pierwsze, zamiast 101 linii zrób ( na oko ) 6 linii [ siatka w tle ] + 1 prostokąt.

Powinno się wtedy obejść bez double buforu.

 

A jeśli wciąz będzie potrzebny, zacznij od przeczytania tego artykułu ( jest o c++, ale jak już robisz w GDI+ to i tak trzeba zacząć to ogarniać ):

http://www.catch22.n...er-free-drawing

Ta sygnatura jest pusta.

Opublikowano

Po screenie zapewne było źle widać jak to działa, dlatego zrobiłem nowe i opisałem :

1344711912-U67561.png

 

Otóż poziom wolnego ramu w każdej sekundzie jest przedstawiony jedną niebieską kreską

jest ich sto. sto pierwsza kreska jest zwykłą bufforową (czyli mógłbym zmniejszyć do =100, ale nie do 6..)

 

Żeby nie było aż tyle rysowania pomyślałem o napisaniu sztucznej inteligencji sprawdzającej najniższy poziom ramu, i wypełniając zielone pole pod czerwoną kreską jako prostokąt (ażeby mniej linii było do rysowania)

 

By jeszcze mniej męczyło CPU generowanie siatki w tle dałem z obrazka... to chyba na tyle, pomęczę się jeszcze jakoś... :P

Chyba, że ktos ma znacznie lepszy pomysł na generowanie siatki.. tak jak mi wpadło tak zrobiłem... może i lepiej by było zrobić linią tylko czubki a potem wypełnić? kto wie :P

Oddajcie minusy! :(

Opublikowano

Istotnie po pierwszym screenie nie było zupełnie tego widać.

 

Pozostaje double buffering - dokładnie jest to wytłumaczone w linku wyżej, wszystkie funkcje z :

 

 

 

// Create an off-screen DC for double-buffering

hdcMem = CreateCompatibleDC(hdc);

hbmMem = CreateCompatibleBitmap(hdc, win_width, win_height);

 

hOld = SelectObject(hdcMem, hbmMem);

 

// Draw into hdcMem here

 

// Transfer the off-screen DC to the screen

BitBlt(hdc, 0, 0, win_width, win_height, hdcMem, 0, 0, SRCCOPY);

 

// Free-up the off-screen DC

SelectObject(hdcMem, hOld);

DeleteObject(hbmMem);

DeleteDC (hdcMem);

 

 

Istnieję w Autoitowych wersjach _GDIPlus_*

Ta sygnatura jest pusta.

Opublikowano

Działa to tak, że tworzysz dodatkowy bufor i do niego najpierw wrzucasz wszystko, czyli przypisujesz mu tło, dodajesz poszczególnie elementy po kolei i dopiero rysujesz w GUI..

Niweluje to miganie nawet do 0..

 

Tutaj masz jeszcze fajny skrypcik ;)

 

_AntiAlias($backbuffer, 4) ; wrzuć przed pętlą główną..

Func _AntiAlias($hGraphics, $mode)
Local $aResult
$aResult = DllCall($ghGDIPDll, "int", "GdipSetSmoothingMode", "hwnd", $hGraphics, "int", $mode)
If @error Then Return SetError(@error, @extended, False)
Return SetError($aResult[0], 0, $aResult[0] = 0)
EndFunc ;==>_AntiAlias

 

@Btw.

 

Zużycie procka przy podwójnym buforowaniu w AutoIT przy 10 poruszających się sprite'ach na poziomie ~25% przy rozdzielczości 800x600..

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...