{"id":3121,"date":"2026-05-18T20:52:05","date_gmt":"2026-05-18T20:52:05","guid":{"rendered":"https:\/\/www.yazilimperver.com\/?p=3121"},"modified":"2026-05-18T20:52:05","modified_gmt":"2026-05-18T20:52:05","slug":"duyuru-sdl-painter","status":"publish","type":"post","link":"https:\/\/www.yazilimperver.com\/index.php\/2026\/05\/18\/duyuru-sdl-painter\/","title":{"rendered":"[Duyuru] sdl-painter"},"content":{"rendered":"<div>\n<p id=\"OnZjakE\">Evet, sevgili yaz\u0131l\u0131mperver dostlar\u0131m, hat\u0131rlarsan\u0131z, bir s\u00fcredir daha basit projeler ile SDL3, CI\/CD ve benzeri konulara bak\u0131yor ve <strong><a href=\"https:\/\/gitlab.com\/yazilimperver\/cpp-playground\" target=\"_blank\" rel=\"noopener\">cpp-playground<\/a><\/strong> reposu \u00fczerinden bunlar\u0131 deniyorduk. A\u00e7\u0131k\u00e7as\u0131 o \u00e7al\u0131\u015fmalar\u0131 g\u00fczel bir noktaya getirdik. \u015eimdi orada g\u00f6rd\u00fc\u011f\u00fcm\u00fcz kavram ve ara\u00e7lar\u0131 bir sonraki noktaya ta\u015f\u0131ma vakti geldi. Uzun s\u00fcredir, haz\u0131rl\u0131klar\u0131n\u0131 yapt\u0131\u011f\u0131m k\u00fct\u00fcphane, nihayet belirli bir olgunlu\u011fa eri\u015fti ve art\u0131k yeni bir sayfaya ge\u00e7iyoruz.<\/p>\n<\/div>\n<div>Bu do\u011frultuda da, g\u00f6rselle\u015ftirmeye y\u00f6nelik i\u015fler i\u00e7in art\u0131k SDLPainter olarak isimlendirdi\u011fim yeni bir proje ile devam etmeye karar verdim.<\/div>\n<div>Neden, s\u0131f\u0131rdan b\u00f6yle bir i\u015fe giri\u015ftim? Asl\u0131nda tam olarak s\u0131f\u0131rdan diyemeyiz. Daha \u00f6nce bir \u00e7ok kez benzeri geli\u015ftirme i\u015flerini yapt\u0131k, en son uEngine4 ile de uygulama geli\u015ftirebiliyorduk.<\/div>\n<div>Bununla birlikte, g\u00fcncel ara\u00e7lar ile k\u00fct\u00fcphane ve ara\u00e7lar\u0131 h\u0131zl\u0131 bir \u015fekilde geli\u015ftirme olanaklar\u0131 ortaya \u00e7\u0131kt\u0131. Tahmin edebilece\u011finiz \u00fczere, elimizin alt\u0131nda olan LLM ara\u00e7lar\u0131n\u0131n da katk\u0131s\u0131 b\u00fcy\u00fck \ud83d\ude42<\/div>\n<div>Bu yaz\u0131lar\u0131mda ve k\u00fct\u00fcphanemde olabildi\u011fince onlardan faydalanaca\u011f\u0131m.<\/div>\n<div>Sonu\u00e7 olarak bu k\u00fct\u00fcphaneyi biraz daha SDL3&#8217;e odakl\u0131 yapmak istedim.<\/div>\n<div><\/div>\n<h3><span style=\"color: #0000ff;\"><strong>SDLPainter nedir? <\/strong><\/span><\/h3>\n<div>SDLPainter, Qt&#8217;un `QPainter` s\u0131n\u0131f\u0131ndan ilham alan, SDL3 ve OpenGL 3.3 (ve dahi Vulkan) \u00fczerine in\u015fa edilmi\u015f, modern C++ kullanan bir 2B \u00e7izim k\u00fct\u00fcphanesidir.<\/div>\n<div>Temel amac\u0131, bir pencereye \u00e7izgi, dikd\u00f6rtgen, daire, poligon ve resim \u00e7izmek i\u00e7in temiz, kullan\u0131m\u0131 kolay bir API\/k\u00fct\u00fcphane sunmak.<\/div>\n<div><\/div>\n<div>Peki neden QPainter? Tekerle\u011fi ba\u015ftan icat etmek yerine, bana g\u00f6re C++ ile GUI geli\u015ftirme i\u00e7in en iyi alternatiflerden olan Qt&#8217;ye bakmak daha anlaml\u0131 geldi. Elbette, bu k\u00fct\u00fcphaneye olan a\u015final\u0131\u011f\u0131m\u0131n da bunda etkisi b\u00fcy\u00fck. QPainter&#8217;da da, eski OpenGL&#8217;dekine benzer bir mant\u0131k g\u00fcd\u00fcl\u00fcyor asl\u0131nda, bu da i\u015fi basitle\u015ftiriyor. \u00a0`begin()`, `end()`, `setPen()`, `setBrush()` gibi birka\u00e7 sat\u0131rla ekrana 2B \u015fekiller \u00e7izebiliyorsunuz. Bu API&#8217;lerin arkas\u0131ndaki i\u015flevleri Qt hallediyor.<\/div>\n<div><\/div>\n<div>SDL d\u00fcnyas\u0131nda, g\u00f6rd\u00fc\u011f\u00fcm kadar\u0131yla b\u00f6yle bir k\u00fct\u00fcphane yok; ben de buraya katk\u0131da bulunmak istedim. SDLPainter da, i\u015fte tam olarak bu bo\u015flu\u011fu doldurmak i\u00e7in, hem 2B oyun prototiplerinde hem de ara\u00e7 geli\u015ftirirken i\u015fe yarayaca\u011f\u0131n\u0131 d\u00fc\u015f\u00fcn\u00fcyorum.<\/div>\n<div><\/div>\n<div>Daha \u00f6nce gerek uEngine ile daha eskiden de yine benzer uEngine k\u00fct\u00fcphaneleri ile asl\u0131nda altyap\u0131y\u0131 baya haz\u0131rlad\u0131k. Bunu modern C++ pratikleri ile de birle\u015ftirip b\u00f6yle bir k\u00fct\u00fcphanenin olu\u015fturulmas\u0131n\u0131n faydal\u0131 olaca\u011f\u0131na inand\u0131m. Ayr\u0131ca 2B \u00e7izime y\u00f6nelik de \u00e7e\u015fitli ihtiya\u00e7lar\u0131m oluyordu, bu k\u00fct\u00fcphaneyi oralarda da kullanaca\u011f\u0131m. \u0130leride, uEngine&#8217;in g\u00f6rselle\u015ftirme altyap\u0131s\u0131n\u0131 tamamen bu k\u00fct\u00fcphane ile \u00e7\u00f6z\u00fcyor olabiliriz ya da uEngine5&#8217;e de ge\u00e7ebiliriz, \u00e7\u00fcnk\u00fc neden olmas\u0131n.<\/div>\n<div><\/div>\n<div>Bunun yan\u0131nda, CI\/CD, conan, cmake, docker ve benzeri bir\u00e7ok teknolojiyi de, k\u00fct\u00fcphaneme ekleyerek, azami miktarda kullanmaya gayret edece\u011fim dostlar, bilginiz olsun. Bu sayede, b\u00fct\u00fcn bu ara\u00e7 ve kabiliyetlerin, pratikte nas\u0131l kullan\u0131labilece\u011fine de \u015fahitlik etmi\u015f olacaks\u0131n\u0131z.<\/div>\n<div><\/div>\n<div>Bu yaz\u0131mda bu k\u00fct\u00fcphaneye y\u00f6nelik temel hususlara de\u011finmeyi planl\u0131yorum. Biraz uzun olabilir ama benimle kal\u0131n l\u00fctfen.<\/div>\n<p id=\"VdWgOUq\"><img loading=\"lazy\" decoding=\"async\" width=\"892\" height=\"735\" class=\"alignnone size-full wp-image-3127 \" src=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2026\/05\/img_6a0b7837dc386.png\" alt=\"\" srcset=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2026\/05\/img_6a0b7837dc386.png 892w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2026\/05\/img_6a0b7837dc386-300x247.png 300w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2026\/05\/img_6a0b7837dc386-768x633.png 768w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2026\/05\/img_6a0b7837dc386-500x412.png 500w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2026\/05\/img_6a0b7837dc386-150x124.png 150w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2026\/05\/img_6a0b7837dc386-400x330.png 400w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2026\/05\/img_6a0b7837dc386-800x659.png 800w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2026\/05\/img_6a0b7837dc386-200x165.png 200w\" sizes=\"auto, (max-width: 892px) 100vw, 892px\" \/><\/p>\n<h3><span style=\"color: #0000ff;\"><strong>Tasar\u0131msal Konular<\/strong><\/span><\/h3>\n<div>OpenGL ve arka plan ile ilgilenenler bu ba\u015fl\u0131\u011fa dikkat, di\u011ferleri di\u011fer ba\u015fl\u0131\u011fa ge\u00e7ebilir.<\/div>\n<div>Projenin en \u00f6nemli karar\u0131 backend soyutlamas\u0131 oldu a\u00e7\u0131k\u00e7as\u0131. \u00d6nce direk OpenGL ile ilerlemeyi d\u00fc\u015f\u00fcn\u00fcyordum ama sonra Vulkan&#8217;\u0131 da desteklemenin, hem \u00f6\u011frenme hem de ileride esneklik anlam\u0131nda faydas\u0131 olaca\u011f\u0131n\u0131 d\u00fc\u015f\u00fcnd\u00fcm, bu sebeple ekledim.<\/div>\n<div><\/div>\n<div>\u015eu an OpenGL 3.3 Core Profile ve Vulkan 1.1&#8217;i backend olarak kullan\u0131yorum. Bunu ger\u00e7ekle\u015ftirmek ad\u0131na `IRenderer` ad\u0131nda soyut bir aray\u00fcz ekledim. Genel kullan\u0131m mimarisi a\u015fa\u011f\u0131daki gibi:<\/div>\n<div><\/div>\n<div>SDLPainter (Public API)<\/div>\n<div>\u00a0 \u2192 Transform Stack \/ State<\/div>\n<div>\u00a0 \u00a0 \u2192 Shape Tessellator (backend-agnostic vertex \u00fcretimi)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u2192 IRenderer (soyut aray\u00fcz)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u2192 OpenGLRenderer \u00a0| VulkanRenderer<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2192 SDL3 Platform Layer<\/div>\n<div>`Tessellator` s\u0131n\u0131f\u0131 temelde \u015fekilleri vertex&#8217;lere d\u00f6n\u00fc\u015ft\u00fcr\u00fcyor ve backend&#8217;den tamamen ba\u011f\u0131ms\u0131z. Hem OpenGL hem de Vulkan ile kullan\u0131labilecek. A\u015fa\u011f\u0131da mimarinin daha detayl\u0131 g\u00f6r\u00fcn\u00fcm\u00fcn\u00fc bulabilirsiniz (detaylar i\u00e7in<span style=\"color: #0000ff;\"> <strong><a style=\"color: #0000ff;\" href=\"https:\/\/github.com\/yazilimperver\/sdl-painter\/blob\/main\/doc\/mimari-genel-bakis.md\">https:\/\/github.com\/yazilimperver\/sdl-painter\/blob\/main\/doc\/mimari-genel-bakis.md<\/a><\/strong><\/span>)<\/div>\n<p id=\"EIkXeCP\"><img loading=\"lazy\" decoding=\"async\" width=\"1715\" height=\"878\" class=\"alignnone size-full wp-image-3125 \" src=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2026\/05\/img_6a0b72af5ed0c.png\" alt=\"\" srcset=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2026\/05\/img_6a0b72af5ed0c.png 1715w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2026\/05\/img_6a0b72af5ed0c-300x154.png 300w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2026\/05\/img_6a0b72af5ed0c-1024x524.png 1024w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2026\/05\/img_6a0b72af5ed0c-768x393.png 768w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2026\/05\/img_6a0b72af5ed0c-1536x786.png 1536w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2026\/05\/img_6a0b72af5ed0c-500x256.png 500w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2026\/05\/img_6a0b72af5ed0c-150x77.png 150w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2026\/05\/img_6a0b72af5ed0c-1200x614.png 1200w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2026\/05\/img_6a0b72af5ed0c-400x205.png 400w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2026\/05\/img_6a0b72af5ed0c-800x410.png 800w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2026\/05\/img_6a0b72af5ed0c-200x102.png 200w\" sizes=\"auto, (max-width: 1715px) 100vw, 1715px\" \/><\/p>\n<div>\u00c7izim altyap\u0131s\u0131na y\u00f6nelik konular:<\/div>\n<ul>\n<li><strong>glLineWidth kullanm\u0131yorum: <\/strong>OpenGL&#8217;de `glLineWidth` ile kal\u0131n \u00e7izgi \u00e7izmek platformdan platforma de\u011fi\u015febildi\u011fi i\u00e7in, bu API direk kullan\u0131lm\u0131yor, tavsiye de edilmiyor. Bunun yerine geometri tabanl\u0131 quad \u00e7izim yakla\u015f\u0131m\u0131 kullan\u0131l\u0131yor (\u00e7izginin y\u00f6n\u00fcne dik normal hesaplay\u0131p her iki y\u00f6ne kal\u0131nl\u0131\u011f\u0131n yar\u0131s\u0131 kadar geni\u015fletiliyor ve \u00a0iki \u00fc\u00e7genden olu\u015fan bir quad olarak render ediliyor) ki bu k\u00fct\u00fcphanede de o yakla\u015f\u0131m izlendi.<\/li>\n<li><strong>Adaptif segment say\u0131s\u0131:<\/strong> Daire ve elips \u00e7izmek i\u00e7in OpenGL&#8217;de triangle fan kullan\u0131l\u0131yor. Segment say\u0131s\u0131 sabit de\u011fil, yar\u0131\u00e7apa g\u00f6re de\u011fi\u015fiyor:\n<ul>\n<li>\n<pre class=\"lang:c++ decode:true\">int segments = std::max(16, static_cast&lt;int&gt;(radius * 0.5f));<\/pre>\n<\/li>\n<li>K\u00fc\u00e7\u00fck daireler az segment, b\u00fcy\u00fck daireler daha fazla \u2014 hem performans hem g\u00f6rsel kaliteyi koruma ad\u0131na b\u00f6yle bir yol izliyoruz.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Ear Clipping triangulation<\/strong>: Konkav poligonlar i\u00e7in basit triangle fan kullan\u0131lamad\u0131\u011f\u0131 i\u00e7in `Tessellator` s\u0131n\u0131f\u0131 i\u00e7inde ear clipping algoritmas\u0131 implement edildi.<\/li>\n<li><strong>GLM yok<\/strong> (\u015fimdilik), kendi transform matrisimiz var. Transform stack i\u00e7in 3&#215;3 affine matris kullan\u0131l\u0131yor. uEngine&#8217;de glm kullan\u0131yordum, buraya da ekleyece\u011fim ama acil de\u011fil.<\/li>\n<li><strong>Resim\/Doku y\u00fckleme k\u00fct\u00fcphanesi<\/strong>: Bir di\u011fer konu doku\/texture\/imaj dosyalar\u0131n\u0131n okunmas\u0131 i\u00e7in kullan\u0131lacak k\u00fct\u00fcphane. A\u00e7\u0131k\u00e7as\u0131 bu zamana kadar hep SDL_Image kulland\u0131m. Bu k\u00fct\u00fcphane i\u00e7in stb_image k\u00fct\u00fcphanesi kullanaca\u011f\u0131m.<\/li>\n<\/ul>\n<div>Bu ve buna benzer konulara y\u00f6nelik ADR&#8217;leri de <a href=\"https:\/\/github.com\/yazilimperver\/sdl-painter\/tree\/main\/adr\"><strong>adr dizini<\/strong><\/a> alt\u0131na ekledim. Bu dizini de in\u015fallah zamanla zenginle\u015ftirece\u011fim \ud83d\ude42<\/div>\n<div><\/div>\n<h3><span style=\"color: #0000ff;\"><strong>Genel \u00d6zellikler<\/strong><\/span><\/h3>\n<div>\u00d6zellik anlam\u0131nda, k\u00fct\u00fcphanede bir\u00e7ok kabiliyet bulunuyor. A\u015fa\u011f\u0131da bunlar\u0131 \u00f6zetlemeye \u00e7al\u0131\u015ft\u0131m. Ayr\u0131ca repo i\u00e7erisinde de, doc dizini alt\u0131nda, sizlere yol g\u00f6sterebilecek bir \u00e7ok dosya mevcut.<\/div>\n<div>Ayr\u0131ca, yaz\u0131l\u0131m olu\u015fturma a\u015famas\u0131nda doxygen dok\u00fcmanlar\u0131 da olu\u015fturuluyor.<\/div>\n<h4 id=\"\u00e7izim-primitifleri\" class=\"code-line\" dir=\"auto\" data-line=\"2\">\u00c7izim Primitifleri<\/h4>\n<ul class=\"code-line\" dir=\"auto\" data-line=\"4\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"4\">\u00c7izgi (<code>DrawLine<\/code>)<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"5\">Dikd\u00f6rtgen \u2014 stroke ve fill (<code>DrawRect<\/code>\u00a0\/\u00a0<code>FillRect<\/code>)<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"6\">Daire \u2014 stroke ve fill (<code>DrawCircle<\/code>\u00a0\/\u00a0<code>FillCircle<\/code>)<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"7\">Elips \u2014 stroke ve fill (<code>DrawEllipse<\/code>\u00a0\/\u00a0<code>FillEllipse<\/code>)<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"8\">\u00c7okgen \u2014 stroke ve fill (<code>DrawPolygon<\/code>\u00a0\/\u00a0<code>FillPolygon<\/code>)<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"9\">Polyline (<code>DrawPolyline<\/code>)<\/li>\n<\/ul>\n<h4 id=\"g\u00f6rsel-stiller\" class=\"code-line\" dir=\"auto\" data-line=\"11\">G\u00f6rsel Stiller<\/h4>\n<ul class=\"code-line\" dir=\"auto\" data-line=\"13\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"13\"><strong>Pen:<\/strong>\u00a0renk + kal\u0131nl\u0131k (geometry-based quad;\u00a0<code>glLineWidth<\/code>\u00a0kullan\u0131lm\u0131yor)<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"14\"><strong>Brush:<\/strong>\u00a0dolgu rengi<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"15\"><strong>Opacity:<\/strong>\u00a0global saydaml\u0131k\u00a0<code>[0.0, 1.0]<\/code><\/li>\n<\/ul>\n<h4 id=\"transform-stack\" class=\"code-line\" dir=\"auto\" data-line=\"17\">Transform Stack<\/h4>\n<ul class=\"code-line\" dir=\"auto\" data-line=\"19\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"19\"><code>Translate<\/code>,\u00a0<code>Rotate<\/code>,\u00a0<code>Scale<\/code><\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"20\"><code>Save<\/code>\u00a0\/\u00a0<code>Restore<\/code>\u00a0\u2014 QPainter ile birebir ayn\u0131 semantik<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"21\"><code>ResetTransform<\/code><\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"22\">3\u00d73 affine matris<\/li>\n<\/ul>\n<h4 id=\"clipping\" class=\"code-line\" dir=\"auto\" data-line=\"24\">Clipping<\/h4>\n<ul class=\"code-line\" dir=\"auto\" data-line=\"26\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"26\">Scissor-based rect clip (<code>SetClipRect<\/code>\u00a0\/\u00a0<code>ClearClip<\/code>)<\/li>\n<\/ul>\n<h4 id=\"image--texture\" class=\"code-line\" dir=\"auto\" data-line=\"28\">Image \/ Texture<\/h4>\n<ul class=\"code-line\" dir=\"auto\" data-line=\"30\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"30\">PNG ve JPG y\u00fckleme (stb_image)<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"31\">Tam kaynak rect \u2192 hedef rect \u00f6l\u00e7ekleme<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"32\">Alpha blending deste\u011fi<\/li>\n<\/ul>\n<h4 id=\"metin-phase-4\" class=\"code-line\" dir=\"auto\" data-line=\"34\">Metin \u00c7izimi<\/h4>\n<ul class=\"code-line\" dir=\"auto\" data-line=\"36\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"36\">SDL_ttf 3.x \u00fczerinden font y\u00fckleme<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"37\">Glyph cache<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"38\">Alignment: left \/ center \/ right<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"39\">Rect i\u00e7ine metin yerle\u015ftirme<\/li>\n<\/ul>\n<p id=\"lEPeTNV\"><img loading=\"lazy\" decoding=\"async\" width=\"915\" height=\"677\" class=\"alignnone size-full wp-image-3126 \" src=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2026\/05\/img_6a0b773078685.png\" alt=\"\" srcset=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2026\/05\/img_6a0b773078685.png 915w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2026\/05\/img_6a0b773078685-300x222.png 300w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2026\/05\/img_6a0b773078685-768x568.png 768w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2026\/05\/img_6a0b773078685-500x370.png 500w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2026\/05\/img_6a0b773078685-150x111.png 150w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2026\/05\/img_6a0b773078685-400x296.png 400w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2026\/05\/img_6a0b773078685-800x592.png 800w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2026\/05\/img_6a0b773078685-200x148.png 200w\" sizes=\"auto, (max-width: 915px) 100vw, 915px\" \/><\/p>\n<h4 id=\"tessellator\" class=\"code-line\" dir=\"auto\" data-line=\"41\">Tessellator<\/h4>\n<ul class=\"code-line\" dir=\"auto\" data-line=\"43\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"43\">Backend&#8217;den ba\u011f\u0131ms\u0131z vertex \u00fcretimi<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"44\">Daire\/elips i\u00e7in adaptif segment say\u0131s\u0131:\u00a0<code>max(16, int(radius * 0.5f))<\/code><\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"45\">Konkav \u00e7okgenler i\u00e7in ear clipping triangulation<\/li>\n<\/ul>\n<h4 id=\"render-batcher\" class=\"code-line\" dir=\"auto\" data-line=\"47\">Render Batcher<\/h4>\n<p class=\"code-line\" dir=\"auto\" data-line=\"49\">Her \u00e7izim \u00e7a\u011fr\u0131s\u0131 do\u011frudan GPU&#8217;ya g\u00f6nderilmiyor; <code>RenderBatcher<\/code> vertex&#8217;leri bir arabellekte biriktiriyor ve yaln\u0131zca mod, texture veya opacity de\u011fi\u015fti\u011finde (ya da 8192 vertex limiti doldu\u011funda) <code>Flush()<\/code> ile toplu olarak renderer&#8217;a iletiyor. Bu yakla\u015f\u0131m, \u00f6zellikle \u00e7ok say\u0131da k\u00fc\u00e7\u00fck \u015feklin ard arda \u00e7izildi\u011fi sahnelerde draw call say\u0131s\u0131n\u0131 ciddi \u00f6l\u00e7\u00fcde azalt\u0131yor. \u0130htiyac\u0131m\u0131z olacak \ud83d\ude09<\/p>\n<h4 id=\"backend-deste\u011fi\" class=\"code-line\" dir=\"auto\" data-line=\"51\">Backend Deste\u011fi<\/h4>\n<ul class=\"code-line\" dir=\"auto\" data-line=\"53\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"53\"><strong>OpenGL 3.3 Core<\/strong>\u00a0\u2014 GLAD loader, GLSL shader&#8217;lar<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"54\"><strong>Vulkan 1.1<\/strong>\u00a0\u2014 SPIR-V pipeline (Phase 5, opsiyonel)<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"55\"><code>IRenderer<\/code>\u00a0aray\u00fcz\u00fc \u2014 yeni backend eklemek i\u00e7in tek implementasyon noktas\u0131<\/li>\n<\/ul>\n<h4 id=\"platform-deste\u011fi\" class=\"code-line\" dir=\"auto\" data-line=\"57\">Platform Deste\u011fi<\/h4>\n<ul class=\"code-line\" dir=\"auto\" data-line=\"59\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"59\">Linux (GCC \/ Clang, Ninja)<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"60\">Windows (MSVC, Visual Studio 2022)<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"61\">Linux container i\u00e7inde Windows cross-compile (MinGW-w64), ayr\u0131ca windows i\u00e7in native container<\/li>\n<\/ul>\n<h4 id=\"altyap\u0131\" class=\"code-line\" dir=\"auto\" data-line=\"63\">Altyap\u0131<\/h4>\n<ul class=\"code-line\" dir=\"auto\" data-line=\"65\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"65\">CMake Presets&#8217;ler Mevcut (7 preset: <code>linux-debug<\/code>,\u00a0<code>linux-release<\/code>,\u00a0<code>linux-debug-asan<\/code>,\u00a0<code>windows-debug<\/code>,\u00a0<code>windows-release<\/code>,\u00a0<code>windows-mingw-debug<\/code>,\u00a0<code>windows-mingw-release<\/code>)<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"66\">Conan 2 ba\u011f\u0131ml\u0131l\u0131k y\u00f6netimi \u2014 opsiyonel Vulkan ba\u011f\u0131ml\u0131l\u0131klar\u0131<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"67\">Docker multi-stage: geli\u015ftirme \/ headless CI \/ cross-compile \/ native window\n<ul class=\"code-line\" dir=\"auto\" data-line=\"68\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"68\">CI\/CD&#8217;yi h\u0131zland\u0131rmak ad\u0131na conan install ad\u0131mlar\u0131 da bu imajlar i\u00e7erisine eklendi<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"69\">Gitlab Container Registry kullan\u0131m\u0131<\/li>\n<li dir=\"auto\" data-line=\"69\">Github actions i\u00e7in ise Docker Hub kullan\u0131m\u0131<\/li>\n<\/ul>\n<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"70\">GitLab + Github CI\/CD: build \u2192 test \u2192 quality (clang-format zorunlu, clang-tidy soft)<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"71\">AddressSanitizer + UBSan preset (<code>linux-debug-asan<\/code>)<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"72\">Google C++ Style, clang-format-18<\/li>\n<\/ul>\n<h3><strong><span style=\"color: #0000ff;\">API Nas\u0131l G\u00f6r\u00fcn\u00fcyor?<\/span><\/strong><\/h3>\n<div>API&#8217;nin detaylar\u0131na sonraki yaz\u0131lar\u0131mda girece\u011fim ama burada yine de bir g\u00f6z atmakta sak\u0131nca yok bence.<\/div>\n<pre class=\"lang:c++ decode:true\">#include \"sdl_painter\/painter.h\"\r\n\r\n\/\/ Pencere ve painter'\u0131 olu\u015ftur\r\nsdl_painter::Painter painter(window, sdl_painter::RendererBackend::kOpenGL);\r\n\r\n\/\/ Frame d\u00f6ng\u00fcs\u00fc\r\npainter.Begin();\r\npainter.Clear({30, 30, 30, 255}); \u00a0\/\/ Koyu gri arkaplan\r\n\r\n\/\/ K\u0131rm\u0131z\u0131 kenarl\u0131k, yar\u0131 saydam mavi dolgu\r\npainter.SetPen(sdl_painter::Pen({255, 0, 0, 255}, 2.0f));\r\npainter.SetBrush(sdl_painter::Brush({100, 100, 255, 128}));\r\npainter.DrawRect(50, 50, 200, 150);\r\npainter.DrawCircle(400, 300, 80);\r\n\r\n\/\/ Transform stack: kaydet, d\u00f6nd\u00fcr, geri y\u00fckle\r\npainter.Save();\r\npainter.Translate(400, 300);\r\npainter.Rotate(45.0f);\r\npainter.DrawRect(-50, -50, 100, 100); \u00a0\/\/ 45\u00b0 d\u00f6nm\u00fc\u015f dikd\u00f6rtgen\r\npainter.Restore();\r\n\r\npainter.End();<\/pre>\n<div>E\u011fer Qt&#8217;yi kulland\u0131ysan\u0131z, bu API&#8217;yi hemen tan\u0131yabilirsiniz \ud83d\ude42<\/div>\n<div><\/div>\n<div>K\u00fct\u00fcphaneye y\u00f6nelik, \u00f6rneklere examples\/ dizini alt\u0131ndan ula\u015fabilirsiniz. \u00d6rnekleri \u015fimdilik faz olarak isimlendirdim. Basit kabiliyetlerden, daha kapsaml\u0131 kabliyetlere temel \u00f6zellikleri g\u00f6steriyor. \u0130leride bunlar\u0131 zengile\u015ftirebiliriz. \u00d6n\u00fcm\u00fczdeki yaz\u0131lar\u0131mda, kabiliyetlere de\u011finirken bunlar\u0131n \u00fczerinden ge\u00e7ece\u011fim.<\/div>\n<div><\/div>\n<div>Ayr\u0131ca, bir yandan da uygulamalar\u0131 geli\u015ftirmeyi planl\u0131yorum. Onlar muhtemelen farkl\u0131 repolarda olacak.<\/div>\n<div><\/div>\n<h3><span style=\"color: #0000ff;\"><strong>Yaz\u0131 Plan\u0131m<\/strong><\/span><\/h3>\n<p>Gelelim bundan sonra, buna y\u00f6nelik yaz\u0131lar\u0131ma. Yaz\u0131lar\u0131m\u0131, kabiliyetlere g\u00f6re b\u00f6lmeye \u00e7al\u0131\u015faca\u011f\u0131m ve bir geli\u015ftirici g\u00fcnl\u00fcp\u00fc notlar\u0131 tad\u0131nda olacak. Asl\u0131nda mevcut \u00f6rnekler de size bu konua fikir verebilir. \u0130lk yaz\u0131lar\u0131m muhtemelen \u015fu ba\u015fl\u0131klardan olu\u015facak:<\/p>\n<div>&#8211; CMake, Conan 2, Docker ve CI\/CD altyap\u0131s\u0131 (bu da ciddi zaman ald\u0131)<\/div>\n<div>&#8211; OpenGL backend + temel primitifler + Renderer Batcher<\/div>\n<div>&#8211; Transform stack (save\/restore, rotate, scale)<\/div>\n<div>&#8211; Image\/texture \u00e7izimi<\/div>\n<div>&#8211; Metin \u00e7izimi<\/div>\n<div>&#8211; Vulkan backendi<\/div>\n<div>&#8211; \u00d6rnek uygulamalar<\/div>\n<div>&#8211; Android portu<\/div>\n<div>&#8211; vb.<\/div>\n<div><\/div>\n<h3><strong><span style=\"color: #0000ff;\">Sonu\u00e7<\/span><\/strong><\/h3>\n<div>G\u00fczel bir yola girmi\u015f olduk. Sizlere ve nihayetinde SDL toplulu\u011funa faydal\u0131 olacak bir k\u00fct\u00fcphane olur in\u015fallah.<\/div>\n<div>Bununla birlikte Modern C++ yaz\u0131l\u0131m geli\u015ftirme pratiklerinin de nas\u0131l hayata ge\u00e7irildi\u011fini g\u00f6sterme f\u0131rsat\u0131 sunaca\u011f\u0131n\u0131 d\u00fc\u015f\u00fcn\u00fcyorum.<\/div>\n<div>Her t\u00fcrl\u00fc g\u00f6r\u00fc\u015f ve \u00f6nerinizi beklerim. Projenin g\u00fcncel haline a\u015fa\u011f\u0131daki repodan ula\u015fabilirsiniz. \u015eimdilik a\u011f\u0131rl\u0131kl\u0131 gitlab ile ilerleyece\u011fim (ama github i\u00e7in de CI\/CD ad\u0131mlar\u0131n\u0131 ekledim). Sadece bunlar da de\u011fil, SDL3 projelerini derlemek i\u00e7in (hem CI\/CD hem de kendi makinelerinizde) \u00e7e\u015fitli docker imajlar\u0131 da haz\u0131rlad\u0131m. Gitlab&#8217;\u0131n container repository&#8217;si ve DockerHub \u00fczerinden bunlara ula\u015fabilirsiniz. A\u015fa\u011f\u0131daki adreslerden projelerin repolar\u0131na ula\u015fabilirsiniz:<\/div>\n<div><\/div>\n<div><span style=\"color: #0000ff;\"><strong>https:\/\/gitlab.com\/yazilimperver\/sdl-painter<\/strong><\/span><\/div>\n<div><span style=\"color: #0000ff;\"><a style=\"color: #0000ff;\" href=\"https:\/\/github.com\/yazilimperver\/sdl-painter\"><strong>https:\/\/github.com\/yazilimperver\/sdl-painter<\/strong><\/a><\/span><\/div>\n<div><span style=\"color: #0000ff;\"><strong><a style=\"color: #0000ff;\" href=\"https:\/\/hub.docker.com\/r\/yazilimperver\/sdl-painter\/tags\">https:\/\/hub.docker.com\/r\/yazilimperver\/sdl-painter\/tags<\/a><\/strong><\/span><\/div>\n<div><\/div>\n<div>K\u00fct\u00fcphaneye y\u00f6nelik dok\u00fcmanlar i\u00e7in ise:<\/div>\n<div><span style=\"color: #0000ff;\"><strong><a style=\"color: #0000ff;\" href=\"https:\/\/github.com\/yazilimperver\/sdl-painter\/tree\/main\/doc\">https:\/\/github.com\/yazilimperver\/sdl-painter\/tree\/main\/doc<\/a><\/strong><\/span><\/div>\n<div>ve<\/div>\n<div><span style=\"color: #0000ff;\"><strong><a style=\"color: #0000ff;\" href=\"https:\/\/sdl-painter-37ecba.gitlab.io\/\">https:\/\/sdl-painter-37ecba.gitlab.io\/<\/a><\/strong><\/span><\/div>\n<div>adreslerinden ula\u015fabilirsiniz.<\/div>\n<div><\/div>\n<div>Sonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek dile\u011fiyle.<\/div>\n<div><\/div>\n<div>Takipte kal\u0131n.<\/div>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Evet, sevgili yaz\u0131l\u0131mperver dostlar\u0131m, hat\u0131rlarsan\u0131z, bir s\u00fcredir daha basit projeler ile SDL3, CI\/CD ve benzeri konulara bak\u0131yor ve cpp-playground reposu \u00fczerinden bunlar\u0131 deniyorduk. A\u00e7\u0131k\u00e7as\u0131 o \u00e7al\u0131\u015fmalar\u0131 g\u00fczel bir noktaya getirdik. \u015eimdi orada g\u00f6rd\u00fc\u011f\u00fcm\u00fcz kavram ve ara\u00e7lar\u0131 bir sonraki noktaya ta\u015f\u0131ma vakti geldi. Uzun s\u00fcredir, haz\u0131rl\u0131klar\u0131n\u0131 yapt\u0131\u011f\u0131m k\u00fct\u00fcphane, nihayet belirli bir olgunlu\u011fa eri\u015fti ve art\u0131k yeni&#8230; <a class=\"more-link\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2026\/05\/18\/duyuru-sdl-painter\/\">Continue reading <span class=\"meta-nav\">&#8594;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":3128,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[10,41,25],"tags":[1209,820,1037,1211,546,51,1139,829,1212,915,334,1096,1210,471,1207,1155,1208,278,1038],"class_list":["post-3121","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c","category-modern-c","category-oyun-gelistirme","tag-2d-viusalization","tag-ci","tag-ci-cd","tag-docker","tag-doxygen","tag-github","tag-github-actions","tag-gitlab","tag-gitlab-ci","tag-linux","tag-opengl","tag-painter","tag-qpainter","tag-qt","tag-sdl-ttf","tag-sdl3","tag-vulkan","tag-windows","tag-yaml"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>[Duyuru] sdl-painter - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2026\/05\/18\/duyuru-sdl-painter\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"[Duyuru] sdl-painter - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"og:description\" content=\"Evet, sevgili yaz\u0131l\u0131mperver dostlar\u0131m, hat\u0131rlarsan\u0131z, bir s\u00fcredir daha basit projeler ile SDL3, CI\/CD ve benzeri konulara bak\u0131yor ve cpp-playground reposu \u00fczerinden bunlar\u0131 deniyorduk. A\u00e7\u0131k\u00e7as\u0131 o \u00e7al\u0131\u015fmalar\u0131 g\u00fczel bir noktaya getirdik. \u015eimdi orada g\u00f6rd\u00fc\u011f\u00fcm\u00fcz kavram ve ara\u00e7lar\u0131 bir sonraki noktaya ta\u015f\u0131ma vakti geldi. Uzun s\u00fcredir, haz\u0131rl\u0131klar\u0131n\u0131 yapt\u0131\u011f\u0131m k\u00fct\u00fcphane, nihayet belirli bir olgunlu\u011fa eri\u015fti ve art\u0131k yeni... Continue reading &#8594;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.yazilimperver.com\/index.php\/2026\/05\/18\/duyuru-sdl-painter\/\" \/>\n<meta property=\"og:site_name\" content=\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-05-18T20:52:05+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2026\/05\/img_6a0b791309bae.png\" \/>\n\t<meta property=\"og:image:width\" content=\"432\" \/>\n\t<meta property=\"og:image:height\" content=\"375\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"yaz\u0131l\u0131mperver\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"yaz\u0131l\u0131mperver\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2026\/05\/18\/duyuru-sdl-painter\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2026\/05\/18\/duyuru-sdl-painter\/\"},\"author\":{\"name\":\"yaz\u0131l\u0131mperver\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"headline\":\"[Duyuru] sdl-painter\",\"datePublished\":\"2026-05-18T20:52:05+00:00\",\"dateModified\":\"2026-05-18T20:52:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2026\/05\/18\/duyuru-sdl-painter\/\"},\"wordCount\":1762,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"keywords\":[\"2d viusalization\",\"CI\",\"CI\/CD\",\"docker\",\"doxygen\",\"Github\",\"github actions\",\"gitlab\",\"gitlab-ci\",\"linux\",\"OpenGL\",\"painter\",\"qpainter\",\"Qt\",\"sdl-ttf\",\"SDL3\",\"vulkan\",\"windows\",\"YAML\"],\"articleSection\":[\"C++\",\"Modern C++\",\"Oyun Geli\u015ftirme\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2026\/05\/18\/duyuru-sdl-painter\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2026\/05\/18\/duyuru-sdl-painter\/\",\"url\":\"https:\/\/www.yazilimperver.com\/index.php\/2026\/05\/18\/duyuru-sdl-painter\/\",\"name\":\"[Duyuru] sdl-painter - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#website\"},\"datePublished\":\"2026-05-18T20:52:05+00:00\",\"dateModified\":\"2026-05-18T20:52:05+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2026\/05\/18\/duyuru-sdl-painter\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2026\/05\/18\/duyuru-sdl-painter\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2026\/05\/18\/duyuru-sdl-painter\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Ana sayfa\",\"item\":\"https:\/\/www.yazilimperver.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"[Duyuru] sdl-painter\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.yazilimperver.com\/#website\",\"url\":\"https:\/\/www.yazilimperver.com\/\",\"name\":\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"description\":\"Payla\u015fmak g\u00fczeldir.\",\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.yazilimperver.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\",\"name\":\"yaz\u0131l\u0131mperver\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"contentUrl\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"caption\":\"yaz\u0131l\u0131mperver\"},\"logo\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"[Duyuru] sdl-painter - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.yazilimperver.com\/index.php\/2026\/05\/18\/duyuru-sdl-painter\/","og_locale":"tr_TR","og_type":"article","og_title":"[Duyuru] sdl-painter - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","og_description":"Evet, sevgili yaz\u0131l\u0131mperver dostlar\u0131m, hat\u0131rlarsan\u0131z, bir s\u00fcredir daha basit projeler ile SDL3, CI\/CD ve benzeri konulara bak\u0131yor ve cpp-playground reposu \u00fczerinden bunlar\u0131 deniyorduk. A\u00e7\u0131k\u00e7as\u0131 o \u00e7al\u0131\u015fmalar\u0131 g\u00fczel bir noktaya getirdik. \u015eimdi orada g\u00f6rd\u00fc\u011f\u00fcm\u00fcz kavram ve ara\u00e7lar\u0131 bir sonraki noktaya ta\u015f\u0131ma vakti geldi. Uzun s\u00fcredir, haz\u0131rl\u0131klar\u0131n\u0131 yapt\u0131\u011f\u0131m k\u00fct\u00fcphane, nihayet belirli bir olgunlu\u011fa eri\u015fti ve art\u0131k yeni... Continue reading &#8594;","og_url":"https:\/\/www.yazilimperver.com\/index.php\/2026\/05\/18\/duyuru-sdl-painter\/","og_site_name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","article_published_time":"2026-05-18T20:52:05+00:00","og_image":[{"width":432,"height":375,"url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2026\/05\/img_6a0b791309bae.png","type":"image\/png"}],"author":"yaz\u0131l\u0131mperver","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"yaz\u0131l\u0131mperver","Tahmini okuma s\u00fcresi":"9 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.yazilimperver.com\/index.php\/2026\/05\/18\/duyuru-sdl-painter\/#article","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2026\/05\/18\/duyuru-sdl-painter\/"},"author":{"name":"yaz\u0131l\u0131mperver","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"headline":"[Duyuru] sdl-painter","datePublished":"2026-05-18T20:52:05+00:00","dateModified":"2026-05-18T20:52:05+00:00","mainEntityOfPage":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2026\/05\/18\/duyuru-sdl-painter\/"},"wordCount":1762,"commentCount":0,"publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"keywords":["2d viusalization","CI","CI\/CD","docker","doxygen","Github","github actions","gitlab","gitlab-ci","linux","OpenGL","painter","qpainter","Qt","sdl-ttf","SDL3","vulkan","windows","YAML"],"articleSection":["C++","Modern C++","Oyun Geli\u015ftirme"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.yazilimperver.com\/index.php\/2026\/05\/18\/duyuru-sdl-painter\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.yazilimperver.com\/index.php\/2026\/05\/18\/duyuru-sdl-painter\/","url":"https:\/\/www.yazilimperver.com\/index.php\/2026\/05\/18\/duyuru-sdl-painter\/","name":"[Duyuru] sdl-painter - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/#website"},"datePublished":"2026-05-18T20:52:05+00:00","dateModified":"2026-05-18T20:52:05+00:00","breadcrumb":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2026\/05\/18\/duyuru-sdl-painter\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.yazilimperver.com\/index.php\/2026\/05\/18\/duyuru-sdl-painter\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.yazilimperver.com\/index.php\/2026\/05\/18\/duyuru-sdl-painter\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Ana sayfa","item":"https:\/\/www.yazilimperver.com\/"},{"@type":"ListItem","position":2,"name":"[Duyuru] sdl-painter"}]},{"@type":"WebSite","@id":"https:\/\/www.yazilimperver.com\/#website","url":"https:\/\/www.yazilimperver.com\/","name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","description":"Payla\u015fmak g\u00fczeldir.","publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.yazilimperver.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb","name":"yaz\u0131l\u0131mperver","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/","url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","contentUrl":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","caption":"yaz\u0131l\u0131mperver"},"logo":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/3121","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/comments?post=3121"}],"version-history":[{"count":6,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/3121\/revisions"}],"predecessor-version":[{"id":3132,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/3121\/revisions\/3132"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media\/3128"}],"wp:attachment":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media?parent=3121"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/categories?post=3121"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/tags?post=3121"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}