Philip์ด MPAndroidCharts๋ก ํ ๋ฐฉ์์ผ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฑ๋ฅ์ ํฅ์์ํฌ ๊ณํ์ด ์์ต๋๊น?
๊ทธ์ ํฅ์๋ ๊ธฐ๋ฅ์ผ๋ก ์ด์ Android์์ ์์ฒ ๊ฐ์ ๋ฐ์ดํฐ ํฌ์ธํธ๋ฅผ ์ํํ๊ฒ ๋ ๋๋ง ํ ์ ์์ต๋๋ค.
ios-charts ๊ตฌํ์ ํ ๋์ ์ดํด ๋ดค๊ณ , ์ต์ ์ฑ๋ฅ ํฅ์์์ด โโ์๋ MPAndroidCharts ๊ตฌํ์ ๊ธฐ๋ฐ์ผ๋ก ํ ๊ฒ์ผ๋ก ๋ณด์์ต๋๋ค.
์์ฒ ๊ฐ์ ํฌ์ธํธ๋ฅผ ๋ ๋๋งํ๋ ๊ฒ์ ๋ชจ๋ ์์ ์ฉ ๋ฒ์ ์ ํจ๊ณผ์ ์ผ๋ก ์ธ๋ชจ ์๊ฒ ๋ง๋๋ ๊ฒ์ด๋ฏ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ง๋ํ ํ๋ฌ์ค๊ฐ ๋ ๊ฒ์ ๋๋ค (๋๋ถ๋ถ์ ์ด์จ๋ ์๊ฐ๊ณผ ๋ ๋ญ๋น ์).
Android ๋ฒ์ ์ ์๋ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ๋ ๋๋ง ์ฝ๋ ๋ด๋ถ์ ๋ง์ ์ถ๊ฐ ํ ๋น (๋ฐฐ์ด)์ด์์ต๋๋ค. ๋ ๋๋ง ์ฝ๋ ๋ด๋ถ์ ๋ฉ๋ชจ๋ฆฌ ๋ฅผ ํ ๋นํ๋ฉด ์๋ฉ๋๋ค . ๊ทธ๋์ @PhilJay ๋ ํด๋น ์ฝ๋๋ฅผ ๋ฏธ๋ฆฌ ํ ๋น ๋ Buffer๋ก ์ฎ๊ธฐ๊ณ ๋ ๋๋งํ๋ ๋์ ๋ ๋๋ง ๊ณ์ฐ์ Buffer ํด๋์ค์ ์์ํ์ต๋๋ค.
๋ ๋๋ง ๊ณ์ฐ์ Buffer ํด๋์ค๋ก ์ด๋ํ์ง ์๊ธฐ๋ก ์ ํํ์ง๋ง ํ์ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋์ผํ ๋ฐฉ์์ผ๋ก ๋ฏธ๋ฆฌ ํ ๋นํ์ง๋ง ๋ ๋๋ง ์ฝ๋์ ๋์ผํ ๋ฃจํ์์ ๋ ๋๋ง ๊ณ์ฐ์ ์ํํฉ๋๋ค. ์ด๋ ๊ฒํ๋ฉด ์ฝ๋๋ฅผ ํจ์ฌ ์ฝ๊ฒ ๊ด๋ฆฌ ํ ์ โโ์์ต๋๋ค.
๋ํ ๋ ๋๋ง ๊ณ์ฐ์ด ์ถ๊ฐ ํจ์ ๋ด์์ ์ํ๋์ง ์๊ณ ๋ฐ์ดํฐ๊ฐ ๋ ๋๋ง ์ฝ๋ ๋ด์์ ๋ ๋ฒ์ด ์๋๋ผ ํ ๋ฒ๋ง ๋ฐ๋ณต๋๋ค๋ ๊ฒ์ ์ฑ๋ฅ ํฅ์์ ๋๋ค.
Btw, Swift์์ ์ฑ๋ฅ์ ์ด์จ๋ Java๋ณด๋ค ํจ์ฌ ๋ซ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๋ฐฐ์ด์ ์ฌ์ ํ ๋นํ์ง ์๊ณ ๋ ์ฑ๋ฅ์ด ํฅ์๋๋ ๊ฒ์ ๋ณด์์ ๊ฒ์ ๋๋ค.
๊ทธ๋ํฝ์ผ๋ก ์ค๋ช ํ๊ธฐ ์ํด ๋ ๋๋ง ์ฝ๋์์ ์ํ๋๊ณ ์๋ ์์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ํ 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.
์์ฝ :
์ค๋ช
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 ์ถ์์๋ ์คํธ๋กํฌ๊ฐ์์ ๋์ ๋ค๋ฆ
๋๋ค.
๋ด ์๋ ๋ชฉ๋ก์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ด๋ป๊ฒ ๋ CoreGraphics๋ฅผ ํฅ์ ์ํค๊ฑฐ๋ ๋ ๋๋ง์ ์ผ๋ถ๋ฅผ
GPU
- ๋ชจ๋ ์ ๋๋ฉ์ด์ ํ๋ ์์ ๋ฏธ๋ฆฌ ๋ ๋๋งํฉ๋๋ค. ์ ๋๋ฉ์ด์ ์์์ด ์ง์ฐ๋๊ณ
์๋นํ ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋น- ์ ๋๋ฉ์ด์ ์ ์ข ๋ฅ๋ฅผ ์ ํํ๋ ๋ง์คํน ์์ด๋์ด
๋ค๋ฅธ ์์ด๋์ด๊ฐ ์๋ค๋ฉด ๋ฃ๊ณ ์ถ์ต๋๋ค!
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์ผ๋ก ์ค์ ๋ก ๋งค์ฐ ์ฌ์ด ๊ฒ์
๋๋ค.
LOL @onlyforart , ๋ด์บ์ฌ ๋ธ๋ผ์ด ์์ผ์ ์ ๋ฅผ
๊ทํ์ ์๊ตฌ ์ฌํญ (๊ธ์ต ์ํ์ ๋ํด์๋ ์์
)๊ณผ ๊ด๋ จํ์ฌ ๋์ผํ ๋ฐฐ๋ฅผ ํ๊ณ ์์ง๋ง ์,์ด ์ฐจํธ์ ์ค์ ๊ทธ๋ฆผ์ผ๋ก ๋์๊ฐ ๋ณด๊ฒ ์ต๋๋ค. ํฅํ ๋ฐ๊ฒฌ์ ๊ธฐ๋ํฉ๋๋ค.
@onlyforart , @AlBirdie ๊ทํ์ ํต์ฐฐ๋ ฅ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค :-)
์ฌ๋๋ค์ด ์ฐ๋ฆฌ ๋์๊ด์ ์ํด ์์ ์ฉ ์ํฐํ๋ผ์ด์ฆ ์ ํ์ ๋ฒ๋ฆฌ๋ ๊ฒ์ ๋ณด๋ ๊ฒ์ ์ ๋ง ์ข์ ์ผ์ ๋๋ค.
์๋ฒฝํ๊ฒ ๊ด๋ฆฌ๋์ง ์์ผ๋ฉด ์ถฉ๋์ด ๋ฐ์ํ ์ ์๋ค๋ ๊ฒ์ ์์ ๊ธฐ ๋๋ฌธ์ OpenGL์ด์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ ์ฃผ์ ํ์ต๋๋ค. UIKit ์ฑ์์๋ ๋ถ๊ฐ๋ฅํ์ต๋๋ค. OpenGL์ ์ฌ์ฉํ์ฌ ๊ฒ์์ ๋ง๋๋ ๊ฒฝ์ฐ ๋ชจ๋ ๊ฒ์ด OpenGL ์บ๋ฒ์ค์ด๋ฉฐ ๋ฐฑ๊ทธ๋ผ์ด๋์์ OpenGL ๋ ๋๋ง์ ์ ๋ฐํ๋ ค๋ UIKit ํธ์ถ์ ๋ํด ๊ฑฑ์ ํ ํ์๊ฐ ์์ต๋๋ค.
@onlyforart ์ ์ ์ ๋ํ ๊ทํ์ ์์ ์ ์ ํํ์ง๋ง ๋ถํํ๋ ์ ์ ์ ์๊ตฌํ๋ ๊ณ ๊ฐ๊ณผ ๊ฒฝํ์ด ์์ต๋๋ค. Android์์ ์ฑ๋ฅ์ ๋์ด๊ธฐ ์ํด ๊ฐ๋ฐ์๊ฐ ๊ณ์ธต์ ํ๋์จ์ด ๊ณ์ธต์ผ๋ก ๋ณ๊ฒฝํด์ผํ๋ ๊ฒฝ์ฐ๊ฐ ์์๊ณ , ํด๋ผ์ด์ธํธ์๊ฒ ์ ์ ์ด ์ค์ ์ด ๋ ๊ฒ์ด๋ผ๊ณ ๋งํ๊ณ , ๊ทธ๊ฒ์ด ๋น์ฉ์ ๋๋ค. ๋ฌผ๋ก ๋ชจ๋ ๊ทธ๋ฆฌ๊ธฐ ์ฝ๋๋ฅผ OpenGL๋ก ์ฎ๊ธฐ๋ ์ต์ ์ด ์์ง๋ง ํ ์ค์ ๊ทธ๋ฆฌ๋ ๊ฒ์ ๊ณจ์น ์ํ ์ผ์ด์ง๋ง ์ ์ ์ ๋ํ ํ ์ค์ฒ๋ฅผ ๋ง๋ค์ด ์์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ค์ ๋น์ฉ์ ์ง๋ถํ๊ณ ์ถ์ง ์์๊ธฐ ๋๋ฌธ์ ์ ์ ์ ํ์คํ ๊ทธ๋ค์ง ์ค์ํ์ง ์์์ง๋ง ๊ทธ๊ฒ์ ๋ํด ๋ง์ ์์์ ๋์ต๋๋ค.
๋ ์์ ์์ํ ๋ฉ๋ชจ : ๋ ๋๋ง์ ์ํด GLKit์ ์ฌ์ฉํด๋ณด์ญ์์ค. ๋ฌด์จ ์ผ์ด ์ผ์ด๋๋์ง๋ณด์ญ์์ค.
๊ทธ๋ฆฌ๊ณ ๋ด๊ฐ ๋น์ ์ ๋ชฉ๋ก์ ์ทจํ๋ค๋ฉด :
@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๋ฅผ ๊ณ ์ ํฉ๋๋ค. ๋ํ๋ก๋ ํ ์ฌ์ฉ์๊ฐ ์์์ ์ง์ ์ ์ ํํ๋ฉด ์ ํ ํญ๋ชฉ์ ๊ฐ์กฐ ํ์ํ๋ ๋ฐ ๋๋ฌด ๋ง์ ์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
iOS ์ฉ ๋ผ์ธ ์ฐจํธ์ 13000 ๊ฐ ์ด์์ ๋ ์ฝ๋๋ฅผ๋ก๋ํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฐจํธ๋๋ก๋ํ๋ ๋์ UI๋ฅผ ๊ณ ์ ํฉ๋๋ค. ๋ํ๋ก๋ ํ ์ฌ์ฉ์๊ฐ ์์์ ์ง์ ์ ์ ํํ๋ฉด ์ ํ ํญ๋ชฉ์ ๊ฐ์กฐ ํ์ํ๋ ๋ฐ ๋๋ฌด ๋ง์ ์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค.