CGContextRef buffer? discussie in Ontwikkelen voor iOS forum; ( verdwijnt na registratie ) hoi, ik heb al een tijdje op gezocht op google, maar ik kan niet echt iets vinden! ik ben dus bezig met een simpele game ...
|
Registreer | FAQ | Ledenlijst | Kalender | Berichten van vandaag | Zoeken |
#1
|
||||
|
||||
CGContextRef buffer?
hoi,
ik heb al een tijdje op gezocht op google, maar ik kan niet echt iets vinden! ik ben dus bezig met een simpele game aan het maken, hierbij moet je lijnen trekken (meer wil ik er nog niet over vertellen ). Dit teken ik met CGContextRef, alleen loopt het niet heel soepel (lees: totaal niet soepel). Ik had dus bedacht dat ik het misschien eerst in een buffer moet tekenen, maar ik weet dus niet hoe dat moet! Misschien heeft iemand een tip voor me? Oja, ik gebruik geen xCode, misschien handig om te weten? |
|
|
Gesponsorde links (verdwijnt na registratie)
|
#2
|
|||
|
|||
Ik weet niet precies hoe je het doet, maar ik heb ook een app gemaakt waar je lijnen moet tekenen ("Huisje-kruisje" spelletje) en dat verloopt soepel genoeg. Dat doe ik ook met Quartz. Oke, het is eigenlijk "freehand" dat je tekent, maar ik verbind de losse punten met lijnen.
Als we het over heel veel lijnen hebben, dan kun je waarschijnlijk beter OpenGL gebruiken... |
#3
|
||||
|
||||
nee, in de app wordt er van een punt een lijn getekent naar je vinger, bij elke beweging van je vinger wordt de lijn opnieuw getekend naar het nieuwe punt (setNeedsDisplay), maar het duurt heel lang totdat hij reageerd, ik had gehoopt dat dat met de dubbele buffer te maken had
anders moet ik hem gevoeliger maken, maar ik denk niet dat dat mogelijk is |
#4
|
|||
|
|||
Dit is wat mijn View (min of meer) doet:
Code:
- (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetLineJoin(context, kCGLineJoinRound); CGContextSetLineCap(context, kCGLineCapRound); CGContextSetRGBStrokeColor(context, 0.0, 0.0, 1.0, 1.0); CGContextSetLineWidth(context, 16.0); CGPoint* strokePoints = gameModel.strokePoints; for (int t = 1; t < gameModel.numStrokePoints; ++t) { CGContextMoveToPoint(context, strokePoints[t - 1].x, strokePoints[t - 1].y); CGContextAddLineToPoint(context, strokePoints[t].x, strokePoints[t].y); CGContextStrokePath(context); } // Zo kan het ook: //CGContextAddLines(context, gameModel.strokePoints, gameModel.numStrokePoints); //CGContextStrokePath(context); } |
#5
|
||||
|
||||
Citaat:
is er een manier om te kijken hoe lang het uitvoeren van een bepaald stuk code duurt? |
#6
|
|||
|
|||
Ik denk dat XCode (of anders Instruments) wel een profiler heeft. Alternatief is de tijd op te nemen aan het begin van je functie en nog een keer aan het eind en het verschil af te drukken. Neem daarvoor wel een timer die in milli- of microseconden kan rekenen, anders heeft het niet veel nut.
|
#7
|
||||
|
||||
sorry voor de off-topic bump, maar ik zie vaker die 'context' tevoorschijn komen maar kan niet mijn vinger leggen op wat het precies is. ook bekijken van voorbeeld-code maakt me niets wijzer.
Ik bedoel dan niet alleen 'context' zoals in bovenstaande voorbeeld,maar in het algemeen (zoals bijvoorbeeld in: Code:
- (void)addObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context |
#8
|
||||
|
||||
Citaat:
En xcode kan ik dus helaas niet gebruiken, omdat ik geen mac heb |
#9
|
|||
|
|||
Oh, Instruments is een tool die bij XCode zit om dingen te meten, zoals processorgebruik, memory leaks, etc.
Als je geen Mac hebt, dan zul je handmatig de tijd moeten meten. Er zijn functies in de API die het aantal milli- of microseconden teruggeven die zijn verstreken sinds de start van je applicatie. Uit mijn hoofd weet ik zo niet hoe die functie heet. |
#10
|
|||
|
|||
Dat ligt aan de API-call, want de ene keer betekent het iets anders dan de andere keer. Je doet met zo'n API-call steeds iets "in een bepaalde context". In het geval van Core Graphics geeft zo'n context bijvoorbeeld aan wat de huidige tekenkleur is en de huidige lijndikte.
|
#11
|
||||
|
||||
Heh ja dat had ik wel door (beetje zoals (id)) maar als ik bijvoorbeeld die addObserver zou gebruiken, wat zou dan een mogelijke 'context' zijn die je meegeeft? Zoeits als bijvoorbeeld 'TouchUpInside' als je een observer maakt voor een UIButton?
|
#12
|
||||
|
||||
Citaat:
maar verder over mijn probleem wat moet ik doen voor die milliseconden, hoe haal ik die op? |
#13
|
||||
|
||||
Citaat:
|
#14
|
||||
|
||||
Citaat:
Code:
- (void)drawRect:(CGRect)rect { CFTimeInterval startTime = CFAbsoluteTimeGetCurrent(); ... CFTimeInterval difference = CFAbsoluteTimeGetCurrent() - startTime; NSLog(@"Time: %d", difference); } Citaat:
0 kan überhaupt niet, hij tekent altijd wel wat en het kost echt wel wat tijd... een negatieve tijd lijkt me niet erg waarschijnlijk de andere tijd klinkt ook niet erg logisch! edit ik heb het nog eens bestudeerd, maar het valt me op dat hij eigenlijk alleen opnieuw tekent als ik mijn vinger stil hou! dit is mijn code voor het opnemen van bewegingen: Code:
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { NSLog(@"touchesMoved"); if([touches count] > 0) { UITouch* touch = [touches anyObject]; curLineEnd = [touch locationInView:self]; if([self indexOfObjectAtPoint:[touch locationInView:self]] >= 0) { if([objectsInLine indexOfObject:[NSNumber numberWithInt:[self indexOfObjectAtPoint:[touch locationInView:self]]]] == NSNotFound) { if([self indexOfObjectAtPoint:curLineEnd] != [self indexOfObjectAtPoint:curLineStart]) { [objectsInLine addObject:[NSNumber numberWithInt:[self indexOfObjectAtPoint:[touch locationInView:self]]]]; curLineStart = [self centerOfObjectAtIndex:[self indexOfObjectAtPoint:[touch locationInView:self]]]; } lineIsWrong = NO; } else { lineIsWrong = YES; } } else { lineIsWrong = NO; } [self setNeedsDisplay]; } NSLog(@"touchesMoved: done"); } Laatst gewijzigd door libia; 12-05-09 om 18:13. |
#15
|
||||
|
||||
Citaat:
(maw in jip-en-janneke taal...) Ik vraag het wel ergens anders als ik er te lang mee blijf lopen... Succes met jouw probleem in ieder geval. |
#16
|
||||
|
||||
Citaat:
bedankt! |
#17
|
|||
|
|||
|
#18
|
||||
|
||||
Citaat:
bedankt iig edit afgerond is het nu steeds 0.1, dit lijkt me niet heel veel toch? Volgens mij tekent hij het steeds pas als ik mijn vinger stil hou, hoe doen de teken apps het dan? Oftewel: hoe kan ik zorgen dat hij sneller achter elkaar mijn vingerpositie leest? Laatst gewijzigd door libia; 13-05-09 om 16:49. |
#19
|
||||
|
||||
Heeft iemand een idee hoe ik kan zorgen dat er vaker een event wordt gestuurd?
|
#20
|
|||
|
|||
Doe je nog iets anders je in main run loop? Ik vind het maar raar dat hij zo langzaam hertekent bij jou. Heb je een timer die heel druk van alles aan het doen is of zo?
Je kunt proberen je tekencode weg te halen en kijken hoeveel events je dan binnenkrijgt. Als dat niets uitmaakt, in je touches handler alle code weghalen en kijken hoeveel events hij dan doorstuurt. Probeer het probleem te isoleren. |
Er zijn 1 actieve gebruikers die momenteel deze discussie bekijken (0 leden en 1 gasten) |
|
Soortgelijke discussies |
||||
Discussie | Auteur | Forum | Reacties | Laatste bericht |
Apple TV: Apple TV 2 XBMC buffer probleempje | youri1311 | Jailbreak | 17 | 24-06-11 11:19 |
Windows: Potentiële buffer overflow in iTunes 7.6 + QuickTime | O.G. | iTunes | 0 | 19-02-08 14:38 |
|
|