Charts: ์„ฑ๋Šฅ ํ–ฅ์ƒ

์— ๋งŒ๋“  2015๋…„ 04์›” 14์ผ  ยท  44์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: danielgindi/Charts

Philip์ด MPAndroidCharts๋กœ ํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ?
๊ทธ์˜ ํ–ฅ์ƒ๋œ ๊ธฐ๋Šฅ์œผ๋กœ ์ด์ œ Android์—์„œ ์ˆ˜์ฒœ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋ฅผ ์›ํ™œํ•˜๊ฒŒ ๋ Œ๋”๋ง ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ios-charts ๊ตฌํ˜„์„ ํ•œ ๋ˆˆ์— ์‚ดํŽด ๋ดค๊ณ , ์ตœ์‹  ์„ฑ๋Šฅ ํ–ฅ์ƒ์—†์ด โ€‹โ€‹์›๋ž˜ MPAndroidCharts ๊ตฌํ˜„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

์ˆ˜์ฒœ ๊ฐœ์˜ ํฌ์ธํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์€ ๋ชจ๋“  ์ƒ์—…์šฉ ๋ฒ„์ „์„ ํšจ๊ณผ์ ์œผ๋กœ ์“ธ๋ชจ ์—†๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋ง‰๋Œ€ํ•œ ํ”Œ๋Ÿฌ์Šค๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค (๋Œ€๋ถ€๋ถ„์€ ์–ด์จŒ๋“  ์‹œ๊ฐ„๊ณผ ๋ˆ ๋‚ญ๋น„ ์ž„).

enhancement help wanted

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

iOS ์šฉ ๋ผ์ธ ์ฐจํŠธ์— 13000 ๊ฐœ ์ด์ƒ์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ๋กœ๋“œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ฐจํŠธ๋Š”๋กœ๋“œํ•˜๋Š” ๋™์•ˆ UI๋ฅผ ๊ณ ์ •ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ๋กœ๋“œ ํ›„ ์‚ฌ์šฉ์ž๊ฐ€ ์ž„์˜์˜ ์ง€์ ์„ ์„ ํƒํ•˜๋ฉด ์„ ํƒ ํ•ญ๋ชฉ์„ ๊ฐ•์กฐ ํ‘œ์‹œํ•˜๋Š” ๋ฐ ๋„ˆ๋ฌด ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

๋ชจ๋“  44 ๋Œ“๊ธ€

Android ๋ฒ„์ „์˜ ์›๋ž˜ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์€ ๋ Œ๋”๋ง ์ฝ”๋“œ ๋‚ด๋ถ€์— ๋งŽ์€ ์ถ”๊ฐ€ ํ• ๋‹น (๋ฐฐ์—ด)์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋ Œ๋”๋ง ์ฝ”๋“œ ๋‚ด๋ถ€์— ๋ฉ”๋ชจ๋ฆฌ ๋ฅผ ํ• ๋‹นํ•˜๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค . ๊ทธ๋ž˜์„œ @PhilJay ๋Š” ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๋ฏธ๋ฆฌ ํ• ๋‹น ๋œ Buffer๋กœ ์˜ฎ๊ธฐ๊ณ  ๋ Œ๋”๋งํ•˜๋Š” ๋™์•ˆ ๋ Œ๋”๋ง ๊ณ„์‚ฐ์„ Buffer ํด๋ž˜์Šค์— ์œ„์ž„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ Œ๋”๋ง ๊ณ„์‚ฐ์„ Buffer ํด๋ž˜์Šค๋กœ ์ด๋™ํ•˜์ง€ ์•Š๊ธฐ๋กœ ์„ ํƒํ–ˆ์ง€๋งŒ ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ฏธ๋ฆฌ ํ• ๋‹นํ•˜์ง€๋งŒ ๋ Œ๋”๋ง ์ฝ”๋“œ์™€ ๋™์ผํ•œ ๋ฃจํ”„์—์„œ ๋ Œ๋”๋ง ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ํ›จ์”ฌ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ Œ๋”๋ง ๊ณ„์‚ฐ์ด ์ถ”๊ฐ€ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ˆ˜ํ–‰๋˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ๋ Œ๋”๋ง ์ฝ”๋“œ ๋‚ด์—์„œ ๋‘ ๋ฒˆ์ด ์•„๋‹ˆ๋ผ ํ•œ ๋ฒˆ๋งŒ ๋ฐ˜๋ณต๋œ๋‹ค๋Š” ๊ฒƒ์€ ์„ฑ๋Šฅ ํ–ฅ์ƒ์ž…๋‹ˆ๋‹ค.

Btw, Swift์—์„œ ์„ฑ๋Šฅ์€ ์–ด์จŒ๋“  Java๋ณด๋‹ค ํ›จ์”ฌ ๋‚ซ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๋ฐฐ์—ด์„ ์‚ฌ์ „ ํ• ๋‹นํ•˜์ง€ ์•Š๊ณ ๋„ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜ํ”ฝ์œผ๋กœ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ๋ Œ๋”๋ง ์ฝ”๋“œ์—์„œ ์ˆ˜ํ–‰๋˜๊ณ ์žˆ๋Š” ์ž‘์—…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • [๋ Œ๋”๋ง ์‹œ์ž‘]
  • ๋ฐ์ดํ„ฐ ์„ธํŠธ์— ๋Œ€ํ•œ ๋ฃจํ”„
  • -์ด DataSet์˜ ํฌ์ธํŠธ์— ๋Œ€ํ•œ ๋ฐฐ์—ด ํ• ๋‹น- ์ด์ œ ๋‘ ํ”Œ๋žซํผ ๋ชจ๋‘์— ์‚ฌ์ „ ํ• ๋‹น ๋จ
  • -๋ Œ๋”๋ง ํฌ์ธํŠธ ๊ณ„์‚ฐ-_Android ๋ฒ„์ „์˜ ๋ฒ„ํผ๋กœ ์ด๋™ _
  • -๊ทธ ํฌ์ธํŠธ๋ฅผ ๋ Œ๋”๋ง
  • [๋ Œ๋”๋ง ์ปค๋ฐ‹]

๋˜ํ•œ Java์—์„œ๋Š” ์ถ”์ƒํ™” (ํ•จ์ˆ˜, ํด๋ž˜์Šค, ์ƒ์†)๊ฐ€ ๋Œ€๊ฐ€๋ฅผ ์น˜๋ฅด๊ฒŒ๋ฉ๋‹ˆ๋‹ค. Google ์ž์ฒด๊ฐ€ ์ค‘์š”ํ•œ ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ์ž‘์„ฑํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

Be careful with code abstractions

Often, developers use abstractions simply as a "good programming practice," 
because abstractions can improve code flexibility and maintenance. 
However, abstractions come at a significant cost: 
    generally they require a fair amount more code that needs to be executed, 
requiring more time and more RAM for that code to be mapped into memory. 
So if your abstractions aren't supplying a significant benefit, you should avoid them.

์š”์•ฝ :

  • ์ˆ˜์ฒœ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋กœ ์ž‘์—…ํ•˜๋Š” ๋ฐ ์ต์ˆ™ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!
  • ๋‚˜๋Š” Phil์„ ์„ค๋“ํ•˜์—ฌ ํฌ์ธํŠธ ๊ณ„์‚ฐ์„ ๋‹ค์‹œ ๋ Œ๋”๋ง ๋ฃจํ”„๋กœ ์˜ฎ๊ฒจ ์œ ์ง€ ๊ด€๋ฆฌ๋ฅผ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค ;-)

์„ค๋ช… Daniel์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๋‚˜๋Š” ์ด๊ฒƒ์—์„œ ๋ฌด์—‡์„ ๊ฐ€์ ธ ๊ฐ€์•ผํ• ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ํ•œ ์ผ์€ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ (์•„๋ž˜ ์ฝ”๋“œ ์ฐธ์กฐ) ์„ฑ๋Šฅ์€ Android ๋ฒ„์ „๊ณผ ๋น„๊ตํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์™„์ „ํžˆ ์ •์งํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค. ์ˆ˜์ฒœ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด iPad Mini3 ๋ฐ iPhone6๊ณผ ๊ฐ™์€ ์ตœ์‹  iOS ๊ธฐ๊ธฐ์—์„œ๋„ ์ตœ๋Œ€ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ ์ˆ˜ (์™„์ „ํžˆ ์ถ•์†Œ)๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋ฐ ๊ฐ€๊นŒ์›Œ์ง€๋ฉด ์—„์ฒญ๋‚œ ํ”„๋ ˆ์ž„ ๋“œ๋กญ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด MPAndroidcharts๋Š” ๋•€์„ ํ˜๋ฆฌ์ง€ ์•Š๊ณ  ํ›จ์”ฌ ๋Š๋ฆฐ ์žฅ์น˜์—์„œ ์ˆ˜์ฒœ์„ ๋ Œ๋”๋ง ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

override func viewDidLoad () {
super.viewDidLoad ()

    lineChart = LineChartView(frame: view.frame);
    view.addSubview(lineChart);
    lineChart.backgroundColor = UIColor.whiteColor()
    lineChart.descriptionText = "Just a test"
    lineChart.leftAxis.enabled = false
    lineChart.legend.enabled = false

    setData(20)
}

func setData(range:Float) {

    var count = 1000;
    var xVals = Array<String>();

    for(var i = 0; i<count; i++) {
        xVals.append(String(i) + "");
    }

    var yVals = Array<ChartDataEntry>();

    for (var i = 0; i<count; i++) {
        var mult = range + 1
        var val:Float = Float(random()) * mult + 3;
        yVals.append(ChartDataEntry(value: val, xIndex: i));
    }

    var lineSet:LineChartDataSet = LineChartDataSet(yVals: yVals, label: " ");
    lineSet.drawCirclesEnabled = false;
    lineSet.drawValuesEnabled = false;

    var lineData:LineChartData = LineChartData(xVals: xVals, dataSet: lineSet);
    lineChart.data = lineData;
}

์•„์ง ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ฐจํŠธ๋ฅผ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๊ณง ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
๋ณ‘๋ชฉ ํ˜„์ƒ ์€ ์•„๋งˆ๋„ ๋‚ด๊ฐ€ ์–ด๋”˜๊ฐ€์—์„œ ๋†“์นœ ํ• ๋‹น ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธํ•˜๊ณ  ์•Œ๋ ค ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค! :-)

๊ณ ๋งˆ์›Œ์š” ๋‹ค๋‹ˆ์—˜. ์ด๊ฒƒ์—์„œ ๋ฌด์—‡์„ ์งœ๋‚ผ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. iOS์—์„œ MPAndroidCharts์— ๋Œ€ํ•œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋™๋ฐ˜์ž๊ฐ€ ์žˆ์œผ๋ฉด ๋ฉ‹์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธ€์Ž„, ๋‚˜๋Š” LineChartRenderer (์˜ˆ๋ฅผ ๋“ค์–ด BarChartRenderer์— ๋น„ํ•ด ํŠนํžˆ ๋Š๋ฆผ)๋ฅผ ์•ฝ๊ฐ„ ์‚ฌ์šฉํ–ˆ์œผ๋ฉฐ Instruments๋Š” CGContext์˜ drawPath๊ฐ€ ์—ฌ๊ธฐ์„œ ๋ฒ”์ธ์ด๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.
๋Œ€์‹  UIBezierPath๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์ด ๋ฌธ์ œ๋ฅผ ์™„ํ™”ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ๊ฒฝ๋กœ์—์„œ stroke ()๋ฅผ ํ˜ธ์ถœํ•˜์ž๋งˆ์ž ์„ฑ๋Šฅ์ด ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ „์—๋Š” ๊ทธ๋ฆฌ๊ธฐ ์„ฑ๋Šฅ์ด ์ข‹์ง€๋งŒ ๋‹จ์ˆœํ•œ ์„  ์ฐจํŠธ์—์„œ ์›ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์‹œ์ž‘์ ๊ณผ ๋์ ์— ๋Œ€ํ•ด ๊ฒฝ๋กœ๊ฐ€ ์ฑ„์›Œ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๋Š” ๋ฐ ์•ฝ๊ฐ„์˜ ํ–‰์šด์ด ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ง€๊ธˆ ํ…Œ์ŠคํŠธ ์ค‘์ด๋ฉฐ ์‹ค์ œ CGContextStrokePath ์„ฑ๋Šฅ์ด ์ €ํ•˜๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ฃผ์š” ํƒ€์ž ์ค‘ ํ•˜๋‚˜๋Š” ์ ์„ ์ž…๋‹ˆ๋‹ค. ๋น„ํ™œ์„ฑํ™”ํ•˜๋ฉด ์„ฑ๋Šฅ์ด ๋‘ ๋ฐฐ๊ฐ€๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์ฒœ ์ ์œผ๋กœ ๊ฐ€๋‚œํ•ฉ๋‹ˆ๋‹ค.
CoreGraphics๋ฅผ ๋” ๋น ๋ฅด๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๊ธฐ ์œ„ํ•ด Apple ๋ฌธ์„œ๋ฅผ ์ฝ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, Core Graphics๋Š” ํ™•์‹คํžˆ ๊ฒฝ๋กœ๋ฅผ ๋Š๋ฆฌ๊ฒŒ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. ํ•ด์ƒ๋„ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ตœ์‹  Apple ์žฅ์น˜์˜ ํ•ด์ƒ๋„๊ฐ€ ๋งค์šฐ ๋†’์•„ ๋ Œ๋”๋ง ํ•  ํ”ฝ์…€์ด ๋” ๋งŽ์•„์ง‘๋‹ˆ๋‹ค.

๋‚˜๋Š” CG๊ฐ€ GPU ๋Œ€์‹  CPU์—์„œ ๋ Œ๋”๋งํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ๊ทธ๊ฒƒ์„ ๋ฐ”๊ฟ€ ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

CG๋Š” ๋ Œ๋”๋ง์„ ์œ„ํ•ด CPU๋ฅผ ๊ฐ€์žฅ ํ™•์‹คํžˆ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ๋ณ€๊ฒฝํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.
GPU ๋ Œ๋”๋ง์€ ๋ถˆํ–‰ํžˆ๋„ OpenGL์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. CG๋Š” Android๊ฐ€ CPU์—์„œ ์ด๋Ÿฌํ•œ ํ•ญ๋ชฉ์„ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋น„ํ•ด ๋Š๋ฆฝ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ๋Š๋ฆฐ ์žฅ์น˜์˜ CPU์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋งค์šฐ ๋Š๋ฆฐ
CPU๋Š” Android์˜ ๋น ๋ฅธ CPU๋ณด๋‹ค iOS์—์„œ ํ›จ์”ฌ ๋” ๋‚˜์€ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์• ํ”Œ์€ ์ตœ์ ์˜ OS๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ๋Š” ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
๋น ๋ฅด๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

๋งŽ์€ ํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๋‚˜๋Š” ์—ฌ์ „ํžˆ ๋ผ์ธ์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๊ธฐ๋ฐ˜ ์ฐจํŠธ.

ํŠนํžˆ ๊ฒฝ๋กœ ๊ทธ๋ฆฌ๊ธฐ ์‹œ์Šคํ…œ์ด ๋Š๋ฆฐ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
Miter ๋ฐ Flatness๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ ์„ ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ 
์•ˆํ‹ฐ ์•จ๋ฆฌ์–ด์‹ฑ-์„ฑ๋Šฅ์€ 500-700 ํฌ์ธํŠธ์—์„œ ํ›จ์”ฌ ์ข‹์•„์ง‘๋‹ˆ๋‹ค.
iPhone 6์ด์ง€๋งŒ ์—ฌ์ „ํžˆ 1000์„ ๊ฐ€์ง„ Jerky

UIBezierPath๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐํšŒ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด, ๊ทธ ๊ฒƒ์€ '์ŠคํŠธ๋กœํฌ'๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉด ์ถฉ๋ถ„ํžˆ ๋น ๋ฅด๋ฉฐ, ์ด๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ๊ฒฝ๋กœ๊ฐ€ ์ŠคํŠธ๋กœํฌ์ด๋ฉฐ ์‹œ์ž‘์ ์—์„œ ๋์ ๊นŒ์ง€ ์ฑ„์›Œ์„œ๋Š” ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์‹œ์Šคํ…œ์— ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์ „ํ˜€ ๋ชจ๋ฅด์ง€๋งŒ ๊ทธ๋ž˜ํ”„ ๊ทธ๋ฆฌ๊ธฐ ์ž์ฒด๊ฐ€ ๋ฌธ์ œ๊ฐ€ ์•„๋‹˜์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊บพ์€ ์„ ํ˜• ์ฐจํŠธ์— UIBezierPath๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ŠคํŠธ๋กœํฌ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ๊ฒฝ๋กœ๋ฅผ ๊ทธ๋ฆฌ๋„๋ก ์†์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ฆฌ๋“œ ์„ ์— ๋Œ€ํ•œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํ›„๋ณด๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. API ๊ด€์ ์—์„œ 'ํ‹€๋ ธ์ง€ ๋งŒ'๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

UIBezierPath๋Š” CGPath, CGContextDrawPath๋ฅผ ๋‘˜๋Ÿฌ์‹ผ UIKit ๋ž˜ํผ์ž…๋‹ˆ๋‹ค.
๊ธฐํƒ€
์–ด๋–ค ๊ฒฝ์šฐ์— ๊ด€์ฐฐ๋˜๋Š” ์„ฑ๋Šฅ ์ฐจ์ด๋Š”
UIBezierPath์˜ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋จผ์ € CG๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
์•คํ‹ฐ ์•จ๋ฆฌ์–ด์‹ฑ, ๋งˆ์ด ํ„ฐ ์ œํ•œ ๋“ฑ

์‹ค์ œ๋กœ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ์•ˆ๋‹ค๋ฉด ์‚ฌ์šฉํ•  ์ด์œ ๊ฐ€ ์ „ํ˜€ ์—†์Šต๋‹ˆ๋‹ค.
ํ•ต์‹ฌ ๊ทธ๋ž˜ํ”ฝ.

๊ทธ๋ฆฌ๊ณ  ๋„ค, ์šฐ๋ฆฌ๋Š” ๊ทธ ๊ฒฝ๋กœ๋ฅผ ์“ฐ๊ธธ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— "stroke"๋ผ๊ณ  ๋ถ€๋ฅผ ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค ...
๊ทธ๊ฒƒ์„ ์ฑ„์šฐ์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์“ฐ๋‹ค๋“ฌ์–ด์ฃผ๋Š” ๊ฒƒ์ด ๊ณ ์ฒด๋ฅผ ์ฑ„์šฐ๋Š” ๊ฒƒ๋ณด๋‹ค ์‹œ์Šคํ…œ์— ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค
์ƒ‰์ƒ, ์„ ์˜ ๋„ˆ๋น„๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์กฐ์ธ์€
์„ ๊ณผ ์กฐ์ธ์˜ ๋ชจ์–‘ ์‚ฌ์ด.

2015 ๋…„ 4 ์›” 17 ์ผ ๊ธˆ์š”์ผ ์˜ค์ „ 10์‹œ 50 ๋ถ„์— AlBirdie [email protected] ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

UIBezierPath๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐํšŒ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด
'์ŠคํŠธ๋กœํฌ'๋ผ๊ณ  ๋ถ€๋ฅด์ง€ ์•Š์œผ๋ฉด ์ถฉ๋ถ„ํžˆ ๋น ๋ฆ…๋‹ˆ๋‹ค.
๊ฒฝ๋กœ๊ฐ€ ์ŠคํŠธ๋กœํฌ์ด๋ฏ€๋กœ ์‹œ์Šคํ…œ์—
๋์ ์— ๋Œ€ํ•œ ์‹œ์ž‘์ . ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์ „ํ˜€ ๋ชจ๋ฅธ๋‹ค
๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๊ทธ๋ž˜ํ”„ ๊ทธ๋ฆฌ๊ธฐ ์ž์ฒด๊ฐ€
๊ทธ ์ž์ฒด๋กœ ๋ฌธ์ œ.

๊ทธ๋Ÿฌ๋‚˜ UIBezierPath๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์—
๊บพ์€ ์„ ํ˜• ์ฐจํŠธ๋Š” ํ•˜๋‚˜์˜ ๊ทธ๋ฆฌ๋“œ ๋ผ์ธ์— ๋Œ€ํ•œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํ›„๋ณด๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ŠคํŠธ๋กœํฌ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋ฆฌ๋„๋ก ๊ฒฝ๋กœ๋ฅผ ์†์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„
API ๊ด€์ ์—์„œ '์ž˜๋ชป๋œ'๊ฒฝ์šฐ ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/danielgindi/ios-charts/issues/29#issuecomment -93937181
.

@danielgindi ์• ๋‹ˆ๋ฉ”์ด์…˜ ์†๋„๊ฐ€ ๋Š๋ ค์ง€๋Š” ๊ฒฝ์šฐ ์• ๋‹ˆ๋ฉ”์ด์…˜์—†์ด ๋ชจ๋“  ์„ ์„ ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ๋ฎ๋Š” ๋งˆ์Šคํฌ๋ณด๊ธฐ๋ฅผ ์‚ฌ์šฉํ•œ ๋‹ค์Œ ๋งˆ์Šคํฌ๋ณด๊ธฐ๋ฅผ ์• ๋‹ˆ๋ฉ”์ด์…˜ํ•˜์—ฌ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋ชจ๋ฐฉํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

์ข‹์€ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค! :)

๋‹จ์ ์ด ์žˆ์ง€๋งŒ :
๊ทธ๊ฒƒ์€ ๋‹น์‹ ์ด ํ•  ์ˆ˜์žˆ๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ์ข…๋ฅ˜๋ฅผ ๋ถˆ๊ตฌ๋กœ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ—ˆ์šฉํ•˜๋Š”๋Œ€๋กœ
์ฐจํŠธ๊ฐ€ "์„ฑ์žฅ"ํ•˜๋„๋ก Y ์ถ• ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฐ ์„ ์ด ์ฑ„์›Œ์ง€๋Š” ๋ฐฉ์‹
X ์ถ•์—์„œ๋„ ์ŠคํŠธ๋กœํฌ๊ฐ€์žˆ์„ ๋•Œ์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๋‚ด ์‹œ๋„ ๋ชฉ๋ก์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์–ด๋–ป๊ฒŒ ๋“  CoreGraphics๋ฅผ ํ–ฅ์ƒ ์‹œํ‚ค๊ฑฐ๋‚˜ ๋ Œ๋”๋ง์˜ ์ผ๋ถ€๋ฅผ
    GPU

    1. ๋ชจ๋“  ์• ๋‹ˆ๋ฉ”์ด์…˜ ํ”„๋ ˆ์ž„์„ ๋ฏธ๋ฆฌ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹œ์ž‘์ด ์ง€์—ฐ๋˜๊ณ 

      ์ƒ๋‹นํ•œ ์–‘์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์†Œ๋น„

    2. ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ์ข…๋ฅ˜๋ฅผ ์ œํ•œํ•˜๋Š” ๋งˆ์Šคํ‚น ์•„์ด๋””์–ด

๋‹ค๋ฅธ ์•„์ด๋””์–ด๊ฐ€ ์žˆ๋‹ค๋ฉด ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค!

Daniel, ์ž‘์—…์„ GPU๋กœ ์˜คํ”„๋กœ๋“œ ํ•ด ๋ณด์…จ๋‚˜์š”?
์ €๋Š” ์šฐ๋ฆฌ๊ฐ€ ํ˜„์žฌ ์ž‘์—…ํ•˜๊ณ ์žˆ๋Š” ์ƒ์šฉ ์†”๋ฃจ์…˜ (๋”์ฐํ•œ API, ๋”์ฐํ•˜๊ฒŒ ๋‹ซํž˜, ์•ฑ ์ถฉ๋Œ์„ ์œ ๋ฐœํ•˜๋Š” ๋งŽ์€ ๋ฒ„๊ทธ)์— ์ •๋ง ์ •๋ง ๋ถˆ๋งŒ์Šค๋Ÿฝ๊ณ  MPAndroidCharts๋กœ ํฐ ์„ฑ๊ณต์„ ๊ฑฐ๋‘์—ˆ์Šต๋‹ˆ๋‹ค. ์„ฑ๋Šฅ์ด ๋™๋“ฑํ•˜๋‹ค๋ฉด ๊ฒฐ๊ตญ iOS ์ฐจํŠธ. ๋‹น์‹ ์˜ ์ž‘์—…์€ ๋ณด์ƒ๋ฐ›์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ;)

๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๊ธฐ์ˆ ์„ ์‹œ๋„ํ•ด๋ณด๊ณ  ๋ฉฐ์น  ํ›„์— ์—…๋ฐ์ดํŠธ๋ฅผ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค!

2015 ๋…„ 4 ์›” 20 ์ผ ์›”์š”์ผ ์˜คํ›„ 12์‹œ 38 ๋ถ„์— AlBirdie [email protected] ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

Daniel, ์ž‘์—…์„ GPU๋กœ ์˜คํ”„๋กœ๋“œ ํ•ด ๋ณด์…จ๋‚˜์š”?
์ €๋Š” ํ˜„์žฌ ์šฐ๋ฆฌ๊ฐ€ ํ˜„์žฌ ์‚ฌ์šฉํ•˜๊ณ ์žˆ๋Š” ์ƒ์šฉ ์†”๋ฃจ์…˜์— ์ •๋ง ๋ถˆ๋งŒ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.
(๋”์ฐํ•œ API, ๋”์ฐํ•˜๊ฒŒ ๋‹ซํž˜, ๊ทธ๋ฆฌ๊ณ 
์•ฑ ์ถฉ๋Œ) MPAndroidCharts๋กœ ํฐ ์„ฑ๊ณต์„ ๊ฑฐ๋‘์—ˆ๋‹ค๋ฉด
์„ฑ๋Šฅ์ด ๋™๋“ฑํ•˜๋‹ค๋ฉด ๊ฒฐ๊ตญ iOS ์ฐจํŠธ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ์‰ฌ๋‹ค
๋‹น์‹ ์˜ ์ž‘์—…์€ ๋ณด์ƒ๋ฐ›์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ;)

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/danielgindi/ios-charts/issues/29#issuecomment -94408574
.

@AlBirdie ์–ด๋–ค ์ข…๋ฅ˜์˜ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๋งŒ๋‚ฌ์Šต๋‹ˆ๊นŒ? ์ €๋Š” ํ˜„์žฌ ios-charts์ฒ˜๋Ÿผ ์ฐจํŠธ๋ฅผ ๊ทธ๋ฆฌ๋Š” ์ œํ’ˆ์„ ์†Œ์œ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋‚ด๋ถ€์ ์œผ๋กœ ์ด๋ฏธ ์ฐจํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ ์„ฑ๋Šฅ์— ๋Œ€ํ•ด ์šฐ๋ คํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์šฐ๋ฆฌ๋Š” ๋‹จ์ง€ 100-1000 ๊ฐœ์˜ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ๊ดœ์ฐฎ์•„ ๋ณด์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ฐ€๋Šฅํ•˜๋ฉด ios-charts๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜๊ณ  ์žˆ์ง€๋งŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ios-chart์™€ ์ถฉ๋Œ ํ•  ์ˆ˜์žˆ๋Š” ์ œ์Šค์ฒ˜๊ฐ€์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์„ฑ๋Šฅ ๋ฌธ์ œ๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ๋Š๋ฆฐ ํ”„๋ ˆ์ž„ ์†๋„์ž…๋‹ˆ๋‹ค.
๊บพ์€ ์„ ํ˜• ์ฐจํŠธ์— 500-1000 ๊ฐœ์˜ ์„ ์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.

์ œ์Šค์ฒ˜์™€ ๊ด€๋ จํ•˜์—ฌ-ํ‘œ์ค€ UIGestureRecognizers๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋น„ํ™œ์„ฑํ™”, ์ˆ˜์ • ๋˜๋Š” ์ž‘์—… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ํ‘œ์ค€ํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. :-)

2015 ๋…„ 4 ์›” 20 ์ผ ์›”์š”์ผ ์˜คํ›„ 12์‹œ 53 ๋ถ„์— Xuan [email protected] ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

@AlBirdie https://github.com/AlBirdie ์–ด๋–ค ์„ฑ๋Šฅ
๋งŒ๋‚œ ๋ณ‘๋ชฉ? ๋‚˜๋Š” ํ˜„์žฌ ์ฐจํŠธ๋ฅผ ๊ทธ๋ฆฌ๋Š” ์ œํ’ˆ์„ ์†Œ์œ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
ios-charts์ฒ˜๋Ÿผ ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ๋‚ด๋ถ€์ ์œผ๋กœ ์ฐจํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ ๊ฑฑ์ •ํ•œ๋‹ค
์„ฑ๋Šฅ์— ๋Œ€ํ•ด์„œ๋Š” ํ˜„์žฌ 100 ~ 1000 ๊ฐœ์˜ ๋ฐ์ดํ„ฐ ์„ธํŠธ ๋งŒ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
์ง€๊ธˆ.

์•ž์œผ๋กœ ๊ฐ€๋Šฅํ•˜๋ฉด ios-charts๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ๋„ ๊ณ ๋ ค ์ค‘์ž…๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ ๋„์„œ๊ด€์—๋Š” ios-chart์™€ ์ถฉ๋Œ ํ•  ์ˆ˜์žˆ๋Š” ์ œ์Šค์ฒ˜๊ฐ€์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/danielgindi/ios-charts/issues/29#issuecomment -94411060
.

@danielgindi ๊ธ€์Ž„, ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ๋งˆ์Šคํฌ๋ณด๊ธฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์šฐ๋ฆฌ์˜ ๋ผ์ธ ์ฐจํŠธ์—๋Š” ๊ทธ๋ผ๋””์–ธํŠธ ๋ ˆ์ด์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ๋ชจ๋กœ ์• ๋‹ˆ๋ฉ”์ด์…˜์€ X + Y ๋ฐฉํ–ฅ์„ ๋™์‹œ์— ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์šฐ๋ฆฌ๋Š” X ๋ฐฉํ–ฅ ๋งŒ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์Šคํฌ ํŠธ๋ฆญ์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
์ง€๊ธˆ ์ œ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์€ X + Y ๋ฐฉํ–ฅ์„ ์„ค๋ช…ํ•˜๋Š” ๋ฒกํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋งˆ์Šคํฌ ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•  ๊ธฐํšŒ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋Œ€ํ•˜์‹ญ์‹œ์˜ค!

@ liuxuan30 ์€ ์ผ๋ฐ˜์ ์ธ ๋Š๋ฆฐ ์„ฑ๋Šฅ์ž…๋‹ˆ๋‹ค. ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ์ž‘์—…ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๋‹จ์ผ ์ฐจํŠธ์— ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ ์„ธํŠธ (์—ฌ๋Ÿฌ ์ฃผ์‹ + ์ง€ํ‘œ ๋ฒ”์œ„)๊ฐ€ ํ•„์š”ํ•œ ๊ธˆ์œต ์ฐจํŠธ๋ฅผ ์ž‘์—…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํŒจ๋‹ ๋ฐ ํ•€์น˜ ์ค‘์— ํ•œ ๋ฒˆ์— ๋ Œ๋”๋งํ•ด์•ผํ•˜๋Š” ์ตœ๋Œ€ ์ˆ˜์ฒœ ๊ฐœ์˜ ํฌ์ธํŠธ๋ฅผ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•˜๋Š” 250 ๊ฐœ ํ•ญ๋ชฉ์˜ ๋ฐ์ดํ„ฐ ๋ฒ”์œ„. ๋‚ด๊ฐ€ ํ˜„์žฌ ์ž‘์—…ํ•˜๊ณ ์žˆ๋Š” ์ƒ์šฉ ์†”๋ฃจ์…˜์€ ๊ฝค ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ (OpenGL์„ ์‚ฌ์šฉํ•˜๋ฉด CPU ๊ณผ๋ถ€ํ•˜์—†์ด ์ˆ˜์ฒœ ๊ฐœ์˜ ํฌ์ธํŠธ๋ฅผ ๋ Œ๋”๋ง ํ•  ์ˆ˜ ์žˆ์Œ) ๋ฒ„๊ทธ ์ˆ˜์ •์„ ์œ„ํ•ด ๋ช‡ ๋‹ฌ์„ ๊ธฐ๋‹ค๋ ค์•ผํ•˜๋Š” ํ์‡„ ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์นœ๊ตฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
ํŠนํžˆ MPAndroidCharts์˜ API๋Š” ์ž‘์—…ํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์— ios-charts๊ฐ€ ํ›จ์”ฌ ๋” ํŽธํ•ฉ๋‹ˆ๋‹ค.

๊ธˆ์œต ๋ฐ์ดํ„ฐ๋Š” ์žฌ์•™์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ์ตœ๋Œ€ 1000 ๊ฐœ์˜ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ๋ชจ๋ฐ”์ผ ์žฅ์น˜๋กœ ์ „์†กํ•˜๋„๋กํ•˜์—ฌ ๊ณผ๋ถ€ํ•˜๋ฅผ ์ค„์˜€์Šต๋‹ˆ๋‹ค. ios-charts์— OpenGL์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฟก ๋นต๋€จ

OpenGL ์ง€์›์€ ์—์ด์Šค์ž…๋‹ˆ๋‹ค. GPU ๋ Œ๋”๋ง ๋œ ์„ ํ˜• ์ฐจํŠธ๋Š” ํ˜„์žฌ๋กœ์„œ๋Š” ์ถฉ๋ถ„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋ถˆํ–‰ํžˆ๋„ ์ €๋Š” OpenGL์— ๋Œ€ํ•ด ์ „ํ˜€ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ธฐ๊บผ์ด ๋„์™€ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ CGContextStrokeLineSegments๊ฐ€ ๊ฐœ์„ ๋˜์—ˆ์œผ๋ฏ€๋กœ ์ด๊ฒƒ์„ ์‹œ๋„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
์—ฌ์ „ํžˆ ๋‹ค๋ฅธ ๊ฐœ์„  ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. :-)

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค Daniel, ๋‘ ๋ฒ„์ „์„ ์„œ๋กœ ๋น„๊ตํ•˜์—ฌ ๋ฌด์—‡์ด ๋ฌด์—‡์ธ์ง€ ํ™•์ธํ•˜๋Š” ์ž‘์€ ํ…Œ์ŠคํŠธ ์•ฑ์„ ๋งŒ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด LineSegments๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋–ค ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์–ป์—ˆ์Šต๋‹ˆ๊นŒ?

@AlBirdie ์„ ๋ถ„์˜ ์ฐจ์ด๋ฅผ ๋Š๋ผ์‹ญ๋‹ˆ๊นŒ?

๋˜ํ•œ ๋ฐฉ๊ธˆ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. Android์—์„œ ์ตœ๋Œ€ ์„ฑ๋Šฅ์„ ์–ป์œผ๋ ค๋ฉด ํ•˜๋“œ์›จ์–ด ๋ ˆ์ด์–ด๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.์ด ๊ฒฝ์šฐ ์ ์„ ์ด ์ ์„ ์ด ์•„๋‹ˆ๋ผ ๋ชจ๋‘ ์‹ค์„ ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ iOS์—์„œ ์ ์„ ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ฉด ๋จผ์ € ์ƒ๋‹นํ•œ ํ–ฅ์ƒ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ CIImage์—์„œ OpenGL ES๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์•ฑ์ด ๋น„ํ™œ์„ฑ ์ƒํƒœ ์ผ ๋•Œ ํ•˜๋‚˜์˜ GL ๋ผ์ธ์ด ์‹คํ–‰๋˜๋ฉด ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ๋งค์šฐ์ฃผ์˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ํ…์Šค์ฒ˜๋ฅผ ๋ฏธ๋ฆฌ ๋ Œ๋”๋งํ•˜์—ฌ ๋Œ€์‹œ๋ฅผ ํ—ˆ์šฉ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ฝ๊ฐ„์˜ ์ž‘์—…์ด ํ•„์š”ํ•  ๊ฒƒ์ด๊ณ  ๋‚˜์˜ ์ฃผ์š” ์šฐ์„  ์ˆœ์œ„๋Š” ์•„๋‹ˆ์ง€๋งŒ CGContext๋ฅผ ์›ํ™œํ•˜๊ฒŒ ๋Œ€์ฒด ํ•  ์ˆ˜์žˆ๋Š” OpenGL ๋ ˆ์ด์–ด์˜ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ธฐ๋ฅผ ์œ„ํ•ด OpenGL๋กœ ์ด๋™ํ•˜๋Š” ๋Œ€์‹  Core Animation์œผ๋กœ ๋‚ฎ์ถ”์–ด ๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. CAShapeLayer ํด๋ž˜์Šค๊ฐ€ ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Apple์€ ๋ณต์žกํ•œ ๊ฒฝ๋กœ๋ฅผ ๋ Œ๋”๋ง ํ•  ๋•Œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ CAShapeLayer ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๋ฏ€๋กœ ์„  ์„ธ๊ทธ๋จผํŠธ๋ฅผ ์—ฌ๋Ÿฌ ์„ธ๊ทธ๋จผํŠธ๋กœ ๋ถ„ํ• ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Core Animation์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž‘์—…์ด GPU๋กœ ์ด๋™๋ฉ๋‹ˆ๋‹ค.

๋‚˜์˜ ์ผ์ƒ ์—…๋ฌด์—์„œ ์šฐ๋ฆฌ๋Š” ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด @AlBirdie ๊ฐ€ OpenGL์„ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์—ฌ ์ฃผ์„์„ ์ œ์™ธํ•œ ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•ด CoreGraphics๋ฅผ ์šฐํšŒํ•˜๋Š” ์ƒ์šฉ ์ œํ’ˆ์„ ์‚ฌ์šฉํ•ด ์™”์Šต๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ๊ทธ๋“ค์€ ์ƒ๋‹นํžˆ ๋ถ€๋“œ๋Ÿฌ์šด ๋ Œ๋”๋ง์œผ๋กœ ๊ฝค ํฐ ๋ฐ์ดํ„ฐ ์„ธํŠธ์— ๋Œ€์ฒ˜ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ์ด๋ฅผ ์œ„ํ•ด GPU๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋“ค์˜ ์ ‘๊ทผ ๋ฐฉ์‹์—๋Š” ์—„์ฒญ๋‚œ ๊ณจ์นซ๊ฑฐ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์•ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ๋“ค์–ด๊ฐ์— ๋”ฐ๋ผ OpenGL์—์„œ ์ถฉ๋Œํ•˜๋Š” ๋น„๋™๊ธฐ ๋ Œ๋”๋ง ํ˜ธ์ถœ, ๋ฉ์ฒญํ•œ ํด๋ž˜์Šค ๊ตฌ์กฐ ๋ฐ ์‚ฌ์šฉ์ž ์ง€์ • ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€ํ•œ ๋ฏธ์นœ ์ œํ•œ๊ณผ ๊ฐ™์ด ๊ณ ์น  ์ˆ˜์—†๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์€ ์˜ค๋Š˜๋‚  ์กด์žฌํ•˜์ง€ ์•Š์ง€๋งŒ iOS- ์ฐจํŠธ์—์„œ๋Š” ๊ทธ๊ฒƒ์ด ๊ฑฐ๊ธฐ์— ๋„๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ• ์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“ , ๋‚˜์—๊ฒŒ ์‹ ๋ขฐ์„ฑ์€ ๋งค๋ฒˆ ์„ฑ๋Šฅ๋ณด๋‹ค ์šฐ์„ธํ•˜์ง€๋งŒ ๊ฐ€์žฅ ์ž‘์€ ์ฐจ์ด๋กœ ๋‘˜ ๋‹ค ์—„์ฒญ๋‚˜๊ฒŒ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์ƒ๊ฐ์— ์ ์„ ์€ ์ปดํ“จํ„ฐ๊ฐ€ ์ปฌ๋Ÿฌ ๋˜๋Š” ๊ทธ๋ ˆ์ด ์Šค์ผ€์ผ๋กœ ๋ Œ๋”๋ง ํ•  ์ˆ˜์žˆ๋Š” ์˜ต์…˜์ด ์—†์—ˆ๋˜ ์‹œ์ ˆ์˜ ์ˆ™์ทจ์ž…๋‹ˆ๋‹ค. ์ˆœ์ˆ˜ํ•œ ํ‘๋ฐฑ์œผ๋กœ ๋ Œ๋”๋งํ•˜๊ณ  ๋‚ก์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ™œ์ž ์ธ์‡„ ๊ต๊ณผ์„œ, ํ™•์‹คํžˆ? ;) ๋”ฐ๋ผ์„œ ์ผ๋ฐ˜์ ์ธ 10K ํฌ์ธํŠธ ์‚ฌ๋ก€๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋œ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์„ ๊ณผ ๊ด€๋ จํ•˜์—ฌ @onlyforart ์™€ ์ ˆ๋Œ€์ ์œผ๋กœ.
์ƒ์—…์šฉ ์ฐจํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์„ค๋ช…์„ ๊ฐ์•ˆํ•  ๋•Œ ๋™์ผํ•œ ์ œํ’ˆ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. :) ์šฐ๋ฆฌ๋Š” ๊ฒฐ๊ตญ ๊ทธ๊ฒƒ์„ ๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ 3 ๊ฐœ์›”์˜ ๋” ์ข‹์€ ๋ถ€๋ถ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค (์‹ฌ๊ฐํ•œ ๋ฒ„๊ทธ์™€ ์ œํ•œ (์˜ˆ : ์‹ญ์ž์„ )์„ ํ”ผํ•  ์ˆ˜์žˆ์„๋งŒํผ ๊ธธ์ง€ ์•Š์•˜์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  iOSCharts ( '๋ฉ์ฒญํ•œ ํด๋ž˜์Šค ๊ตฌ์กฐ');)). ์‹œ๊ฐ„๊ณผ ๋ˆ์˜ ์ด ๋‚ญ๋น„.

@AlBirdie ๋„ค ๊ทธ๊ฒŒ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์‹ญ์ž์„ ๋„ ์–ธ๊ธ‰ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋„ˆ๋ฌด ๋งŽ์€ Newcastle Brown Ale์˜ ๋„์›€์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๊ณ  ์˜์‹ฌ ํ•  ์—ฌ์ง€์—†์ด ๊ธฐ์—… ์‹œ์žฅ์„ ๊ฒจ๋ƒฅํ–ˆ์Šต๋‹ˆ๋‹ค (์—„์ฒญ๋‚œ API๋Š” ๊ณ ๊ฐ์„ ๊ฐ’ ๋น„์‹ผ ์ง€์› / ์œ ์ง€ ๊ด€๋ฆฌ์ฃผ๊ธฐ์— ๋ฌถ์–ด๋‘๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ๊ธ์ •์  ์ธ ํŒ๋งค ์š”์†Œ์ž…๋‹ˆ๋‹ค). ๊ทธ ์‚ฌ๋žŒ๋“ค์˜ ์—ญ์‚ฌ๋ฅผ ์•Œ๊ณ  ๊ณ„์…จ์Šต๋‹ˆ๊นŒ? ์‹ค์ œ๋กœ (๊นŠ์€ ๊ณผ๊ฑฐ์—) ๊ทธ๋“ค์€ ์†Œํ”„ํŠธ์›จ์–ด ์‚ฐ์—…์˜ ์ง„์ •ํ•œ ๊ฐœ์ฒ™์ž์˜€์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์ด์ œ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐ€ ๋ฏธ๋ž˜๋ฅผ ๋ฐ”๋ผ ๋ณผ ๋•Œ์ž…๋‹ˆ๋‹ค.
์ฃผ๋กœ ์บ”๋“ค ์Šคํ‹ฑ ์ฐจํŠธ (๊ธˆ์œต ๋ถ€๋ฌธ ์•ฑ)๋ฅผ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ iOS์™€ Android์—์„œ ์ •๋ง ์›ํ•˜๋Š” ๊ฒƒ์€ HTML5 / Javascript ์„ธ๊ณ„์—์„œ HighCharts / HighStock์œผ๋กœ ์‹ค์ œ๋กœ ๋งค์šฐ ์‰ฌ์šด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  1. ์—„์ฒญ๋‚œ ์ˆ˜์˜ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ (10K ์ด์ƒ)
  2. OHLC ๋ฐ์ดํ„ฐ๋ฅผ ์ ์ ˆํ•œ ์Šค์ผ€์ผ ๋ง‰๋Œ€๋กœ ์ž๋™ ํ†ตํ•ฉ (์˜ˆ : ์คŒ ๊ณ„์ˆ˜๊ฐ€ ์ ์ ˆํ•œ ๊ฒฝ์šฐ 1 ์‹œ๊ฐ„ ๋ง‰๋Œ€ ํ‘œ์‹œ, ์ถ•์†Œ ํ•  ๊ฒฝ์šฐ 1m ๋˜๋Š” 1 ์ดˆ ๋ง‰๋Œ€ ํ‘œ์‹œ)
  3. ๋ถ€๋“œ๋Ÿฌ์šด ํŒจ๋‹ ๋ฐ ์Šคํฌ๋กค
  4. ํ™•๋Œ€ / ์ถ•์†Œํ•˜๋ ค๋ฉด ํ•€์น˜
  5. ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ ์‹œ๋ฆฌ์ฆˆ์™€ ์ฃผ์„ ๋ฐ ์‹ญ์ž์„  ์˜ค๋ฒ„๋ ˆ์ด, ์ผ๋ถ€๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ, ์ผ๋ถ€๋Š” ์‚ฌ์šฉ์ž ์ƒํ˜ธ ์ž‘์šฉ (์˜ˆ : ์ œํ•œ ๊ฐ€๊ฒฉ ์„ค์ •)์— ์˜ํ•ด ๋ชจ๋‘ ์›ํ™œํ•˜๊ฒŒ ๋ Œ๋”๋ง ๋จ
  6. (์—ฌ๊ธฐ์— ํ‚ค์ปค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค-HighStock์€ ์ด๊ฒƒ์— ๋„์›€์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค! ๋‚˜์—๊ฒŒ๋Š” ๊ฝค ๋ถ„๋ช…ํ•ด ๋ณด์ด์ง€๋งŒ) ๋ฐ์ดํ„ฐ์˜ ์ฆ๋ถ„ ๊ฐ€์ ธ ์˜ค๊ธฐ (์˜ˆ์ธก ํฌํ•จ) ์˜ˆ๋ฅผ ๋“ค์–ด ์ „์ฒด ๋ฐ์ดํ„ฐ ์„ธํŠธ์— ๋Œ€ํ•œ ์ €ํ•ด์ƒ๋„ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ ์˜ค๊ธฐ ๋ฐ์ง€๋„ ์•ฑ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ hi-rez ๊ฐ€์ ธ ์˜ค๊ธฐ ์ฐจํŠธ์˜ ํ‘œ์‹œ๋œ ์˜์—ญ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ (์˜ˆ : ๋ฐ€๋ฆฌ ์ดˆ "ํ‹ฑ"๋ฐ์ดํ„ฐ)
    ์šฐ๋ฆฌ๋Š” ์•„์ง iOS-Charts๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์žˆ์ง€๋งŒ "ํ•ด์•ผ ํ•  ์ผ"๋ชฉ๋ก์— ์žˆ๊ณ  ์ƒ์œ„์— ๊ฐ€๊นŒ์›Œ ์กŒ๊ธฐ ๋•Œ๋ฌธ์— ์•„์ง ์ฝ”๋“œ ๋‚ด๋ถ€๋ฅผ๋ณ„๋กœ ์‚ดํŽด ๋ณด์ง€ ์•Š์•˜์ง€๋งŒ ๊ณง๋ฐ”๋กœ-์•„๋งˆ๋„ ๋‹ค์Œ ๋‹ฌ์—- ๋‚˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์กฐ์‚ฌ ํ•  ๊ฒƒ์ด๋‹ค.
    ๋ Œ๋”๋ง์œผ๋กœ ๋Œ์•„๊ฐ€์„œ ์ƒํ™ฉ์ด ์™„๋ฒฝํ•˜์ง€ ์•Š์„ ๋•Œ OpenGL์ด ์ถฉ๋Œํ•˜๋Š” ๊ฒฝํ–ฅ์€ ๊ฑฑ์ •๊ฑฐ๋ฆฌ์ž…๋‹ˆ๋‹ค. GLKit์€ GPU ๊ทธ๋ฆฌ๊ธฐ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ SpriteKit์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š”์ง€ (์ฐจํŠธ ๋ Œ๋”๋ง์ด ๊ฒŒ์ž„์„ ๋งŒ๋“œ๋Š” ๋ฐ ์ˆ˜๋ฐฑ๋งŒ ๋งˆ์ผ์ด ์•„๋‹˜) ๊ถ๊ธˆํ•ดํ–ˆ์ง€๋งŒ ์ง€๊ธˆ์€ GLKit์ด ๋” ๋‚˜์€ ํ›„๋ณด๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

LOL @onlyforart , ๋‰ด์บ์Šฌ ๋ธŒ๋ผ์šด ์—์ผ์— ์ €๋ฅผ
๊ท€ํ•˜์˜ ์š”๊ตฌ ์‚ฌํ•ญ (๊ธˆ์œต ์ƒํ’ˆ์— ๋Œ€ํ•ด์„œ๋„ ์ž‘์—…)๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋™์ผํ•œ ๋ฐฐ๋ฅผ ํƒ€๊ณ  ์žˆ์ง€๋งŒ ์˜ˆ,์ด ์ฐจํŠธ์˜ ์‹ค์ œ ๊ทธ๋ฆผ์œผ๋กœ ๋Œ์•„๊ฐ€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ–ฅํ›„ ๋ฐœ๊ฒฌ์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

@onlyforart , @AlBirdie ๊ท€ํ•˜์˜ ํ†ต์ฐฐ๋ ฅ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค :-)

์‚ฌ๋žŒ๋“ค์ด ์šฐ๋ฆฌ ๋„์„œ๊ด€์„ ์œ„ํ•ด ์ƒ์—…์šฉ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์ œํ’ˆ์„ ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์€ ์ •๋ง ์ข‹์€ ์ผ์ž…๋‹ˆ๋‹ค.

์™„๋ฒฝํ•˜๊ฒŒ ๊ด€๋ฆฌ๋˜์ง€ ์•Š์œผ๋ฉด ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜ ๊ธฐ ๋•Œ๋ฌธ์— OpenGL์ด์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ์ฃผ์ €ํ–ˆ์Šต๋‹ˆ๋‹ค. UIKit ์•ฑ์—์„œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค. OpenGL์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒŒ์ž„์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ๊ฒƒ์ด OpenGL ์บ”๋ฒ„์Šค์ด๋ฉฐ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ OpenGL ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜๋ ค๋Š” UIKit ํ˜ธ์ถœ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@onlyforart ์ ์„ ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์š”์ ์€ ์ •ํ™•ํ•˜์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ ์ ์„ ์„ ์š”๊ตฌํ•˜๋Š” ๊ณ ๊ฐ๊ณผ ๊ฒฝํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. Android์—์„œ ์„ฑ๋Šฅ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ณ„์ธต์„ ํ•˜๋“œ์›จ์–ด ๊ณ„์ธต์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ๊ณ , ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ ์„ ์ด ์‹ค์„ ์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ๋งํ–ˆ๊ณ , ๊ทธ๊ฒƒ์ด ๋น„์šฉ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋ชจ๋“  ๊ทธ๋ฆฌ๊ธฐ ์ฝ”๋“œ๋ฅผ OpenGL๋กœ ์˜ฎ๊ธฐ๋Š” ์˜ต์…˜์ด ์žˆ์ง€๋งŒ ํ•œ ์ค„์„ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ์€ ๊ณจ์น˜ ์•„ํ”ˆ ์ผ์ด์ง€๋งŒ ์ ์„ ์— ๋Œ€ํ•œ ํ…์Šค์ฒ˜๋ฅผ ๋งŒ๋“ค์–ด ์ž‘์—… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋น„์šฉ์„ ์ง€๋ถˆํ•˜๊ณ  ์‹ถ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ ์„ ์€ ํ™•์‹คํžˆ ๊ทธ๋‹ค์ง€ ์ค‘์š”ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋งŽ์€ ์†Œ์Œ์„ ๋ƒˆ์Šต๋‹ˆ๋‹ค.

๋‚˜ ์ž์‹ ์„์œ„ํ•œ ๋ฉ”๋ชจ : ๋ Œ๋”๋ง์„ ์œ„ํ•ด GLKit์„ ์‚ฌ์šฉํ•ด๋ณด์‹ญ์‹œ์˜ค. ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€๋ณด์‹ญ์‹œ์˜ค.

๊ทธ๋ฆฌ๊ณ  ๋‚ด๊ฐ€ ๋‹น์‹ ์˜ ๋ชฉ๋ก์„ ์ทจํ•œ๋‹ค๋ฉด :

  1. _ "์—„์ฒญ๋‚œ ์ˆ˜์˜ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ (10K ์ด์ƒ)"_-ํ˜„์žฌ ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค. :) Android์— ๋Œ€ํ•ด ๋งํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. GL๋กœ ์ด๋™ํ•˜๋ฉด ๋” ํฐ PITA๊ฐ€ ๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. GPU์—์„œ ๋ชจ๋“  ๊ทธ๋ฆผ์„ ๊ทธ๋ฆฌ๋Š” ํ•˜๋“œ์›จ์–ด ๊ณ„์ธต์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.
  2. _ "OHLC ๋ฐ์ดํ„ฐ๋ฅผ ํ•ฉ๋ฆฌ์ ์ธ ์ถ•์ฒ™ ๋ง‰๋Œ€๋กœ ์ž๋™ ํ†ตํ•ฉ"_-๊ทผ์‚ฌ ํ•„ํ„ฐ๋ฅผ ๊ณง ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋ฏ€๋กœ์ด ๊ธฐ๋Šฅ์ด ์ฒ˜๋ฆฌ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฝ์„ ์ˆ˜์—†๋Š” 1m ๋ง‰๋Œ€๊ฐ€ ๋งŽ์€ ๋Œ€์‹  ๋Œ€๋žต 1 ์‹œ๊ฐ„ ๋ง‰๋Œ€ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  3. _ "๋ถ€๋“œ๋Ÿฌ์šด ์ด๋™ ๋ฐ ์Šคํฌ๋กค" _-์™„๋ฃŒ :-)
  4. _ "ํ•€์น˜ํ•˜์—ฌ ํ™•๋Œ€ / ์ถ•์†Œ" _-์™„๋ฃŒ :-)
  5. _ "์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ ์‹œ๋ฆฌ์ฆˆ์™€ ์ฃผ์„ ๋ฐ ์‹ญ์ž์„  ์˜ค๋ฒ„๋ ˆ์ด"_-์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ–ˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ํ˜„์žฌ ์—ฌ๋Ÿฌ ์ฐจํŠธ ์œ ํ˜•์„ ์˜ค๋ฒ„๋ ˆ์ด ํ•  ์ˆ˜์žˆ๋Š” ๊ฒฐํ•ฉ ์ฐจํŠธ๊ฐ€ ์žˆ์œผ๋ฉฐ ๋ชจ๋“  ์ฐจํŠธ ์œ ํ˜•์€ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ํ—ˆ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ•ญ์ƒ ViewPortHandler์— ์—ฐ๊ฒฐํ•˜๊ณ  ์ขŒํ‘œ๋ฅผ ๊ฐ€์ ธ ์™€์„œ ๋ฌธ์ž ์œ„์— ์›ํ•˜๋Š” ๊ฒƒ์„ ์˜ค๋ฒ„๋ ˆ์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  6. ๋ฐ์ดํ„ฐ์˜ ์ฆ๋ถ„ ๊ฐ€์ ธ ์˜ค๊ธฐ-์ •์  ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์„ค์ •ํ•˜๊ธฐ์œ„ํ•œ ์ด์ „ API๋ฅผ ๋ณด์œ ํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ์ถ”์ƒํ™” ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค (์ด์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ๋‚ด์žฅ ๋ฐ์ดํ„ฐ ์†Œ์Šค๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค). ์ด๊ฒƒ์€ ๋˜ํ•œ ๊ท€ํ•˜์˜ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋งž์„ ๊ฒƒ ๊ฐ™์ง€๋งŒ ์•„์ง ์–ธ์ œ ๋„์ฐฉํ•  ์ง€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

@danielgindi , ๊ทธ๋“ค์—๊ฒŒ ๊ธฐ๋ถ„ ๋‚˜์˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋‹น์‹ ์ด ๊ฐœ๋ฐœํ•˜๊ณ ์žˆ๋Š” ์ œํ’ˆ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฉ์€ ํ† ๋งˆํ† ์ด์ง€๋งŒ ์—ฌ์ „ํžˆ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์‹ฌ๊ฐํ•œ ๋ฐ˜์ฃฝ์„ ์ฒญ๊ตฌํ•œ๋‹ค๋ฉด ์‚ฌ๋žŒ๋“ค์€ ๊ฒฐ๊ตญ ๋‹ค๋ฅธ ์ œํ’ˆ์œผ๋กœ ์˜ฎ๊ธธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ์ž˜๋ชป์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ €๋Š” ๋ช‡ ๋…„ ๋™์•ˆ ์žฌ๋ฌด ์ฐจํŠธ๋ฅผ ๊ฐœ๋ฐœํ•ด ์™”์œผ๋ฉฐ ํ˜„์žฌ iOS ์šฉ ๊ฑฐ์˜ ๋ชจ๋“  ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•ด ์™”์œผ๋ฉฐ ์‹ค์ œ๋กœ ๊ณผ๊ฑฐ์— ActionScript3์—์„œ ์ž์ฒด ์ฐจํŠธ ์—”์ง„์„ ์ž‘์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. iOSCharts ๋ฐ MPAndroidCharts๋Š” ์‹ค์ œ๋กœ ์ž์‹ ์˜ ์•ฑ์—์„œ ์ฐจํŠธ ์ž‘์„ฑ์ด ํ•„์š”ํ•œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํ˜„์žฌ ๊ถŒ์žฅ ํ•  ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ์ œํ’ˆ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์€ ๊ทธ๊ฒƒ์„ ์ž๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์š”๊ตฌ ์‚ฌํ•ญ๊ณผ ๊ด€๋ จํ•˜์—ฌ, ์—ฌ๋Ÿฌ๋ถ„์ด ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ์„ ํƒ ์‚ฌํ•ญ์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ฐจํŠธ ์ž‘์„ฑ ์ œํ’ˆ ์ค‘ ํ•˜๋‚˜์—์„œ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ํ†ตํ•ฉ์„ ์–ป์—ˆ์œผ๋ฉฐ ๊ณ ๊ฐ์€ ๋Œ€์‹  ๊ณ ์ • ๋œ ๋นˆ๋„๋กœ ๊พธ์ค€ํžˆ ์ด๋™ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ™•๋Œ€ / ์ถ•์†Œํ•˜๋Š” ๋™์•ˆ ๋นˆ๋„๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜ ๊ธˆ์œต ์ฐจํŠธ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ˜ผ๋ž€ ์Šค๋Ÿฌ์šธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ณ ์ • ์ฃผํŒŒ์ˆ˜๋ฅผ ์›ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž๊ฐ€ ์งœ์ฆ์„ ๋ƒˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฐ•์š”ํ•˜๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค! ์ฝ”๋“œ์— ์ด๋ฏธ ํ•„ํ„ฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฉฐ MPAndroidCharts์—์„œ ํ•„ํ„ฐ๋ฅผ ์„ค์ •ํ•˜๋Š” ์†์„ฑ (๋ชจ๋“  ์‚ฌ์šฉ์ž ์ง€์ • ํ•„ํ„ฐ ๋˜๋Š” ๊ธฐ๋ณธ ์ œ๊ณต ํ•„ํ„ฐ)์— ์˜ํ•ด ํ•„ํ„ฐ๊ฐ€ ํ™œ์„ฑํ™”๋˜์—ˆ์ง€๋งŒ ๋‚˜์ค‘์— ๊ตฌ์กฐ์  ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ์ œ๊ฑฐ ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ๊ตฌํ˜„ํ•  ๋•Œ ๊ธฐ๋Šฅ์€ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค-๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ๋˜ ๋‹ค๋ฅธ ๋ฉ‹์ง„ ๊ธฐ๋Šฅ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค :-)

@AlBirdie Re "๋‘ ๋ฒˆ์งธ ์š”๊ตฌ ์‚ฌํ•ญ๊ณผ ๊ด€๋ จํ•˜์—ฌ, ์—ฌ๋Ÿฌ๋ถ„์ด ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ์„ ํƒ ์‚ฌํ•ญ์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ฐจํŠธ ์ œํ’ˆ ์ค‘ ํ•˜๋‚˜์—์„œ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ํ†ตํ•ฉ์„ ์–ป์—ˆ์œผ๋ฉฐ ๊ณ ๊ฐ์€ ๋Œ€์‹  ๊ณ ์ • ๋œ ๋นˆ๋„๋กœ ๊พธ์ค€ํžˆ ์ด๋™ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ™•๋Œ€ ์ค‘ ๋นˆ๋„๋Š” ์ผ๋ฐ˜ ๊ธˆ์œต ์ฐจํŠธ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ˜ผ๋ž€ ์Šค๋Ÿฌ์šธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž๋Š” ๊ณ ์ • ๋œ ์ฃผํŒŒ์ˆ˜๋ฅผ ์›ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์งœ์ฆ์„ ๋ƒˆ์Šต๋‹ˆ๋‹ค. " ์™„์ „ํžˆ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค-์ด๊ฒƒ์€ ์ •๋ณด ์ œ๊ณต / ๋น„ ๊ฑฐ๋ž˜ ์‚ฌ์šฉ์ž๋ฅผ์œ„ํ•œ ์ฐจํŠธ์ž…๋‹ˆ๋‹ค. ๊ฑฐ๋ž˜ ์‚ฌ์šฉ์ž๋Š” ๋‹ค๋ฅธ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@danielgindi Re "๋ฐ์ดํ„ฐ ์†Œ์Šค ์š”์•ฝ"์€ ์‹œ๊ฐ„์ด ์žˆ๋‹ค๋ฉด ๊ธฐ์—ฌํ•  ์ˆ˜์žˆ๋Š” ์ผ์ž…๋‹ˆ๋‹ค. ์•ฝ์†์€ ์—†์ง€๋งŒ ๋ฐฑ ๋กœ๊ทธ์— ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์•„๋ฌด๋„ ๊ทธ๋ฆฌ๊ธฐ ์ฝ”๋“œ๋ฅผ ์Šค๋ ˆ๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ (CALayer.drawsAsynchronously) ๋†€์•˜์Šต๋‹ˆ๊นŒ? ์ด๋Š” ์ฐจํŠธ ์ถ”๊ฐ€, ๊ฐ ๋ฐ์ดํ„ฐ ์„ธํŠธ, ๊ทธ๋ฆฌ๋“œ ๋ฐ ์ถ•์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ๊ทธ๋ฆด ์ˆ˜์žˆ๋Š” ๊ฒฝ์šฐ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CoreGraphics์— ๋Œ€ํ•œ ๋งค์šฐ ๊ฒธ์†ํ•œ ๊ฒฝํ—˜์„ ๊ฐ์•ˆํ•  ๋•Œ (์ฝ๊ธฐ; ์•„๋ฌด๊ฒƒ๋„ ;-)), ๋‚˜๋Š” ์ด๊ฒƒ์œผ๋กœ ์–ด๋–ค ์‹คํ—˜๋„ํ•˜์ง€ ์•Š์•˜์œผ๋ฉฐ GLKit์„ ์ฐพ๊ณ  ์ฐจํŠธ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

10k ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๊ฐ€์žˆ๋Š” ์บ”๋“ค ์Šคํ‹ฑ ์ฐจํŠธ๋ฅผ ํ‘œ์‹œํ•ด์•ผํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— CandleStickChartRenderer.drawDataSet ()์—์„œ ์‹œ๊ฐ„ ์ธก์ •์„ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„์€ dataSet.entryIndex๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ์†Œ์š”๋ฉ๋‹ˆ๋‹ค (76,77 ํ–‰).

์‹ค์ˆ˜ ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ dataSet.entryIndex () ํ˜ธ์ถœ์€ _minX, _maxX ๊ฐ’์ด ํ•ญ์ƒ minx์™€ ๊ฐ™๊ณ , maxx๋Š” dataSet.entryIndex ()์—์„œ ๋ฐ˜ํ™˜๋˜๋ฏ€๋กœ ์ค‘๋ณต๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

10k ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๊ฐ€์žˆ๋Š” ์บ”๋“ค ์Šคํ‹ฑ ์ฐจํŠธ๋ฅผ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ํŒฌ / ์คŒ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝํ•˜์—ฌ
CandleStickChartRenderer.swift, 76,77 ํ–‰ :

var minx = max (dataSet.entryIndex (entry : entryFrom, isEqual : true), 0);
var maxx = min (dataSet.entryIndex (entry : entryTo, isEqual : true) + 1, entries.count);

...์—

var minx = max (_minX, 0);
var maxx = _maxX + 1;

LineChartRenderer๋ฅผ ๋™์ผํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•˜๊ณ  2 ๊ฐœ์˜ ๋ฐ์ดํ„ฐ ์‹œ๋ฆฌ์ฆˆ (๊ฐ๊ฐ 10,000 ๊ฐœ์˜ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ)๊ฐ€์žˆ๋Š” ๊ฒฐํ•ฉ ๋œ ์บ”๋“ค ์Šคํ‹ฑ / ๋ผ์ธ ์ฐจํŠธ๋ฅผ ํ‘œ์‹œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์™€์šฐ, @dorsoft ์˜ ์—„์ฒญ๋‚œ ์„ฑ๋Šฅ ํ–ฅ์ƒ

๋‚˜๋Š” ์ด๊ฒƒ์„ ๋ฐฉ๊ธˆ ํ…Œ์ŠคํŠธํ–ˆ๊ณ  ๋‚ด ๋ˆˆ์„ ๋ฏฟ์„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. 4 ๊ฐœ์˜ CombinedCharts๊ฐ€์žˆ๋Š” iPad 2์—์„œ๋„ ๊ฐ๊ฐ 250 ๊ฐœ์˜ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ์™€ y ์ถ•์˜ ์ž๋™ ์ตœ์†Œ / ์ตœ๋Œ€ ๊ณ„์‚ฐ์„ ํฌํ•จํ•˜๋Š” ์ตœ๋Œ€ 3 ๊ฐœ์˜ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ํ‘œ์‹œํ•˜์—ฌ ๋ชจ๋“  ์ฐจํŠธ๋ฅผ ๋™์‹œ์— ๋งค์šฐ ๋ถ€๋“œ๋Ÿฌ์šด ๋ฐฉ์‹์œผ๋กœ ์ด๋™ ๋ฐ ํ™•๋Œ€ / ์ถ•์†Œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 60fps๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์˜ค๋ž˜๋œ ์žฅ์น˜์— ๋Œ€ํ•ด ์ธ์ƒ์ ์ด๋ฉฐ ์•ž์„œ ์–ธ๊ธ‰ ํ•œ ์ƒ์šฉ OpenGL ์†”๋ฃจ์…˜๋ณด๋‹ค ๋น ๋ฅธ WAY (!)์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ์‹œ๋„ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค :) ๊ทธ๋ฆฌ๊ณ  ๋˜ํ•œ Phil๊ณผ ์˜๋…ผํ•ด์•ผํ•œ๋‹ค
์˜๋ฏธ๊ฐ€ ์žˆ๋Š”์ง€ ์ดํ•ด ...

๋‚˜๋Š” ๋ฐฉ๊ธˆ ์ด๊ฒƒ์„ ์ฝ์—ˆ๊ณ , ๋งค์šฐ ํฅ๋ฏธ๋กœ์›Œ ๋ณด์ด์ง€๋งŒ ์‹ค์ œ๋กœ ๋ชจ๋“  ์‹œ๋‚˜๋ฆฌ์˜ค์— ์ ํ•ฉํ•œ ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ง‘์ค‘์  ์ธ ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค :-)

์บ”๋“ค ์ฐจํŠธ ์„ฑ๋Šฅ ํ–ฅ์ƒ์œผ๋กœ PR์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
ํ–ฅ์ƒ์€ ์ž๋™ ์Šค์ผ€์ผ ์ตœ์†Œ / ์ตœ๋Œ€ ๋ฐ nil ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ ์ €ํ•˜๊ฒŒ ํ…Œ์ŠคํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ์ฐจํŠธ์—์„œ ์ฐจํŠธ์— ์ดˆ๋‹น ๋งŽ์€ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์˜ calcMinMax๊ฐ€ EACH values.append(e) ์งํ›„์— ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

calcMinMax ํ•จ์ˆ˜๋Š” .forEach๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ CPU๊ฐ€ 60 % ์ด์ƒ์˜ ๊ฐ’์„ ๋ฃจํ•‘ํ•˜๋Š” ๋ฐ ์†Œ์š”๋˜๋Š” ์ตœ์†Œ ๋ฐ ์ตœ๋Œ€ ๊ฐ’์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

์ตœ์†Œ / ์ตœ๋Œ€ ๊ณ„์‚ฐ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ array .forEach ๋Œ€์‹  ๊ธฐ๋ณธ for ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‹คํ—˜์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@danielgindi ์ข€ ๋ด์ฃผ์„ธ์š”, ์ •๋ง ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฐ’์— calcMinMax์ž…๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋‚ด ์ฝ”๋“œ์™€ ๋ณด์ด๋Š” ๊ฐ’ ์—์„œ๋งŒ ์ˆ˜๋™์œผ๋กœ ์ตœ์†Œ / ์ตœ๋Œ€ Y ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋ฏ€๋กœ ์ตœ์†Œ / ์ตœ๋Œ€ ์ž๋™ ๊ณ„์‚ฐ์„ ํ™œ์„ฑํ™” / ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  forEach ํ•จ์ˆ˜๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ๋ถ€์šธ์„ ๋…ธ์ถœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

```
open override func calcMinMax()
{
    guard !values.isEmpty else { return }

    _yMax = -Double.greatestFiniteMagnitude
    _yMin = Double.greatestFiniteMagnitude
    _xMax = -Double.greatestFiniteMagnitude
    _xMin = Double.greatestFiniteMagnitude

    values.forEach { calcMinMax(entry: $0) }
}

```

@samueleperricone ๋ณ„๋„์˜ ํ‹ฐ์ผ“์œผ๋กœ ๋งŒ๋“ค์–ด ์ฃผ์‹œ๋ฉด ์šฐ์„  ์ˆœ์œ„๋ฅผ ์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@jjatie ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค, ๊ทธ๋ƒฅ ์—ด์–ด # 3166

iOS ์šฉ ๋ผ์ธ ์ฐจํŠธ์— 13000 ๊ฐœ ์ด์ƒ์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ๋กœ๋“œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ฐจํŠธ๋Š”๋กœ๋“œํ•˜๋Š” ๋™์•ˆ UI๋ฅผ ๊ณ ์ •ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ๋กœ๋“œ ํ›„ ์‚ฌ์šฉ์ž๊ฐ€ ์ž„์˜์˜ ์ง€์ ์„ ์„ ํƒํ•˜๋ฉด ์„ ํƒ ํ•ญ๋ชฉ์„ ๊ฐ•์กฐ ํ‘œ์‹œํ•˜๋Š” ๋ฐ ๋„ˆ๋ฌด ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰