iCulture forum | iPhone, iPad,  iPod touch, Apple TV en iOS

iCulture forum | iPhone, iPad, iPod touch, Apple TV en iOS (https://forum.iculture.nl/)
-   Ontwikkelen voor iOS (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/)
-   -   CGContextRef buffer? (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/34004-cgcontextref-buffer.html)

libia 11-05-09 15:35

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?

gekkepietje 11-05-09 16:54

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...

libia 11-05-09 17:33

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

gekkepietje 11-05-09 17:43

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);
}


libia 11-05-09 19:15

Citaat:

Oorspronkelijk geplaatst door gekkepietje (Bericht 285569)
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);
}


ik zie niet echt een verschil, alleen dat ik iets meer code heb.. maar dat zou het niet zo langzaam mogen maken!
is er een manier om te kijken hoe lang het uitvoeren van een bepaald stuk code duurt?

gekkepietje 11-05-09 20:19

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.

Malork 11-05-09 22:33

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
zou iemand mij daar eens een licht op kunnen schijnen? Alvast bedankt en sorry voor de OT (vond het onnodig om er een nieuw topic over te maken).

libia 11-05-09 23:21

Citaat:

Oorspronkelijk geplaatst door gekkepietje (Bericht 285653)
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.

Wat is instruments? En wat is de beste manier om de tijd te meten?
En xcode kan ik dus helaas niet gebruiken, omdat ik geen mac heb

gekkepietje 12-05-09 08:50

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.

gekkepietje 12-05-09 08:52

Citaat:

Oorspronkelijk geplaatst door Malork (Bericht 285730)
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.

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.

Malork 12-05-09 11:36

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?

libia 12-05-09 16:34

Citaat:

Oorspronkelijk geplaatst door Malork (Bericht 285827)
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?

dan moet je ff in apple class reference kijken ;)

maar verder over mijn probleem :)
wat moet ik doen voor die milliseconden, hoe haal ik die op?

ideveloper 12-05-09 16:46

Citaat:

Oorspronkelijk geplaatst door libia (Bericht 285918)
maar verder over mijn probleem :)
wat moet ik doen voor die milliseconden, hoe haal ik die op?

Misschien heb je hier wat aan Determining Elapsed Time

libia 12-05-09 17:10

Citaat:

Oorspronkelijk geplaatst door ideveloper (Bericht 285923)
Misschien heb je hier wat aan Determining Elapsed Time

ik heb het geprobeerd:
Code:

- (void)drawRect:(CGRect)rect
{
    CFTimeInterval startTime = CFAbsoluteTimeGetCurrent();

    ...

    CFTimeInterval difference = CFAbsoluteTimeGetCurrent() - startTime;
    NSLog(@"Time: %d", difference);
}

en dit zijn de tijden die ik krijg:
Citaat:

Time: 0
Time: -2147483648
Time: 1073741824
Time: 0
Time: -2147483648
Time: 0
(bij een kleine test, wat aanrakingen gedaan (omdat het daardoor langer hoort te duren.))

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");
}


Malork 12-05-09 17:13

Citaat:

Oorspronkelijk geplaatst door libia (Bericht 285918)
dan moet je ff in apple class reference kijken ;)

maar verder over mijn probleem :)
wat moet ik doen voor die milliseconden, hoe haal ik die op?

Ik snap 'm; ik zal je topic niet vervuilen ;). Btw in de class reference wordt ik niet wijzer zoals aangegeven. Ik snap wel dat het wijzigt per methode maar ik krijg het begrip 'context' nog niet 'in een hokje geplaatst' en in mijn Cocoa-boeken staat het ook niet echt...
(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.

libia 12-05-09 17:18

Citaat:

Oorspronkelijk geplaatst door Malork (Bericht 285932)
Ik snap 'm; ik zal je topic niet vervuilen ;). Btw in de class reference wordt ik niet wijzer zoals aangegeven. Ik snap wel dat het wijzigt per methode maar ik krijg het begrip 'context' nog niet 'in een hokje geplaatst' en in mijn Cocoa-boeken staat het ook niet echt...
(maw in jip-en-janneke taal...)

Ik vraag het wel ergens anders als ik er te lang mee blijf lopen...

In de class reference staat precies uitgelegd wat je mee moet geven ;)

Citaat:

Oorspronkelijk geplaatst door Malork (Bericht 285932)
Succes met jouw probleem in ieder geval.

bedankt! :)

gekkepietje 13-05-09 10:32

Citaat:

Oorspronkelijk geplaatst door libia (Bericht 285931)
NSLog(@"Time: %d", difference);

Tja, CFTimeInterval is een double en geen int. Je zal "Time: %f" moeten gebruiken om zinvolle output te krijgen. ;)

libia 13-05-09 15:22

Citaat:

Oorspronkelijk geplaatst door gekkepietje (Bericht 286121)
Tja, CFTimeInterval is een double en geen int. Je zal "Time: %f" moeten gebruiken om zinvolle output te krijgen. ;)

oke, das eigenlijk ook raar een b voor int!! maar ik zal het ff proberen (mn iPhone is net gecrasht, dus hij is ff aan het opstarten

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?

libia 14-05-09 14:53

Heeft iemand een idee hoe ik kan zorgen dat er vaker een event wordt gestuurd?

gekkepietje 14-05-09 18:09

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.


Alle tijden zijn GMT +2. Het is nu 17:12.