1

Тема: GDIp просадки FPS во время создания окна

Происходит создание текста без фона поверх всех окон , вплоть до полно-экранных режимов.
И в этом тексте есть переменная которая меняется по мере существования .
Как только создается новое окно - старое скрывается .
Чтоб не было наслоения "одного на другое ".
Но проблема в том что при создании окна - падает фпс на 12 и больше и фризы
В  игре на шкале это видно, ровно через каждые 500мс - фриз .
Как избавится от фризов ?






#Include, gdiplus.ahk
settimer, ShowOverlay ,500
ShowOverlay:



; Start gdi+
If !pToken := Gdip_Startup()
{
	MsgBox, 48, gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system
	ExitApp
}
OnExit, Exit
Width :=500, Height := 500
Gui, New, +Hwndhwnd
Gui, %hwnd%: -Caption +E0x80000 +LastFound +AlwaysOnTop +ToolWindow +OwnDialogs
Gui, %hwnd%: Show,x30 y30 NA
WinSet, ExStyle, +0x20, % "ahk_id " hwnd 

hwnd1 := WinExist()
hbm := CreateDIBSection(Width, Height)
hdc := CreateCompatibleDC()
obm := SelectObject(hdc, hbm)
G := Gdip_GraphicsFromHDC(hdc)
Gdip_SetSmoothingMode(G, 4)
pBrush := Gdip_BrushCreateSolid(0xffff0000)
Gdip_DeleteBrush(pBrush)
pBrush := Gdip_BrushCreateSolid(0x660000ff)

Options = x10p y30p w80p Centre cbbffffff r4 s20 Underline Italic
Gdip_TextToGraphics(G,  "test fps text", Options, Font, Width, Height)

UpdateLayeredWindow(hwnd1, hdc, 0, 0, Width, Height)
SelectObject(hdc, obm)
DeleteObject(hbm)
DeleteDC(hdc)
Gdip_DeleteGraphics(G)	
	Sleep, 500
 gui, %hwnd%: hide

Return

Exit:
; gdi+ may now be shutdown on exiting the program
Gdip_Shutdown(pToken)
ExitApp

2 (изменено: serzh82saratov, 2020-02-18 17:55:04)

Re: GDIp просадки FPS во время создания окна

Чтоб не было наслоения "одного на другое ".

Не следует каждый раз создавать окно.


If !pToken := Gdip_Startup()
{
	MsgBox, 48, gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system
	ExitApp
}
OnExit, Exit
Width :=500, Height := 500 
Gui, New, +Hwndhwnd -Caption +E0x80000 +E0x20 +AlwaysOnTop +ToolWindow +OwnDialogs
Gui, Show, NA 
 
hbm := CreateDIBSection(Width, Height)
hdc := CreateCompatibleDC()
obm := SelectObject(hdc, hbm)
G := Gdip_GraphicsFromHDC(hdc)
Gdip_SetSmoothingMode(G, 4) 
Options = x10p y30p w80p Centre cbb000000 r4 s40

upd:
	Gdip_TextToGraphics(G,  A_TickCount, Options, , Width, Height)
	UpdateLayeredWindow(hwnd, hdc, 0, 0, Width, Height) 
	Gdip_GraphicsClear(G)
	Gui, %hwnd%:+AlwaysOnTop
	settimer, upd, -1
	Return

Exit:
	Gdip_DeleteGraphics(G)
	SelectObject(hdc, obm)
	DeleteObject(hbm)
	DeleteDC(hdc)
	; gdi+ may now be shutdown on exiting the program
	Gdip_Shutdown(pToken)
	ExitApp
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.32.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

3

Re: GDIp просадки FPS во время создания окна

запустил , и столкнулся  такой ситуацией - текст не показывается поверх игры, ни в оконном режиме, ни в  полно экранном .

4

Re: GDIp просадки FPS во время создания окна

Поправил.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.32.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

5

Re: GDIp просадки FPS во время создания окна

Anton.Badonov пишет:

Width :=500, Height := 500

Чем меньше окно, тем лучше производительность. Если заранее известен самый большой вариант текста в сообщении, то размер окна можно подогнать под него.


If !pToken := Gdip_Startup()
{
	MsgBox, 48, gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system
	ExitApp
}
OnExit, Exit
Gui, New, +Hwndhwnd -Caption +E0x80000 +E0x20 +AlwaysOnTop +ToolWindow +OwnDialogs
Gui, Show, NA 

x := 111
y := 111

hdc := GetDC() 
G := Gdip_GraphicsFromHDC(hdc)
ReleaseDC(hdc)
Options = s40 
p := Gdip_TextToGraphics(G,  A_TickCount 123, Options, , , , 1)   ;  текст максимальной ширины и высоты, можно чуть больше
Gdip_DeleteGraphics(G)
p := StrSplit(p, "|")
Width := p[3], Height := p[4]

hbm := CreateDIBSection(Width, Height)
hdc := CreateCompatibleDC()
obm := SelectObject(hdc, hbm)
G := Gdip_GraphicsFromHDC(hdc)
Gdip_SetSmoothingMode(G, 4) 
Options = cbb000000 r4 %Options% 

upd:
	Gdip_TextToGraphics(G,  A_TickCount, Options, , Width, Height)
	UpdateLayeredWindow(hwnd, hdc, x, y, Width, Height) 
	Gdip_GraphicsClear(G)
	Gui, %hwnd%:+AlwaysOnTop
	settimer, upd, -50
	Return

Exit:
	Gdip_DeleteGraphics(G)
	SelectObject(hdc, obm)
	DeleteObject(hbm)
	DeleteDC(hdc)
	; gdi+ may now be shutdown on exiting the program
	Gdip_Shutdown(pToken)
	ExitApp
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.32.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

6

Re: GDIp просадки FPS во время создания окна

Спасибо за правки .
Можно ли как то избавится от мерцания ?

7

Re: GDIp просадки FPS во время создания окна

У меня нет мерцаний. BF3 Win10x64.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.32.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

8

Re: GDIp просадки FPS во время создания окна

Подскажите, как выводить это сообщение относительно разрешения экрана ?
Чтоб при разных резрешениях сообщение было в одном месте .

9

Re: GDIp просадки FPS во время создания окна

У вас же есть x y и размер шрифта, меняйте как нравится в зависимости от A_ScreenWidth и A_ScreenHeight.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.32.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui