1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. UEZ

Beiträge von UEZ

  • Battle: Autoit vs. FreeBasic - Runde 1+2+3

    • UEZ
    • 5. August 2016 um 23:31
    Zitat von Andy

    Battle 3. Teil kann kommen....

    Du meinst bestimmt Battle 4. Teil... :P

    Ich sehe gegenüber AutoIt eine Menge Vorteile, wenn es um "Brotlose Kunst" geht: schneller, Multithreading fähig, Inline Assembler bereits an Bord, auch relativ einfach zu lernen.

    Ich bin mir nicht sicher, aber OpenGL und DirectX sind ebenfalls an Board.

    Da frage ich mich ernsthaft, warum ich noch in AutoIt "Brotlose Kunst" coden soll!

  • Battle: Autoit vs. FreeBasic - Runde 1+2+3

    • UEZ
    • 5. August 2016 um 22:43

    Mein Fazit:

    • willst du in der Hauptschleife GDI+ Funktionen benutzen, dann kann FB auch keine Wunder bewirken, da die GDI+ DLL Aufrufe langsam sind
    • benutzt du native Funktionen, wie z.B. das Setzen eines Pixels, so vollbringt FB einen richtigen Performance Schub
    • willst du noch weiter den Speed steigern, so benutze eigenen MMX/SSE optimierten Assembler Code
    • für AutoIt lagere die Performance Killer in eine externe DLL aus oder benutze gleich den Inline Assembler, dann sollte der Speed adequat zu FB sein
    • wenn trotz allem die Performance immer noch zu langsam ist, dann versuche es mal mit OpenCL

    Mir persönlich ist der Weg "durch die Brust ins Auge -> AutoIt Inline Assembler" der schwierigere Weg, da FB relativ einfach zu lernen ist und man damit schnelle Dinge "zaubern" kann.

  • Battle: Autoit vs. FreeBasic - Runde 1+2+3

    • UEZ
    • 5. August 2016 um 19:44
    Zitat von Andy

    Auch im Hinblick auf auf weitere "Battles" hätte ich gerne Anwendungen gesehen, welche von den bei FB und AutoIt gleich schnell ausgeführten API-Funktionen (ist das so?) abhängig sind.


    Ich habe mal einen weiteren Test hinzugefügt, wo primär GDI+ Funktionen aufgerufen werden und siehe da, AutoIt schlägt sich tapfer Dank der "lahmen" GDI+ Funktionen.

    FB kann erst nativ die volle Hengst Power entfalten, wenn die API Calls entfallen.

  • Battle: Autoit vs. FreeBasic - Runde 1+2+3

    • UEZ
    • 5. August 2016 um 12:11
    Zitat von Andy

    kein Wunder, da genau der "langsame" DllStructSetData() in einem ewig langen Loop wieder verwendet wurde.

    Ich habe es nicht getestet, aber eine schnellere Methode als diese um direkt Pixels in die Bitmap zu schreiben gibt es nicht. Jeder API Aufruf dürfte mehr Zeit kosten.


    Zitat von Andy

    Übrigens ist es bei mir so, dass beim FB-Programm der Fensterinhalt schwarz wird, sobald ich das Fenster nur zu einem kleinen Teil über den Bildschirmrand schiebe...

    Sollte doch so ähnlich auch in AutoIt sein, dass der Gfx Handle überschrieben wird. Ich müsste ein WM Funktion einbauen, dass beim Löschen die Bitmap wieder in die GUI blittet.


    Zitat von Andy

    Ich würde da gerne mal mit dem Disassembler drübergucken, FB produziert imho einen "schönen" Code....


    Function mandelIter:

    Code
    .intel_syntax noprefix
    
    
    .section .text
    .balign 16
    
    
    .globl _MANDELITER@12
    _MANDELITER@12:
    push ebp
    mov ebp, esp
    sub esp, 28
    push ebx
    mov dword ptr [ebp-4], 0
    .Lt_0004:
    movss xmm7, [_Lt_0008]
    movss [ebp-8], xmm7
    mov dword ptr [ebp-12], 0
    mov dword ptr [ebp-16], 0
    mov dword ptr [ebp-20], 0
    mov dword ptr [ebp-24], 0
    mov eax, dword ptr [ebp+16]
    mov dword ptr [ebp-28], eax
    .Lt_0006:
    movss xmm6, [ebp-20]
    addss xmm6, dword ptr [ebp-16]
    comiss xmm6, dword ptr [_Lt_0009]
    setbe al
    shr eax, 1
    sbb eax, eax
    mov ebx, dword ptr [ebp-28]
    test ebx, ebx
    setg bl
    shr ebx, 1
    sbb ebx, ebx
    and eax, ebx
    je .Lt_0007
    movss xmm6, [ebp-12]
    mulss xmm6, dword ptr [ebp-8]
    movss [ebp-24], xmm6
    movss xmm6, [ebp-8]
    mulss xmm6, dword ptr [ebp-8]
    movss [ebp-16], xmm6
    movss xmm6, [ebp-12]
    mulss xmm6, dword ptr [ebp-12]
    movss [ebp-20], xmm6
    movss xmm6, [ebp-16]
    subss xmm6, dword ptr [ebp-20]
    addss xmm6, dword ptr [ebp+8]
    movss [ebp-8], xmm6
    movss xmm6, [ebp-24]
    unpcklps xmm6, xmm6
    pshufd xmm7, xmm6, 0x01
    addss xmm6, xmm7
    addss xmm6, dword ptr [ebp+12]
    movss [ebp-12], xmm6
    dec dword ptr [ebp-28]
    jmp .Lt_0006
    .Lt_0007:
    mov ebx, dword ptr [ebp+16]
    sub ebx, dword ptr [ebp-28]
    mov dword ptr [ebp-4], ebx
    .Lt_0005:
    mov eax, dword ptr [ebp-4]
    pop ebx
    mov esp, ebp
    pop ebp
    ret 12
    .balign 16
    
    
    .globl _main
    _main:
    push ebp
    mov ebp, esp
    and esp, 0xFFFFFFF0
    sub esp, 4
    mov dword ptr [ebp-4], 0
    call ___main
    push 0
    push dword ptr [ebp+12]
    push dword ptr [ebp+8]
    call _fb_Init@12
    .Lt_0002:
    .Lt_0003:
    push 0
    call _fb_End@4
    mov eax, dword ptr [ebp-4]
    mov esp, ebp
    pop ebp
    ret
    
    
    .section .data
    .balign 4
    _Lt_0008:	.long	0x00000000
    .balign 4
    _Lt_0009:	.long	0x40800000
    Alles anzeigen


    Der gesamte Code:

    Code
    .file	"Mandelbrot.c"
    	.intel_syntax noprefix
    	.section	.text.unlikely,"x"
    .LCOLDB9:
    	.text
    .LHOTB9:
    	.p2align 4,,15
    	.globl	MANDELBROT
    	.def	MANDELBROT;	.scl	2;	.type	32;	.endef
    MANDELBROT:
    .L2:
    	push	r15
    	push	r14
    	subss	xmm1, xmm0
    	push	r13
    	push	r12
    	subss	xmm3, xmm2
    	push	rbp
    	push	rdi
    	push	rsi
    	push	rbx
    	sub	rsp, 328
    	mov	eax, DWORD PTR IH$[rip]
    	movaps	XMMWORD PTR 160[rsp], xmm6
    	pxor	xmm6, xmm6
    	mov	r15d, DWORD PTR 432[rsp]
    	movaps	XMMWORD PTR 224[rsp], xmm10
    	pxor	xmm10, xmm10
    	lea	r14, 136[rsp]
    	cvtss2sd	xmm6, xmm2
    	lea	r13, 140[rsp]
    	lea	r12, 144[rsp]
    	movaps	XMMWORD PTR 192[rsp], xmm8
    	mov	DWORD PTR 96[rsp], eax
    	sub	eax, 1
    	mov	QWORD PTR 152[rsp], 0
    	movsd	QWORD PTR 104[rsp], xmm6
    	pxor	xmm6, xmm6
    	movaps	XMMWORD PTR 208[rsp], xmm9
    	mov	DWORD PTR 112[rsp], eax
    	movaps	xmm8, xmm1
    	movaps	XMMWORD PTR 176[rsp], xmm7
    	lea	rbp, 148[rsp]
    	movaps	XMMWORD PTR 240[rsp], xmm11
    	movaps	XMMWORD PTR 256[rsp], xmm12
    	movaps	XMMWORD PTR 272[rsp], xmm13
    	movaps	XMMWORD PTR 288[rsp], xmm14
    	movaps	XMMWORD PTR 304[rsp], xmm15
    	movss	DWORD PTR 116[rsp], xmm3
    	cvtss2sd	xmm10, xmm0
    	mov	eax, DWORD PTR 440[rsp]
    	mov	DWORD PTR 84[rsp], 0
    	movsd	xmm9, QWORD PTR .LC3[rip]
    	mov	QWORD PTR 120[rsp], rax
    	mov	eax, DWORD PTR IW$[rip]
    	mov	DWORD PTR 100[rsp], eax
    	movsd	xmm11, QWORD PTR .LC4[rip]
    .L3:
    	mov	ebx, DWORD PTR 100[rsp]
    	mov	edi, DWORD PTR 84[rsp]
    	xor	esi, esi
    	pxor	xmm14, xmm14
    	pxor	xmm0, xmm0
    	mov	eax, ebx
    	pxor	xmm7, xmm7
    	sub	eax, 1
    	movsd	xmm12, QWORD PTR .LC6[rip]
    	mov	DWORD PTR 80[rsp], eax
    	mov	eax, edi
    	cvtsi2ssq	xmm14, rax
    	mov	QWORD PTR 88[rsp], rax
    	mov	eax, DWORD PTR 96[rsp]
    	movsd	xmm13, QWORD PTR .LC5[rip]
    	imul	edi, ebx
    	sub	rax, 1
    	cvtsi2sdq	xmm0, rax
    	mov	eax, ebx
    	mov	ebx, r15d
    	sub	rax, 1
    	cvtsi2sdq	xmm7, rax
    	mulss	xmm14, DWORD PTR 116[rsp]
    	cvtss2sd	xmm14, xmm14
    	divsd	xmm14, xmm0
    	addsd	xmm14, QWORD PTR 104[rsp]
    	cvtsd2ss	xmm14, xmm14
    	.p2align 4,,10
    .L4:
    	pxor	xmm4, xmm4
    	mov	eax, esi
    	test	ebx, ebx
    	mov	DWORD PTR [r14], 0
    	mov	DWORD PTR 0[r13], 0
    	mov	DWORD PTR [r12], 0
    	mov	DWORD PTR 0[rbp], 0
    	cvtsi2ssq	xmm4, rax
    	mulss	xmm4, xmm8
    	cvtss2sd	xmm4, xmm4
    	divsd	xmm4, xmm7
    	addsd	xmm4, xmm10
    	cvtsd2ss	xmm4, xmm4
    	je	.L5
    	movaps	xmm3, xmm6
    	movaps	xmm2, xmm6
    	mov	ecx, ebx
    	movss	xmm5, DWORD PTR .LC2[rip]
    	.p2align 4,,10
    .L6:
    	movaps	xmm1, xmm2
    	xor	edx, edx
    	movaps	xmm0, xmm3
    	mulss	xmm1, xmm2
    	movaps	xmm15, xmm2
    	mulss	xmm0, xmm3
    	mulss	xmm15, xmm3
    	movaps	xmm2, xmm1
    	subss	xmm2, xmm0
    	movaps	xmm3, xmm15
    	addss	xmm0, xmm1
    	addss	xmm3, xmm14
    	addss	xmm2, xmm4
    	ucomiss	xmm5, xmm0
    	setnb	dl
    	xor	eax, eax
    	neg	edx
    	sub	ecx, 1
    	setne	al
    	neg	eax
    	test	edx, eax
    	jne	.L6
    .L7:
    	mov	eax, ebx
    	lea	r15d, [rdi+rsi]
    	sub	eax, ecx
    	cmp	ebx, eax
    	jnb	.L8
    	mov	rax, QWORD PTR ABITS$[rip]
    	mov	DWORD PTR [rax+r15*4], -16777216
    .L9:
    .L13:
    .L14:
    	add	esi, 1
    	cmp	DWORD PTR 80[rsp], esi
    	jnb	.L4
    .L15:
    	mov	rax, QWORD PTR 88[rsp]
    	mov	r15d, ebx
    	cqo
    	idiv	QWORD PTR 120[rsp]
    	test	rdx, rdx
    	je	.L25
    .L16:
    .L17:
    	add	DWORD PTR 84[rsp], 1
    	mov	eax, DWORD PTR 84[rsp]
    	cmp	DWORD PTR 112[rsp], eax
    	jnb	.L3
    .L18:
    	mov	rax, QWORD PTR HGFXDC$[rip]
    	mov	r9d, DWORD PTR 100[rsp]
    	xor	r8d, r8d
    	mov	rcx, QWORD PTR HDC$[rip]
    	mov	DWORD PTR 64[rsp], 13369376
    	xor	edx, edx
    	mov	DWORD PTR 56[rsp], 0
    	mov	DWORD PTR 48[rsp], 0
    	mov	QWORD PTR 40[rsp], rax
    	mov	eax, DWORD PTR 96[rsp]
    	mov	DWORD PTR 32[rsp], eax
    	call	BitBlt
    	movaps	xmm6, XMMWORD PTR 160[rsp]
    	movaps	xmm7, XMMWORD PTR 176[rsp]
    	movaps	xmm8, XMMWORD PTR 192[rsp]
    	movaps	xmm9, XMMWORD PTR 208[rsp]
    	movaps	xmm10, XMMWORD PTR 224[rsp]
    	movaps	xmm11, XMMWORD PTR 240[rsp]
    	movaps	xmm12, XMMWORD PTR 256[rsp]
    	movaps	xmm13, XMMWORD PTR 272[rsp]
    	movaps	xmm14, XMMWORD PTR 288[rsp]
    	movaps	xmm15, XMMWORD PTR 304[rsp]
    	add	rsp, 328
    	pop	rbx
    	pop	rsi
    	pop	rdi
    	pop	rbp
    	pop	r12
    	pop	r13
    	pop	r14
    	pop	r15
    	ret
    	.p2align 4,,10
    .L8:
    	pxor	xmm0, xmm0
    	cvtsi2sdq	xmm0, rax
    .L10:
    	call	log
    	movapd	xmm15, xmm0
    	mov	eax, ebx
    	pxor	xmm0, xmm0
    	mulsd	xmm15, xmm11
    	cvtsi2sdq	xmm0, rax
    	subsd	xmm0, xmm9
    	call	log
    	divsd	xmm15, xmm0
    	ucomisd	xmm15, xmm9
    	movapd	xmm0, xmm15
    	movsd	QWORD PTR 152[rsp], xmm15
    	jb	.L26
    .L11:
    	ucomisd	xmm15, xmm12
    	jnb	.L12
    	movsd	xmm1, QWORD PTR .LC5[rip]
    	mulsd	xmm0, xmm1
    	subsd	xmm0, xmm1
    	call	floor
    	cvttsd2si	rax, xmm0
    	mov	rdx, QWORD PTR ABITS$[rip]
    	sal	eax, 8
    	sub	eax, 65536
    	mov	DWORD PTR [rdx+r15*4], eax
    	jmp	.L14
    	.p2align 4,,10
    .L12:
    	mulsd	xmm0, xmm13
    	subsd	xmm0, QWORD PTR .LC7[rip]
    	call	floor
    	addsd	xmm0, QWORD PTR .LC8[rip]
    	mov	rdx, QWORD PTR ABITS$[rip]
    	cvttsd2si	rax, xmm0
    	mov	DWORD PTR [rdx+r15*4], eax
    	jmp	.L14
    	.p2align 4,,10
    .L26:
    	mulsd	xmm0, QWORD PTR .LC5[rip]
    	call	floor
    	cvttsd2si	rax, xmm0
    	mov	rdx, QWORD PTR ABITS$[rip]
    	sal	eax, 16
    	sub	eax, 16777216
    	mov	DWORD PTR [rdx+r15*4], eax
    	jmp	.L14
    .L5:
    	lea	r15d, [rdi+rsi]
    	pxor	xmm0, xmm0
    	jmp	.L10
    .L25:
    	mov	rax, QWORD PTR HGFXDC$[rip]
    	mov	r9d, DWORD PTR 100[rsp]
    	xor	r8d, r8d
    	mov	rcx, QWORD PTR HDC$[rip]
    	mov	DWORD PTR 64[rsp], 13369376
    	mov	DWORD PTR 56[rsp], 0
    	mov	DWORD PTR 48[rsp], 0
    	mov	QWORD PTR 40[rsp], rax
    	mov	eax, DWORD PTR 96[rsp]
    	mov	DWORD PTR 32[rsp], eax
    	call	BitBlt
    	mov	eax, DWORD PTR IH$[rip]
    	mov	DWORD PTR 96[rsp], eax
    	mov	eax, DWORD PTR IW$[rip]
    	mov	DWORD PTR 100[rsp], eax
    	jmp	.L17
    	.section	.text.unlikely,"x"
    .LCOLDE9:
    	.text
    .LHOTE9:
    	.section	.text.unlikely,"x"
    .LCOLDB10:
    	.text
    .LHOTB10:
    	.p2align 4,,15
    	.globl	MANDELITER
    	.def	MANDELITER;	.scl	2;	.type	32;	.endef
    MANDELITER:
    	test	r8d, r8d
    	je	.L30
    	pxor	xmm4, xmm4
    	sub	rsp, 40
    	mov	r9d, r8d
    	movaps	XMMWORD PTR [rsp], xmm6
    	movaps	xmm2, xmm4
    	movaps	XMMWORD PTR 16[rsp], xmm7
    	movss	xmm7, DWORD PTR .LC2[rip]
    	.p2align 4,,10
    .L29:
    	movaps	xmm5, xmm2
    	movaps	xmm3, xmm4
    	movaps	xmm6, xmm2
    	xor	ecx, ecx
    	mulss	xmm5, xmm2
    	mulss	xmm3, xmm4
    	mulss	xmm6, xmm4
    	movaps	xmm2, xmm5
    	subss	xmm2, xmm3
    	movaps	xmm4, xmm6
    	addss	xmm3, xmm5
    	addss	xmm4, xmm1
    	addss	xmm2, xmm0
    	ucomiss	xmm7, xmm3
    	setnb	cl
    	xor	edx, edx
    	neg	ecx
    	sub	r9d, 1
    	setne	dl
    	neg	edx
    	test	ecx, edx
    	jne	.L29
    .L28:
    	mov	eax, r8d
    	movaps	xmm6, XMMWORD PTR [rsp]
    	sub	eax, r9d
    	movaps	xmm7, XMMWORD PTR 16[rsp]
    	add	rsp, 40
    	ret
    .L30:
    	xor	eax, eax
    	ret
    	.section	.text.unlikely,"x"
    .LCOLDE10:
    	.text
    .LHOTE10:
    	.def	__main;	.scl	2;	.type	32;	.endef
    	.section .rdata,"dr"
    .LC11:
    	.ascii "\0"
    .LC12:
    	.ascii "GDI\0"
    .LC13:
    	.ascii "GDI Mandelbrot\0"
    .LC17:
    	.ascii " / Took \0"
    .LC18:
    	.ascii " seconds to render.\0"
    	.section	.text.unlikely,"x"
    .LCOLDB19:
    	.section	.text.startup,"x"
    .LHOTB19:
    	.p2align 4,,15
    	.globl	main
    	.def	main;	.scl	2;	.type	32;	.endef
    main:
    	push	rbp
    	push	rdi
    	push	rsi
    	push	rbx
    	mov	rsi, rdx
    	mov	ebx, ecx
    	sub	rsp, 456
    	movaps	XMMWORD PTR 432[rsp], xmm6
    	call	__main
    	xor	r8d, r8d
    	mov	rdx, rsi
    	mov	ecx, ebx
    	call	fb_Init
    	lea	rcx, .LC11[rip]
    	xor	edx, edx
    	mov	QWORD PTR 120[rsp], 0
    	mov	QWORD PTR 128[rsp], 0
    	lea	rsi, 272[rsp]
    	call	fb_StrAllocTempDescZEx
    	mov	QWORD PTR 48[rsp], rax
    	lea	rax, 88[rsp]
    	lea	r9, 72[rsp]
    	lea	r8, 64[rsp]
    	lea	rdx, 128[rsp]
    	lea	rcx, 120[rsp]
    	mov	QWORD PTR 40[rsp], rax
    	lea	rax, 80[rsp]
    	mov	QWORD PTR 88[rsp], 0
    	mov	QWORD PTR 80[rsp], 0
    	mov	QWORD PTR 72[rsp], 0
    	mov	QWORD PTR 32[rsp], rax
    	mov	QWORD PTR 64[rsp], 0
    	call	fb_GfxScreenInfo
    	lea	rcx, .LC12[rip]
    	mov	edx, 3
    	mov	DWORD PTR IW$[rip], 1000
    	mov	DWORD PTR IH$[rip], 600
    	call	fb_StrAllocTempDescZEx
    	mov	ecx, 103
    	mov	rdx, rax
    	call	fb_GfxControl_s
    	mov	edx, DWORD PTR IH$[rip]
    	mov	ecx, DWORD PTR IW$[rip]
    	mov	r9d, 1
    	mov	r8d, 24
    	mov	DWORD PTR 40[rsp], 0
    	mov	DWORD PTR 32[rsp], 0
    	call	fb_GfxScreenRes
    	lea	r8, .LC13[rip]
    	mov	r9d, 15
    	mov	rdx, -1
    	mov	rcx, rsi
    	mov	DWORD PTR 32[rsp], 0
    	call	fb_StrInit
    	mov	rcx, rsi
    	call	fb_GfxSetWindowTitle
    	mov	eax, 2147483648
    	lea	rdx, 136[rsp]
    	lea	r9, 104[rsp]
    	mov	QWORD PTR 112[rsp], rax
    	mov	QWORD PTR 104[rsp], rax
    	lea	r8, 96[rsp]
    	mov	QWORD PTR 96[rsp], rax
    	lea	rax, 112[rsp]
    	mov	ecx, 2
    	mov	QWORD PTR 136[rsp], 0
    	mov	QWORD PTR 32[rsp], rax
    	call	fb_GfxControl_i
    	mov	rcx, QWORD PTR 136[rsp]
    	call	GetDC
    	lea	rdx, 304[rsp]
    	mov	r10, rax
    	mov	QWORD PTR HDC$[rip], rax
    	mov	ecx, 15
    	xor	eax, eax
    	lea	r9, ABITS$[rip]
    	mov	rdi, rdx
    	xor	r8d, r8d
    	rep stosq
    	mov	eax, DWORD PTR IW$[rip]
    	mov	ecx, 32
    	mov	DWORD PTR 304[rsp], 124
    	mov	WORD PTR 318[rsp], cx
    	mov	rcx, r10
    	mov	DWORD PTR 320[rsp], 3
    	mov	DWORD PTR 356[rsp], -16777216
    	mov	DWORD PTR 344[rsp], 16711680
    	mov	DWORD PTR 308[rsp], eax
    	mov	eax, DWORD PTR IH$[rip]
    	mov	DWORD PTR 348[rsp], 65280
    	mov	DWORD PTR 352[rsp], 255
    	mov	DWORD PTR [rdi], 0
    	mov	DWORD PTR 40[rsp], 0
    	neg	eax
    	mov	QWORD PTR 32[rsp], 0
    	mov	DWORD PTR 312[rsp], eax
    	mov	eax, 1
    	mov	WORD PTR 316[rsp], ax
    	call	CreateDIBSection
    	mov	rcx, QWORD PTR HDC$[rip]
    	mov	rdi, rax
    	call	CreateCompatibleDC
    	mov	rdx, rdi
    	mov	rcx, rax
    	mov	QWORD PTR HGFXDC$[rip], rax
    	call	SelectObject
    	mov	QWORD PTR 144[rsp], 0
    	mov	rbp, rax
    	mov	QWORD PTR 152[rsp], 0
    	mov	DWORD PTR 160[rsp], 0
    	call	fb_Timer
    	movss	xmm3, DWORD PTR .LC14[rip]
    	mov	DWORD PTR 40[rsp], 100
    	movaps	xmm1, xmm3
    	mov	DWORD PTR 32[rsp], 5000
    	movapd	xmm6, xmm0
    	movss	xmm2, DWORD PTR .LC15[rip]
    	movss	xmm0, DWORD PTR .LC16[rip]
    	call	MANDELBROT
    	call	fb_Timer
    	subsd	xmm0, xmm6
    	call	fb_DoubleToStr
    	lea	rcx, 176[rsp]
    	lea	r9, .LC17[rip]
    	mov	r8, -1
    	mov	rdx, rsi
    	mov	QWORD PTR 32[rsp], 9
    	mov	rbx, rax
    	mov	QWORD PTR 176[rsp], 0
    	mov	QWORD PTR 184[rsp], 0
    	mov	QWORD PTR 192[rsp], 0
    	call	fb_StrConcat
    	lea	rcx, 208[rsp]
    	mov	r9, rbx
    	mov	r8, -1
    	mov	rdx, rax
    	mov	QWORD PTR 32[rsp], -1
    	mov	QWORD PTR 208[rsp], 0
    	mov	QWORD PTR 216[rsp], 0
    	mov	QWORD PTR 224[rsp], 0
    	lea	rbx, 144[rsp]
    	call	fb_StrConcat
    	lea	rcx, 240[rsp]
    	lea	r9, .LC18[rip]
    	mov	r8, -1
    	mov	rdx, rax
    	mov	QWORD PTR 32[rsp], 20
    	mov	QWORD PTR 240[rsp], 0
    	mov	QWORD PTR 248[rsp], 0
    	mov	QWORD PTR 256[rsp], 0
    	call	fb_StrConcat
    	mov	rcx, rax
    	call	fb_GfxSetWindowTitle
    	jmp	.L35
    	.p2align 4,,10
    .L50:
    	cmp	eax, 1
    	je	.L38
    .L36:
    .L39:
    .L40:
    .L41:
    	mov	ecx, 30
    	call	fb_Sleep
    .L35:
    	mov	rcx, rbx
    	call	fb_GfxEvent
    	test	eax, eax
    	je	.L41
    	mov	eax, DWORD PTR 144[rsp]
    	cmp	eax, 13
    	jne	.L50
    .L38:
    	mov	rcx, QWORD PTR HGFXDC$[rip]
    	mov	rdx, rbp
    	call	SelectObject
    	mov	rdx, QWORD PTR HDC$[rip]
    	mov	rcx, QWORD PTR 136[rsp]
    	call	ReleaseDC
    	mov	rcx, QWORD PTR HGFXDC$[rip]
    	call	DeleteDC
    	mov	rcx, rdi
    	call	DeleteObject
    	mov	rcx, rsi
    	call	fb_StrDelete
    	xor	ecx, ecx
    	call	fb_End
    	movaps	xmm6, XMMWORD PTR 432[rsp]
    	add	rsp, 456
    	pop	rbx
    	xor	eax, eax
    	pop	rsi
    	pop	rdi
    	pop	rbp
    	ret
    	.section	.text.unlikely,"x"
    .LCOLDE19:
    	.section	.text.startup,"x"
    .LHOTE19:
    .lcomm HGFXDC$,8,8
    .lcomm ABITS$,8,8
    .lcomm HDC$,8,8
    .lcomm IH$,4,4
    .lcomm IW$,4,4
    	.section .rdata,"dr"
    	.align 4
    .LC2:
    	.long	1082130432
    	.align 8
    .LC3:
    	.long	0
    	.long	1072693248
    	.align 8
    .LC4:
    	.long	0
    	.long	1074266112
    	.align 8
    .LC5:
    	.long	0
    	.long	1081073664
    	.align 8
    .LC6:
    	.long	0
    	.long	1073741824
    	.align 8
    .LC7:
    	.long	0
    	.long	1082122240
    	.align 8
    .LC8:
    	.long	-536870912
    	.long	1106247679
    	.align 4
    .LC14:
    	.long	1065353216
    	.align 4
    .LC15:
    	.long	-1082130432
    	.align 4
    .LC16:
    	.long	-1073741824
    	.ident	"GCC: (x86_64-win32-sjlj-rev0, Built by MinGW-W64 project) 5.2.0"
    	.def	BitBlt;	.scl	2;	.type	32;	.endef
    	.def	log;	.scl	2;	.type	32;	.endef
    	.def	floor;	.scl	2;	.type	32;	.endef
    	.def	fb_Init;	.scl	2;	.type	32;	.endef
    	.def	fb_StrAllocTempDescZEx;	.scl	2;	.type	32;	.endef
    	.def	fb_GfxScreenInfo;	.scl	2;	.type	32;	.endef
    	.def	fb_GfxControl_s;	.scl	2;	.type	32;	.endef
    	.def	fb_GfxScreenRes;	.scl	2;	.type	32;	.endef
    	.def	fb_StrInit;	.scl	2;	.type	32;	.endef
    	.def	fb_GfxSetWindowTitle;	.scl	2;	.type	32;	.endef
    	.def	fb_GfxControl_i;	.scl	2;	.type	32;	.endef
    	.def	GetDC;	.scl	2;	.type	32;	.endef
    	.def	CreateDIBSection;	.scl	2;	.type	32;	.endef
    	.def	CreateCompatibleDC;	.scl	2;	.type	32;	.endef
    	.def	SelectObject;	.scl	2;	.type	32;	.endef
    	.def	fb_Timer;	.scl	2;	.type	32;	.endef
    	.def	fb_DoubleToStr;	.scl	2;	.type	32;	.endef
    	.def	fb_StrConcat;	.scl	2;	.type	32;	.endef
    	.def	fb_Sleep;	.scl	2;	.type	32;	.endef
    	.def	fb_GfxEvent;	.scl	2;	.type	32;	.endef
    	.def	ReleaseDC;	.scl	2;	.type	32;	.endef
    	.def	DeleteDC;	.scl	2;	.type	32;	.endef
    	.def	DeleteObject;	.scl	2;	.type	32;	.endef
    	.def	fb_StrDelete;	.scl	2;	.type	32;	.endef
    	.def	fb_End;	.scl	2;	.type	32;	.endef
    Alles anzeigen

    Kompiliert mit folgenden Parametern: fbc -s gui -RR -fpu SSE -vec 2 "Mandelbrot.bas"

    Wenn ich den Code als 64-bit kompiliere, dann wird die Mandelbrot Grafik rund dargestellt! ?(

    Zitat von Andy

    Auch im Hinblick auf auf weitere "Battles" hätte ich gerne Anwendungen gesehen, welche von den bei FB und AutoIt gleich schnell ausgeführten API-Funktionen (ist das so?) abhängig sind.

    Du meinst also, dass ich z.B. eine GDI+ Code in FB umwandeln soll. Kann ich machen, aber mit großer Wahrscheinlichkeit wird der Unterschied nicht mehr so immens sein, da die GDI+ Calls ausbremsen.


    Zitat von Andy

    In FB sollten imho auch Arrayfunktionen (Arraysort bspw) wesentlich schneller arbeiten.

    Ich habe für die _GDIPlus_BitmapApplyFilter DLL ein ArraySort benötigt, aber habe keine native FB Funktion gefunden. Entweder bin ich blind oder zu blöd zum Suchen.
    Zum Sortieren von Arrays habe ich eine WinAPI Funktion verwendet: QSort.
    Das wurde auch in AutoIt bereits umgesetzt.

    _ArraySortClib:

    AutoIt
    ; http://www.autoitscript.com/forum/index.php?showtopic=63525&view=findpost&p=474072
    ;===============================================================================
    ; Function Name:    _ArraySortClib() v4
    ; Description:       Sort 1D/2D array using qsort() from C runtime library
    ; Syntax:
    ; Parameter(s):   $Array - the array to be sorted, ByRef
    ;                   $iMode - sort mode, can be one of the following:
    ;                       0 = numerical, using double precision float compare
    ;                       1 = string sort, case insensitive (default)
    ;                       2 = string sort, case sensitive
    ;                       3 = word sort, case insensitive - compatible with AutoIt's native compare
    ;                   $fDescend - sort direction. True = descending, False = ascending (default)
    ;                   $iStart - index of starting element (default 0 = $array[0])
    ;                   $iEnd - index of ending element (default 0 = Ubound($array)-1)
    ;                   $iColumn - index of column to sort by (default 0 = first column)
    ;                   $iStrMax - max string length of each array element to compare (default 4095 chars)
    ; Requirement(s):    msvcrt.dll (shipped with Windows since Win98 at least), 32-bit version of AutoIt
    ; Return Value(s):    Success = Returns 1
    ;                   Failure = Returns 0 and sets error:
    ;                       @error 1 = invalid array
    ;                       @error 2 = invalid param
    ;                       @error 3 = dll error
    ;                       @error 64 = 64-bit AutoIt unsupported
    ; Author(s):   Siao
    ; Modification(s): KaFu, added three global _MemVirtualAlloc() calls to top of script to prevent DEP Errors:
    ;
    ; Global $pEnumProc_ArraySortClib_Mem1 = _MemVirtualAlloc(0, 64, $MEM_COMMIT, $PAGE_EXECUTE_READWRITE) ; needed for _ArraySortClib()
    ; Global $pEnumProc_ArraySortClib_Mem2 = _MemVirtualAlloc(0, 64, $MEM_COMMIT, $PAGE_EXECUTE_READWRITE) ; needed for _ArraySortClib()
    ; Global $pEnumProc_ArraySortClib_Mem3 = _MemVirtualAlloc(0, 36, $MEM_COMMIT, $PAGE_EXECUTE_READWRITE) ; needed for _ArraySortClib()
    ;
    ;===============================================================================
    
    
    Func _ArraySortClib(ByRef $array, $iMode = 1, $fDescend = False, $iStart = 0, $iEnd = 0, $iColumn = 0, $iStrMax = 4095)
        If @AutoItX64 Then Return SetError(64, 0, 0)
        Local $iArrayDims = UBound($array, 0)
        If @error Or $iArrayDims > 2 Then Return SetError(1, 0, 0)
        Local $iArraySize = UBound($array, 1), $iColumnMax = UBound($array, 2)
        If $iArraySize < 2 Then Return SetError(1, 0, 0)
        If $iEnd < 1 Or $iEnd > $iArraySize - 1 Then $iEnd = $iArraySize - 1
        If ($iEnd - $iStart < 1) Then
            ; ConsoleWrite("- _ArraySortClib ERROR: #1 - " & ($iEnd - $iStart < 1) & @tab & ($iEnd - $iStart) & @crlf)
            Return SetError(2, 0, 0)
        EndIf
        If $iArrayDims = 2 And ($iColumnMax - $iColumn < 0) Then
            ; ConsoleWrite("- _ArraySortClib ERROR: #2 - " & $iArrayDims & @tab & ($iColumnMax - $iColumn < 0) & @tab & ($iColumnMax - $iColumn) & @crlf)
            Return SetError(2, 0, 0)
        EndIf
        If $iStrMax < 1 Then
            ; ConsoleWrite("- _ArraySortClib ERROR: #3 - " & $iStrMax & @crlf)
            Return SetError(2, 0, 0)
        EndIf
        Local $i, $j, $iCount = $iEnd - $iStart + 1, $fNumeric, $aRet, $sZero = ChrW(0), $sStrCmp, $sBufType = 'byte[', $tSource, $tIndex, $tFloatCmp
    
    
        Local $tEnumProc = DllStructCreate('byte[64]', $pEnumProc_ArraySortClib_Mem1)
        Local $tCmpWrap = DllStructCreate('byte[64]', $pEnumProc_ArraySortClib_Mem2)
    
    
        If $h_DLL_msvcrt = -1 Then Return SetError(3, 0, 0)
    
    
        ;; initialize compare proc
        Switch $iMode
            Case 0
                $fNumeric = True
                $tFloatCmp = DllStructCreate('byte[36]', $pEnumProc_ArraySortClib_Mem3)
                DllStructSetData($tFloatCmp, 1, '0x8B4C24048B542408DD01DC1ADFE0F6C440750D80E441740433C048C333C040C333C0C3')
                DllStructSetData($tCmpWrap, 1, '0xBA' & Hex(Binary(DllStructGetPtr($tFloatCmp)), 8) & '8B4424088B4C2404FF30FF31FFD283C408C3')
                DllStructSetData($tEnumProc, 1, '0x8B7424048B7C24088B4C240C8B442410893789470483C60883C708404975F1C21000')
            Case 1, 2
                $sStrCmp = "_strcmpi" ;case insensitive
                If $iMode = 2 Then $sStrCmp = "strcmp" ;case sensitive
                $aRet = DllCall($h_DLL_Kernel32, 'ptr', 'GetModuleHandle', 'str', 'msvcrt.dll')
                $aRet = DllCall($h_DLL_Kernel32, 'ptr', 'GetProcAddress', 'ptr', $aRet[0], 'str', $sStrCmp)
                ;If $aRet[0] = 0 Then Return SetError(3, 0, 0 * DllClose($h_DLL_msvcrt))
                If $aRet[0] = 0 Then Return SetError(3, 0, 1)
                DllStructSetData($tCmpWrap, 1, '0xBA' & Hex(Binary($aRet[0]), 8) & '8B4424088B4C2404FF30FF31FFD283C408C3')
                DllStructSetData($tEnumProc, 1, '0x8B7424048B7C24088B4C240C8B542410893789570483C7088A064684C075F9424975EDC21000')
            Case 3
                $sBufType = 'wchar['
                $aRet = DllCall($h_DLL_Kernel32, 'ptr', 'GetModuleHandle', 'str', 'kernel32.dll')
                $aRet = DllCall($h_DLL_Kernel32, 'ptr', 'GetProcAddress', 'ptr', $aRet[0], 'str', 'CompareStringW')
                ;If $aRet[0] = 0 Then Return SetError(3, 0, 0 * DllClose($h_DLL_msvcrt))
                If $aRet[0] = 0 Then Return SetError(3, 0, 1)
                DllStructSetData($tCmpWrap, 1, '0xBA' & Hex(Binary($aRet[0]), 8) & '8B4424088B4C24046AFFFF306AFFFF3168000000006800040000FFD283E802C3')
                DllStructSetData($tEnumProc, 1, '0x8B7424048B7C24088B4C240C8B542410893789570483C7080FB70683C60285C075F6424975EAC21000')
            Case Else
    
    
                Return SetError(2, 0, 0)
        EndSwitch
        ;; write data to memory
        If $fNumeric Then
            $tSource = DllStructCreate('double[' & $iCount & ']')
            If $iArrayDims = 1 Then
                For $i = 1 To $iCount
                    DllStructSetData($tSource, 1, $array[$iStart + $i - 1], $i)
                Next
            Else
                For $i = 1 To $iCount
                    DllStructSetData($tSource, 1, $array[$iStart + $i - 1][$iColumn], $i)
                Next
            EndIf
        Else
            Local $sMem = ""
            If $iArrayDims = 1 Then
                For $i = $iStart To $iEnd
                    $sMem &= StringLeft($array[$i], $iStrMax) & $sZero
                Next
            Else
                For $i = $iStart To $iEnd
                    $sMem &= StringLeft($array[$i][$iColumn], $iStrMax) & $sZero
                Next
            EndIf
            $tSource = DllStructCreate($sBufType & StringLen($sMem) + 1 & ']')
            DllStructSetData($tSource, 1, $sMem)
            $sMem = ""
        EndIf
        ;; index data
        $tIndex = DllStructCreate('int[' & $iCount * 2 & ']')
        DllCall($h_DLL_user32, 'uint', 'CallWindowProc', 'ptr', DllStructGetPtr($tEnumProc), 'ptr', DllStructGetPtr($tSource), 'ptr', DllStructGetPtr($tIndex), 'int', $iCount, 'int', $iStart)
        ;; sort
        DllCall($h_DLL_msvcrt, 'none:cdecl', 'qsort', 'ptr', DllStructGetPtr($tIndex), 'int', $iCount, 'int', 8, 'ptr', DllStructGetPtr($tCmpWrap))
        ;DllClose($h_DLL_msvcrt)
        ;; rearrange the array by sorted index
        Local $aTmp = $array, $iRef
        If $iArrayDims = 1 Then ; 1D
            If $fDescend Then
                For $i = 0 To $iCount - 1
                    $iRef = DllStructGetData($tIndex, 1, $i * 2 + 2)
                    $array[$iEnd - $i] = $aTmp[$iRef]
                Next
            Else ; ascending
                For $i = $iStart To $iEnd
                    $iRef = DllStructGetData($tIndex, 1, ($i - $iStart) * 2 + 2)
                    $array[$i] = $aTmp[$iRef]
                Next
            EndIf
        Else ; 2D
            If $fDescend Then
                For $i = 0 To $iCount - 1
                    $iRef = DllStructGetData($tIndex, 1, $i * 2 + 2)
                    For $j = 0 To $iColumnMax - 1
                        $array[$iEnd - $i][$j] = $aTmp[$iRef][$j]
                    Next
                Next
            Else ; ascending
                For $i = $iStart To $iEnd
                    $iRef = DllStructGetData($tIndex, 1, ($i - $iStart) * 2 + 2)
                    For $j = 0 To $iColumnMax - 1
                        $array[$i][$j] = $aTmp[$iRef][$j]
                    Next
                Next
            EndIf
        EndIf
        Return 1
    EndFunc   ;==>_ArraySortClib
    Alles anzeigen
  • Battle: Autoit vs. FreeBasic - Runde 1+2+3

    • UEZ
    • 4. August 2016 um 23:28
    Zitat von Andy

    BTT, wann kommt der 2. Teil von "AutoIt vs FreeBasic"


    Bitte sehr.

    Wen wundert's - keine Überraschung. ^^

  • Revision 2017 und die Schnitzeljagd

    • UEZ
    • 2. August 2016 um 17:45

    Andy: wenn du gesagt hättest, lass' uns eine 3D Engine coden, dann hätte ich "ok, von mir aus" gesagt, aber HW Bastelei, da kann ich nicht mitreden.

    Das ist nicht meine Welt und während des Studiums hatte ich "Bastelei" nicht besonders gemocht. Nichtsdestotrotz, wenn ich irgendwie unterstützen kann, dann gerne. :D

    Idee ist trotzdem interessant. :rock:

  • Battle: Autoit vs. FreeBasic - Runde 1+2+3

    • UEZ
    • 31. Juli 2016 um 12:32
    Zitat von Andy

    BTT, wann kommt der 2. Teil von "AutoIt vs FreeBasic"

    Ich muss mal sehen, was in AutoIt so einigermaßen läuft. Dieses Beispiel mit 1000 Pixel bei 15 FPS ist recht ordentlich für AutoIt Verhältnisse, wobei der Effekt erst ab 5000 Pixel zur Geltung kommt.

    Wer ist der Gewinner von Runde 1? ;)

  • Battle: Autoit vs. FreeBasic - Runde 1+2+3

    • UEZ
    • 30. Juli 2016 um 21:33

    Leider gibt es keinen Lead Coder mehr und dadurch ist die Entwicklung stehengeblieben :( . Es werden i.d.R. nur Bugs gefixt, aber sonst passiert leider nichts mehr und wie es aussieht, wird auch nicht mehr viel passieren.

    Jon hat andere Interessen und die Community "dümpelt" vor sich hin.

    Wer mit grafischen Spielereien zu tun hat, wird schnell feststellen, dass die Grenzen von AutoIt sehr schnell erreicht werden können. Das impliziert, ja sogar schreit förmlich, nach Methoden, um die Rechenoperation zu beschleunigen.
    Eine Variante ist Inline ASM, eine andere zeitkritische Berechnungen in eine DLL auszulagern. Da Frage ich mich, warum ich nicht gleich komplett umsteigen soll, z.B. die "brotlose Kunst" gleich in FB zu schreiben.

    Je mehr ich mit FB arbeite, desto mehr gefällt es mir, denn FB hat mehr oder weniger alles, was man benötigt. Man kann auch andere Kompiler einbinden, z.B. wie bereits oben erwähnt wurde LLVM-IR.

    Ich werde wohl den grafischen Schnick-Schnack nur noch in FB coden, denn außer GDI / GDI+ sind auch andere Schnittstellen, wie OpenGL implementiert + Inline ASM.

  • Battle: Autoit vs. FreeBasic - Runde 1+2+3

    • UEZ
    • 29. Juli 2016 um 10:54
    Zitat von Xorianator

    Meinst du das von FB im Falle von MT, oder meinst du es ist nicht ganz trivial, das mit Threads umzusetzen?

    Ich denke, dass MT generell nicht ganz einfach ist, da der Speicher, muss R/W fähig sein, zwischen den Threads geshared sein muss. Ich weiß, dass Eukalyptus ein sehr gutes MT Beispiel in FB gepostet hatte, das ein Bild in Graustufen umwandelt. Mein Partikel Beispiel ist im Prinzip sehr ähnlich, da die ARGB Werte direkt in die Bitmap geschrieben werden, ohne den Gebrauch von API Funktionen.

    Das MT Beispiel im FB Forum ist ein super Beispiel, wie MT nicht gecodet werden sollte. :D

  • Battle: Autoit vs. FreeBasic - Runde 1+2+3

    • UEZ
    • 29. Juli 2016 um 10:40

    Xorianator: an Multi Threading hatte ich auch schon gedacht, aber das Memory Management ist nicht immer ganz trivial, deswegen die Threads im FB Forum.

    Mal sehen, ob's klappen wird...

  • Battle: Autoit vs. FreeBasic - Runde 1+2+3

    • UEZ
    • 29. Juli 2016 um 09:07
    Zitat von chip

    Mal eine ernstgemeinte Frage, was für ein Sinn hat ein Vergleich zwischen Äpfeln (Compiler) und Birnen (Interpreter)?

    Nun ja, beides ist Obst. ^^

    Natürlich ist der Vergleich nicht fair, sondern sehr unfair, aber ich wollte nur zeigen, was bei annähernd gleichem Code Aufbaus für ein extremer Unterschied sein kann. Das Ganze relativiert sich ein wenig, wenn viele DLL Calls stattfinden, wo die Ausführungszeit des Aufrufs eher das Problem ist, z.B. bei GDI+ Funktionen, dann ist der Unterschied nicht mehr so krass.

    Man könnte AutoIt pimpen, was Andy bereits erwähnte, gewisse Funktionen in ASM, am besten gleich als MMX/SSE, zu coden. Ich wette, dann würde der Unterschied sich wieder relativieren.

    Die Frage stellt sich dann, warum "durch die Brust ins Auge"?

  • Battle: Autoit vs. FreeBasic - Runde 1+2+3

    • UEZ
    • 28. Juli 2016 um 22:51
    Zitat von alpines

    Das hat man davon das die AutoIt-Entwickler neue Features hinzufügen und keinen effizienten Code produzieren.

    AutoIt ist auch für solche "Spielereien" nicht gemacht worden. ;)

    Leider ist die Au3 Entwicklung eingeschlafen bzw. innovative Ideen wurden abgelehnt. Mal sehen, was da noch kommen wird...

  • Battle: Autoit vs. FreeBasic - Runde 1+2+3

    • UEZ
    • 28. Juli 2016 um 22:45
    Zitat von alpines

    Ich vermute mal gaanz vage und vorsichtig das es daran liegen könnte das AutoIt3 interpretiert und nicht compiliert wird.

    Nichtsdestotrotz ist das Verhältnis "Anzahl der Partikel" 25:1 und trotzdem liegt AutoIt weit hinten!

    Selbst bei 100.000 Pixel sinkt die FPS nur auf 48 FPS! 8o

  • Battle: Autoit vs. FreeBasic - Runde 1+2+3

    • UEZ
    • 28. Juli 2016 um 20:49

    Da ich seit einigen Wochen FreeBasic (FB) lerne, wollte ich AutoIt mit FreeBasic in Bezug auf GDI / GDI+ Geschwindigkeit testen.
    Ich weiß, dass dies ein Vergleich David gegen Goliath ist, aber man sieht den krassen Unterschied.


    Runde1 -> GDI Particles Mouse Attraction:

    FB: 25.000 Partikel @ 1024x768
    Au3: 1.000 Partikel @ 800x600.


    AU3:

    AutoIt
    ;coded by UEZ build 2016-07-28
    ;idea taken from http://jsdo.it/FumioNonaka/jQcv
    #pragma compile(Icon, "c:\Program Files (x86)\AutoIt3\Icons\au3.ico")
    #AutoIt3Wrapper_Run_Au3Stripper=y
    #Au3Stripper_Parameters=/so /pe /rm
    #AutoIt3Wrapper_Run_After=del /f /q "%scriptdir%\%scriptfile%_stripped.au3"
    #include <GUIConstantsEx.au3>
    #include <WinAPIGdi.au3>
    #include <WindowsConstants.au3>
    AutoItSetOption("MouseCoordMode", 2)
    AutoItSetOption("MustDeclareVars", 1)
    Global $hGUI, $iFPS = 0, $iShowFPS = 0, $bExit
    Global Const $iW = 800, $iH = 600, $iParticles = 1000, $sTitle = "GDI Particles Mouse Attraction / Particles: " & $iParticles & " / FPS: "
    Global $i, $iMouseX = $iW / 2, $iMouseY = $iH / 2
    Global $tParticles = DllStructCreate( _
    		"float x[" & $iParticles & "];" & _
    		"float y[" & $iParticles & "];" & _
    		"float vx[" & $iParticles & "];" & _
    		"float vy[" & $iParticles & "];" & _
    		"float friction[" & $iParticles & "];" & _
    		"uint color[" & $iParticles & "]")
    For $i = 1 To $iParticles
    	With $tParticles
    		.x(($i)) = Random() * $iW
    		.y(($i)) = Random() * $iH
    		.friction(($i)) = 0.975
    ;~ 		.color(($i)) = 0xFF000000 + Int(Random() * 0xFFFFFF)
    		.color(($i)) = 0xFFFFFFFF
    	EndWith
    Next
    AutoItSetOption("GUIOnEventMode", 1)
    GDI_BurstingParticlesAnimation()
    AutoItSetOption("GUIOnEventMode", 0)
    Func GDI_BurstingParticlesAnimation()
    	$hGUI = GUICreate($sTitle & "0", $iW, $iH)
    	Local Const $hDC = _WinAPI_GetDC($hGUI)
    	Local $pBits, $tBIV5HDR = DllStructCreate($tagBITMAPV5HEADER)
    	ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $tagBITMAPV5HEADER = ' & $tagBITMAPV5HEADER & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    	With $tBIV5HDR
    		.bV5Size = DllStructGetSize($tBIV5HDR)
    		.bV5Width = $iW
    		.bV5Height = -$iH
    		.bV5Planes = 1
    		.bV5BitCount = 32
    		.bV5Compression = $BI_RGB
    		.bV5RedMask = 0x00FF0000
    		.bV5GreenMask = 0x0000FF00
    		.bV5BlueMask = 0x000000FF
    		.bV5AlphaMask = 0xFF000000
    	EndWith
    	Local Const $hBitmapGDI = _WinAPI_CreateDIBSection($hDC, $tBIV5HDR, $DIB_RGB_COLORS, $pBits)
    	Global $tBitmap = DllStructCreate("uint px[" & $iW * $iH & "]", $pBits)
    	Local Const $hGfxDC = _WinAPI_CreateCompatibleDC($hDC)
    	Local Const $hObjOld = _WinAPI_SelectObject($hGfxDC, $hBitmapGDI)
    	GUISetState(@SW_SHOW, $hGUI)
    	$bExit = False
    	GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    	AdlibRegister("CalcFPS", 1000)
    	Local $iX, $iY
    	Do
    		_WinAPI_BitBlt($hGfxDC, 0, 0, $iW, $iH, $hGfxDC, 0, 0, $BLACKNESS)
    		For $i = 1 To $iParticles
    			MoveParticles(MouseGetPos(0), MouseGetPos(1), $i)
    			$iX = Int($tParticles.x(($i)))
    			$iY = Int($tParticles.y(($i))) * $iW
    			$tBitmap.px(($iY + $iX)) = $tParticles.color(($i)) ;write directly to the bitmap (one pixel)
    		Next
    		_WinAPI_BitBlt($hDC, 0, 0, $iW, $iH, $hGfxDC, 0, 0, $SRCCOPY)
    		$iFPS += 1
    		If $bExit Then ExitLoop
    	Until Not Sleep(10)
    	_WinAPI_SelectObject($hGfxDC, $hObjOld)
    	_WinAPI_ReleaseDC($hGUI, $hDC)
    	_WinAPI_DeleteDC($hGfxDC)
    	_WinAPI_DeleteObject($hBitmapGDI)
    	GUIDelete($hGUI)
    EndFunc   ;==>GDI_BurstingParticlesAnimation
    Func _Exit()
    	$bExit = True
    EndFunc   ;==>_Exit
    Func CalcFPS() ;display FPS
    	$iShowFPS = $iFPS
    	$iFPS = 0
    	WinSetTitle($hGUI, "", $sTitle & $iShowFPS)
    EndFunc   ;==>CalcFPS
    Func MoveParticles($fX, $fY, $iPos, $fSpeed = 100)
    	Local $_x, $_y, $_vx, $_vy, $fDiffX, $fDiffY, $fSquare, $fRatio, $fAccX, $fAccY
    	$_x = $tParticles.x(($iPos))
    	$_y = $tParticles.y(($iPos))
    	$_vx = $tParticles.vx(($iPos))
    	$_vy = $tParticles.vy(($iPos))
    	$fDiffX = $fX - $_x
    	$fDiffY = $fY - $_y
    	$fSquare = ($fDiffX * $fDiffX + $fDiffY * $fDiffY)
    	$fRatio = $fSquare > 0 ? $fSpeed / $fSquare : 0
    	$fAccX = $fDiffX * $fRatio
    	$fAccY = $fDiffY * $fRatio
    	$_vx += $fAccX
    	$_vy += $fAccY
    	$_vx *= $tParticles.friction(($iPos))
    	$_vy *= $tParticles.friction(($iPos))
    	$_x += $_vx
    	$_y += $_vy
    	If $_x < 0 Then $_x += $iW
    	If $_x > $iW Then $_x -= $iW
    	If $_y < 0 Then $_y += $iH
    	If $_y > $iH Then $_y -= $iH
    	$tParticles.x(($iPos)) = $_x
    	$tParticles.y(($iPos)) = $_y
    	$tParticles.vx(($iPos)) = $_vx
    	$tParticles.vy(($iPos)) = $_vy
    EndFunc   ;==>MoveParticles
    Alles anzeigen

    FB:

    C
    'coded by UEZ build 2016-07-28
    'idea taken from http://jsdo.it/FumioNonaka/jQcv
    
    
    #include "windows.bi"
    #include "fbgfx.bi"
    Using FB
    
    
    
    
    Type tParticles
    	x As Single
    	y As Single
    	vx As Single
    	vy As Single
    	friction As Single
    	argb As UInteger
    End Type
    
    
    Dim Shared As ULong iW = 1024, iH = 768, iParticles = 25000
    Dim Shared aParticles(0 To iParticles - 1) As tParticles
    
    
    Sub MoveParticles(fX As Single, fY As Single, iPos As ULong, fSpeed As Single)
    	Dim As Single _x, _y, _vx, _vy, fDiffX, fDiffY, fSquare, fRatio, fAccX, fAccY
    	_x = aParticles(iPos).x
    	_y = aParticles(iPos).y
    	_vx = aParticles(iPos).vx
    	_vy = aParticles(iPos).vy
    	fDiffX = fX - _x
    	fDiffY = fY - _y
    	fSquare = (fDiffX * fDiffX + fDiffY * fDiffY)
    	fRatio = IIf(fSquare > 0, fSpeed / fSquare, 0)
    	fAccX = fDiffX * fRatio
    	fAccY = fDiffY * fRatio
    	_vx += fAccX
    	_vy += fAccY
    	_vx *= aParticles(iPos).friction
    	_vy *= aParticles(iPos).friction
    	_x += _vx
    	_y += _vy
    	If _x < 0 Then _x += iW
    	If _x > iW Then _x -= iW
    	If _y < 0 Then _y += iH
    	If _y > iH Then _y -= iH
    	aParticles(iPos).x = _x
    	aParticles(iPos).y = _y
    	aParticles(iPos).vx = _vx
    	aParticles(iPos).vy = _vy
    End Sub
    
    
    
    
    ScreenControl FB.SET_DRIVER_NAME, "GDI"
    ScreenRes iW, iH, 32
    
    
    Dim As String sTitle = "GDI Particles Mouse Attraction / Particles: " & iParticles & " / FPS: "
    WindowTitle sTitle
    
    
    Dim as HWND hHWND
    ScreenControl(FB.GET_WINDOW_HANDLE, Cast(integer, hHWND))
    
    
    Dim As HDC hDC = GetDC(hHWND)
    
    
    Dim As BITMAPV5HEADER tBIV5HDR
    tBIV5HDR.bV5Size = SizeOf(BITMAPV5HEADER)
    tBIV5HDR.bV5Width = iW
    tBIV5HDR.bV5Height = -iH
    tBIV5HDR.bV5Planes = 1
    tBIV5HDR.bV5BitCount = 32
    tBIV5HDR.bV5Compression = BI_RGB
    tBIV5HDR.bV5AlphaMask = &hFF000000
    tBIV5HDR.bV5RedMask = 	&h00FF0000
    tBIV5HDR.bV5GreenMask = &h0000FF00
    tBIV5HDR.bV5BlueMask = 	&h000000FF
    
    
    Dim As UInteger Ptr aBits
    Dim As HBitmap hBitmapGDI
    Dim As HDC hGfxDC
    
    
    hBitmapGDI = CreateDIBSection(hDC, @tBIV5HDR, DIB_RGB_COLORS, @aBits, NULL, NULL)
    hGfxDC = CreateCompatibleDC(hDC)
    Var hObjOld = SelectObject(hGfxDC, hBitmapGDI)
    
    
    
    
    
    
    Dim evt As EVENT
    Dim As ULong iFPS = 0, i, iMPx = iW / 2, iMPy = iH / 2, iPos, iMax = iW * iH - 1
    
    
    Dim fTimer As Double
    
    
    For i = 0 To iParticles - 1
    	aParticles(i).x = Rnd() * iW
    	aParticles(i).y = Rnd() * iH
    	aParticles(i).friction = 0.975
    	aParticles(i).argb = &hFFFFFFFF
    Next
    
    
    fTimer = Timer
    
    
    Do
    	BitBlt(hGfxDC, 0, 0, iW, iH, hGfxDC, 0, 0, BLACKNESS)
    	GetMouse(iMPx, iMPy)
    	For i = 0 To iParticles - 1
    		MoveParticles(iMPx, iMPy, i, 100)
    		iPos = Int(aParticles(i).x) + Int(aParticles(i).y) * iW
    		If iPos > iMax Then iPos = iMax
    		aBits[iPos] = aParticles(i).argb
    	Next
    	BitBlt(hDC, 0, 0, iW, iH, hGfxDC, 0, 0, SRCCOPY)
    	If Timer - fTimer > 1 Then
    		WindowTitle sTitle & iFPS
    		iFPS = 0
    		fTimer = Timer
    	EndIf
    	iFPS += 1
    	'If GetKey = 27 Then Exit Do
    	If (ScreenEvent(@evt)) Then
    		If evt.type = EVENT_WINDOW_CLOSE Or evt.type = SC_ESCAPE Then 
    			SelectObject(hGfxDC, hObjOld)
    			ReleaseDC(hHWND, hDC)
    			DeleteDC(hGfxDC)
    			DeleteObject(hBitmapGDI)
    			Exit Do
    		EndIf
    	EndIf
    	Sleep(10)
    Loop
    Alles anzeigen


    Der Code Aufbau sollte in beiden Sprachen relativ identisch sein (GDI). Die Exe starten und mit der Maus auf der GUI hin und her fahren.


    Ergebnis:
    Autoit @ 1000 Pixel: ~14 FPS
    FB @ 25000 Pixel: ~64 FPS (limitiert, da Sleep verwendet wird)

    Krass!


    Runde2 -> Mandelbrot:

    Au3:

    AutoIt
    ;coded by UEZ build 2016-08-04
    ;idea taken from http://rosettacode.org/wiki/Mandelbrot_set#C.23 / JS version
    
    
    #AutoIt3Wrapper_Compile_Both=y
    #pragma compile(Icon, "c:\Program Files (x86)\AutoIt3\Icons\au3.ico")
    #AutoIt3Wrapper_Run_Au3Stripper=y
    #Au3Stripper_Parameters=/so /pe /rm
    #AutoIt3Wrapper_Run_After=del /f /q "%scriptdir%\%scriptfile%_stripped.au3"
    
    
    #include <GUIConstantsEx.au3>
    #include <WinAPIGdi.au3>
    #include <WindowsConstants.au3>
    
    
    AutoItSetOption("MouseCoordMode", 2)
    AutoItSetOption("MustDeclareVars", 1)
    
    
    Global $hGUI, $bExit
    Global Const $iW = 1000, $iH = 600, $sTitle = "GDI Mandelbrot / Took "
    
    
    
    
    AutoItSetOption("GUIOnEventMode", 1)
    Global $iDetails = 100, $iDisplayFrequency = 100
    
    
    Mandelbrot(-2, 1, -1, 1, $iDetails, $iDisplayFrequency)
    
    
    
    
    AutoItSetOption("GUIOnEventMode", 0)
    
    
    
    
    Func Mandelbrot($xmin, $xmax, $ymin, $ymax, $iterations, $iDisplayFrequency = 100)
    	$iDisplayFrequency = $iDisplayFrequency < 1 ? 1 : $iDisplayFrequency > $iH / 2 ? $iH / 2 : $iDisplayFrequency
    
    
    	$hGUI = GUICreate($sTitle & "...", $iW, $iH)
    	Local Const $hDC = _WinAPI_GetDC($hGUI)
    	Local $pBits, $tBIV5HDR = DllStructCreate($tagBITMAPV5HEADER)
    
    
    	With $tBIV5HDR
    		.bV5Size = DllStructGetSize($tBIV5HDR)
    		.bV5Width = $iW
    		.bV5Height = -$iH
    		.bV5Planes = 1
    		.bV5BitCount = 32
    		.bV5Compression = $BI_BITFIELDS
    		.bV5RedMask = 0x00FF0000
    		.bV5GreenMask = 0x0000FF00
    		.bV5BlueMask = 0x000000FF
    		.bV5AlphaMask = 0xFF000000
    	EndWith
    
    
    	Local Const $hBitmapGDI = _WinAPI_CreateDIBSection($hDC, $tBIV5HDR, $DIB_RGB_COLORS, $pBits)
    	Global $tBitmap = DllStructCreate("uint px[" & $iW * $iH & "]", $pBits)
    
    
    	Local Const $hGfxDC = _WinAPI_CreateCompatibleDC($hDC)
    	Local Const $hObjOld = _WinAPI_SelectObject($hGfxDC, $hBitmapGDI)
    	GUISetState(@SW_SHOW, $hGUI)
    
    
    	$bExit = False
    	GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    
    
    	Local $iX, $iY, $i, $ppos, $c, $x, $y
    
    
    	Local $fEnd, $fTimer = TimerInit()
    
    
    	For $iY = 0 To $iH - 1
    		For $iX = 0 To $iW - 1
    			$x = $xmin + ($xmax - $xmin) * $iX / ($iW - 1)
    			$y = $ymin + ($ymax - $ymin) * $iY / ($iH - 1)
    			$i = MandelIter($x, $y, $iterations)
    			$ppos = ($iW * $iY + $iX)
    
    
    			If ($i > $iterations) Then
    				$tBitmap.px(($ppos)) = 0xFF000000
    			Else
    				$c = 3 * Log($i) / Log($iterations - 1.0)
    				If ($c < 1) Then
    					$tBitmap.px(($ppos)) = 0xFF000000 + BitShift(Int(255 * $c), -16)
    				ElseIf ($c < 2) Then
    					$tBitmap.px(($ppos)) = 0xFF000000 + BitShift(255, -16) + BitShift(Int(255 * ($c - 1)), -8)
    				Else
    					$tBitmap.px(($ppos)) = 0xFFFFFF00 + (Int(255 * ($c - 2)))
    				EndIf
    			EndIf
    		Next
    		If Not Mod($iY, $iDisplayFrequency) Then
    			_WinAPI_BitBlt($hDC, 0, 0, $iW, $iH, $hGfxDC, 0, 0, $SRCCOPY)
    			ConsoleWrite(Round($iY / $iH * 100, 2) & "%" & @CRLF)
    		EndIf
    	Next
    	_WinAPI_BitBlt($hDC, 0, 0, $iW, $iH, $hGfxDC, 0, 0, $SRCCOPY)
    
    
    	$fEnd = TimerDiff($fTimer)
    
    
    	WinSetTitle($hGUI, "", $sTitle & $fEnd / 1000 & " seconds to render.")
    
    
    	Do
    		If $bExit Then ExitLoop
    	Until Not Sleep(100)
    
    
    	_WinAPI_SelectObject($hGfxDC, $hObjOld)
    	_WinAPI_ReleaseDC($hGUI, $hDC)
    	_WinAPI_DeleteDC($hGfxDC)
    	_WinAPI_DeleteObject($hBitmapGDI)
    	GUIDelete($hGUI)
    EndFunc   ;==>Mandelbrot
    
    
    Func _Exit()
    	$bExit = True
    EndFunc   ;==>_Exit
    
    
    Func MandelIter($cx, $cy, $maxIter)
    	Local $x = 0.0, $y, $xx, $yy, $xy, $i = $maxIter
    	While ($xx + $yy <= 4 And $i > 0)
    		$xy = $x * $y
    		$xx = $x * $x
    		$yy = $y * $y
    		$x = $xx - $yy + $cx
    		$y = $xy + $xy + $cy
    		$i -= 1
    	WEnd
    	Return $maxIter - $i
    EndFunc   ;==>MandelIter
    Alles anzeigen

    FB:

    C
    'coded by UEZ build 2016-08-04
    'idea taken from http://rosettacode.org/wiki/Mandelbrot_set#C.23 / JS version
    
    
    #include "windows.bi"
    #include "fbgfx.bi"
    Using FB
    
    
    Declare Function mandelIter(cx As Single, cy As Single, maxIter As ULong) As ULong
    Declare Sub Mandelbrot(xmin As Single, xmax As Single, ymin As Single, ymax As Single, iterations As ULong, iDisplayFrequency As ULong = 100)
    
    
    Dim As Integer sW, sH
    ScreenInfo(sW, sH)
    
    
    Dim Shared As ULong iW, iH
    
    
    iW = 1000 'Int(sW * 0.95)
    iH = 600 'Int(sH * 0.90)
    
    
    ScreenControl FB.SET_DRIVER_NAME, "GDI"
    ScreenRes iW, iH, 24
    
    
    Dim As String sTitle = "GDI Mandelbrot"
    WindowTitle sTitle
    
    
    Dim as HWND hHWND
    ScreenControl(FB.GET_WINDOW_HANDLE, Cast(Integer, hHWND))
    
    
    Dim Shared As HDC hDC
    hDC = GetDC(hHWND)
    
    
    Dim As BITMAPV5HEADER tBIV5HDR
    tBIV5HDR.bV5Size = SizeOf(BITMAPV5HEADER)
    tBIV5HDR.bV5Width = iW
    tBIV5HDR.bV5Height = -iH
    tBIV5HDR.bV5Planes = 1
    tBIV5HDR.bV5BitCount = 32
    tBIV5HDR.bV5Compression = BI_BITFIELDS
    tBIV5HDR.bV5AlphaMask = &hFF000000
    tBIV5HDR.bV5RedMask = 	&h00FF0000
    tBIV5HDR.bV5GreenMask = &h0000FF00
    tBIV5HDR.bV5BlueMask = 	&h000000FF
    
    
    Dim Shared As ULong Ptr aBits
    Dim As HBitmap hBitmapGDI
    Dim Shared As HDC hGfxDC
    
    
    hBitmapGDI = CreateDIBSection(hDC, @tBIV5HDR, DIB_RGB_COLORS, @aBits, NULL, NULL)
    hGfxDC = CreateCompatibleDC(hDC)
    Var hObjOld = SelectObject(hGfxDC, hBitmapGDI)
    
    
    Dim evt As EVENT
    Dim As ULong iFPS = 0, i, iMax = iW * iH - 1 , iX, iY, iARGB
    
    
    
    
    Dim As Double fTimer, fEnd
    
    
    fTimer = Timer
    Mandelbrot(-2, 1, -1, 1, 5000, 100)
    fEnd = Timer - fTimer
    WindowTitle sTitle  & " / Took " & fEnd & " seconds to render."
    
    
    Do
    	If (ScreenEvent(@evt)) Then
    		Select Case evt.Type 
    			Case SC_ESCAPE, EVENT_WINDOW_CLOSE
    				SelectObject(hGfxDC, hObjOld)
    				ReleaseDC(hHWND, hDC)
    				DeleteDC(hGfxDC)
    				DeleteObject(hBitmapGDI)
    				Exit Do
    		End Select
    	EndIf
    	Sleep(60)
    Loop
    
    
    Sub Mandelbrot(xmin As Single, xmax As Single, ymin As Single, ymax As Single, iterations As ULong, iDisplayFrequency As ULong = 100)
    	Dim As ULong i, ppos
    	Dim As Double c, x, y
    	Dim As ULong iX, iY
    	For iY = 0 To iH - 1
    		For iX = 0 To iW - 1
    
    
    			x = xmin + (xmax - xmin) * iX / (iW - 1)
    			y = ymin + (ymax - ymin) * iY / (iH - 1)
    			i = mandelIter(x, y, iterations)
    			ppos = (iW * iY + iX)
    			If (i > iterations) Then
    				aBits[ppos] = &hFF000000
    			Else
    				c = 3 * Log(i) / Log(iterations - 1.0)
    				If (c < 1) Then
    					aBits[ppos] = &hFF000000 + (Int(255 * c) Shl 16)
    				ElseIf ( c < 2 ) Then
    					aBits[ppos] = &hFF000000 + (255 Shl 16) + (Int(255 * (c - 1)) Shl 8) 
    				Else
    					aBits[ppos] = &hFFFFFF00 + (Int(255 * (c - 2)))
    				EndIf
    			EndIf
    		Next
    		If iY Mod iDisplayFrequency = 0 Then BitBlt(hDC, 0, 0, iW, iH, hGfxDC, 0, 0, SRCCOPY)
    	Next
    	BitBlt(hDC, 0, 0, iW, iH, hGfxDC, 0, 0, SRCCOPY)
    End Sub
    
    
    Function mandelIter(cx As Single, cy As Single, maxIter As ULong) As ULong
    	Dim As Single x = 0.0, y, xx, yy, xy 
    	Dim As ULong i = maxIter
    	While (xx + yy <= 4 And i > 0)
    		xy = x * y
    		xx = x * x
    		yy = y * y
    		x = xx - yy + cx
    		y = xy + xy + cy
    		i -= 1
    	Wend
    	Return maxIter - i
    End Function
    Alles anzeigen

    AU3: ~107 Sekunden @100
    FB: ~0.30 Sekunden @100, 1,7s @1000, 7,8s @5000 und 14,6s @10000.

    Falls ihr Au3 mit $iDetails = 1000 ausprobieren wollt, dann macht euch vorher einen Kaffee, den ihr langsam und genüsslich trinken könnt oder falls ihr Raucher seid, dann raucht am besten eine dicke fette Zigarre :!:


    Runde3 -> GDI+ Performance Test:

    Au3:

    AutoIt
    ;coded by UEZ in 2016-08-05
    
    
    #AutoIt3Wrapper_Compile_Both=y
    #pragma compile(Icon, "c:\Program Files (x86)\AutoIt3\Icons\au3.ico")
    #AutoIt3Wrapper_Run_Au3Stripper=y
    #Au3Stripper_Parameters=/so /pe /rm
    #AutoIt3Wrapper_Run_After=del /f /q "%scriptdir%\%scriptfile%_stripped.au3"
    
    
    #include <GDIPlus.au3>
    
    
    
    
    Global Const $iW = 1000, $iH = 600, $sTitle = "GDI+ Performance Test / "
    Global Const $hGUI = GUICreate($sTitle, $iW, $iH)
    GUISetState()
    
    
    _GDIPlus_Startup()
    Global Const $hCanvas = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    _GDIPlus_GraphicsSetSmoothingMode($hCanvas, 4)
    Global Const $hPen = _GDIPlus_PenCreate(0xFF000000)
    _GDIPlus_GraphicsClear($hCanvas)
    
    
    Global $i, $fX1, $fY1, $fX2, $fY2, $iRounds = 20000
    
    
    Global $fEnd, $fTimer = TimerInit()
    
    
    For $i = 1 To $iRounds
    	$fX1 = Random() * $iW
    	$fX2 = Random() * $iW
    	$fY1 = Random() * $iH
    	$fY2 = Random() * $iH
    	_GDIPlus_PenSetColor($hPen, 0xFF000000 + Int(Random() * 0xFFFFFF))
    	_GDIPlus_GraphicsDrawLine($hCanvas, $fX1, $fY1, $fX2, $fY2, $hPen)
    Next
    
    
    $fEnd = TimerDiff($fTimer)
    
    
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_GraphicsDispose($hCanvas)
    _GDIPlus_Shutdown()
    
    
    WinSetTitle($hGUI, "", $sTitle  & "Created " & $iRounds & " lines in " & Round($fEnd, 2) & " ms.")
    
    
    Do
    Until GUIGetMsg() = -3
    Alles anzeigen


    FB:

    C
    'coded by UEZ in 2016-08-05
    #Include "win\gdiplus.bi"
    #include "fbgfx.bi"
    #include "windows.bi"
    
    
    Using FB
    Using GDIPLUS
    
    
    Dim Shared As ULong iW, iH
    iW = 1000
    iH = 600
    Dim As String sTitle = "GDI+ Performance Test / "
    
    
    ScreenControl FB.SET_DRIVER_NAME, "GDI"
    ScreenRes iW, iH, 32
    WindowTitle sTitle
    
    
    Dim evt As EVENT
    
    
    Dim as HWND hHWND
    ScreenControl(FB.GET_WINDOW_HANDLE, Cast(Integer, hHWND))
    
    
    '_GDIPlus_Startup()
    Dim GDIPlusStartupInput As GDIPLUSSTARTUPINPUT 
    Dim As ULONG_PTR GDIPlusToken 
    GDIPlusStartupInput.GdiplusVersion = 1
    If (GdiplusStartup(@GDIPlusToken, @GDIPlusStartupInput, NULL) <> 0) Then 
        Print "FAILED TO INIT GDI+!" 
    EndIf 
    
    
    Dim As Any Ptr hCanvas, hPen
    
    
    GdipCreateFromHWND(hHWND, @hCanvas) '_GDIPlus_GraphicsCreateFromHWND($hGUI)
    GdipSetSmoothingMode(hCanvas, 4) '_GDIPlus_GraphicsSetSmoothingMode($hCanvas, 4)
    GdipCreatePen1(&hFF000000, 1, 2, @hPen) '_GDIPlus_PenCreate(0xFF000000)
    GdipGraphicsClear(hCanvas, &hFF000000) '_GDIPlus_GraphicsClear($hCanvas)
    
    
    Dim As Single fX1, fY1, fX2, fY2
    Dim As ULong iRounds = 20000, i
    Dim As Double fEnd, fTimer
    
    
    fTimer = Timer 'TimerInit()
    For i = 1 To iRounds
    	fX1 = Rnd() * iW
    	fX2 = Rnd() * iW
    	fY1 = Rnd() * iH
    	fY2 = Rnd() * iH
    	GdipSetPenColor(hPen, &hFF000000 + Int(Rnd() * &hFFFFFF)) '_GDIPlus_PenSetColor($hPen, 0xFF000000 + Int(Random() * 0xFFFFFF))
    	GdipDrawLine(hCanvas, hPen, fX1, fY1, fX2, fY2) '_GDIPlus_GraphicsDrawLine($hCanvas, $fX1, $fY1, $fX2, $fY2, $hPen)
    Next
    fEnd = (Timer - fTimer) * 1000 'TimerDiff($fTimer) -> FB counts in seconds not in ms!
    
    
    GdipDeletePen(hPen) '_GDIPlus_PenDispose($hPen)
    GdipDeleteGraphics(hCanvas) '_GDIPlus_GraphicsDispose($hCanvas)
    GdiplusShutdown(GDIPlusToken) '_GDIPlus_Shutdown()
    
    
    WindowTitle sTitle & "Created " & iRounds & " lines in " & fEnd & " ms."
    
    
    Do
    	'something like GUIGetMsg()
    	If (ScreenEvent(@evt)) Then
    		Select Case evt.Type 
    			Case SC_ESCAPE, EVENT_WINDOW_CLOSE
    				Exit Do
    		End Select
    	EndIf
    	Sleep(30)
    Loop
    Alles anzeigen


    Au3: ca. 16,9 Sekunden
    FB: ca. 14,5 Sekunden


    Im Anhang die Source Codes + kompilierte Exes.


    FB gefällt mir immer mehr...


    Weitere Bespiele:

    Battle GDI vs GDI+: Battle: Autoit vs. FreeBasic - Runde 1+2+3
    Animated Pythagoras Tree in GDI / GDI+ / OpenGL: Battle: Autoit vs. FreeBasic - Runde 1+2+3
    GDI Particle Repulsion Grid in GDI: Battle: Autoit vs. FreeBasic - Runde 1+2+3

    ^^

    Dateien

    Particles Mouse Attraction - Au3 vs FB.zip 495,39 kB – 720 Downloads Mandelbrot - Au3 vs FB.zip 652,63 kB – 662 Downloads GDI+ Performance Test - Au3 vs FB.zip 959,41 kB – 653 Downloads GDI Elastic Twister Effect - Au3 vs FB.zip 494,3 kB – 655 Downloads GDI Liquid Pixels.zip 317,27 kB – 701 Downloads
  • GDI+ Metadaten mit GetAllPropertyItems

    • UEZ
    • 21. Juli 2016 um 14:02

    Schaue mal hier rein: https://www.autoitscript.com/forum/topic/179451-solved-preserve-ascpect-ratio-_gdiplus/?do=findComment&comment=1287798

    Vielleicht ist es brauchbar.

  • Gdi+ Slider wollen nicht

    • UEZ
    • 18. Juli 2016 um 21:35

    Die Zeile einfach auskommentieren und dann sollte es funzen.

  • Gdi+ Slider wollen nicht

    • UEZ
    • 18. Juli 2016 um 13:23

    Ich hatte vor langer Zeit was gebastelt. Vielleicht kannst was gebrauchen:

    New Slider

    Ist seit 2013 nicht mehr weiter entwickelt.

  • Tipp Spiel zur EM 2016

    • UEZ
    • 12. Juli 2016 um 08:17
    Zitat von Alina

    Sorry UEZ, aber ich habe von Fussball so viel Ahnung wie vom Fliegen ;)

    Das macht nichts. Man(n) / Frau muss keine Ahnung haben, um Fussball Tipps abzugeben.


    Zitat von General Kaboom

    Hab ich auch nicht und dann noch verpennt die Tipps nach der Gruppenphase nachzutragen -.-'

    Das habe ich gemerkt. ;)

  • Tipp Spiel zur EM 2016

    • UEZ
    • 11. Juli 2016 um 21:10

    Gewonnen hat Techmix - herzlichen Glückwunsch!

    Das nächste Mal (WM2018) könnten ruhig ein paar mehr mittippen!

  • _GDIPlus_BitmapApplyFilter v0.9.6 build 2017-05-14 beta

    • UEZ
    • 4. Juli 2016 um 09:48

    Als nächsten Schritt werde ich versuchen die Funktionen erst mal per Threading zu beschleunigen. Mal sehen, ob's klappt und was am Ende rausspringen wird.

    Andy: danke für dein Feedback. :thumbup:

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™