{"id":2877,"date":"2023-11-11T22:21:26","date_gmt":"2023-11-11T22:21:26","guid":{"rendered":"https:\/\/www.yazilimperver.com\/?p=2877"},"modified":"2023-11-11T22:21:26","modified_gmt":"2023-11-11T22:21:26","slug":"uengine4-seruveni-zamanlayicilar","status":"publish","type":"post","link":"https:\/\/www.yazilimperver.com\/index.php\/2023\/11\/11\/uengine4-seruveni-zamanlayicilar\/","title":{"rendered":"uEngine4 Ser\u00fcveni \u2013 Zamanlay\u0131c\u0131lar"},"content":{"rendered":"<div>Merhaba sevgili yaz\u0131l\u0131mperver dostlar\u0131m. Bug\u00fcnk\u00fc yaz\u0131mda, uEngine4 i\u00e7erisinde sessiz sessiz duran bir proje hakk\u0131nda yaz\u0131yor olaca\u011f\u0131m: &#8220;time&#8221;. \u0130sminden de anla\u015f\u0131laca\u011f\u0131 \u00fczere, bu proje i\u00e7erisinde, projelerinizde ihtiya\u00e7 duyabilece\u011fini bir \u00e7ok zamanlay\u0131c\u0131, \u00f6l\u00e7\u00fcm ve benzeri ara\u00e7lar\u0131 bulabilirsiniz. Mevcut uEngine i\u00e7erisinde de, bu s\u0131n\u0131flar\u0131 kullan\u0131yor olaca\u011f\u0131m. Ayr\u0131ca, bunlar\u0131n bir k\u0131sm\u0131na \u00e7e\u015fitli yaz\u0131lar\u0131mda da yer vermi\u015ftim. Yaz\u0131lar\u0131n ba\u011flant\u0131lar\u0131n\u0131 da ekliyor olaca\u011f\u0131m.<\/div>\n<div><\/div>\n<div>Uzun bir s\u00fcre \u00f6nce, zamanlay\u0131c\u0131lar ve benzeri ara\u00e7lar\u0131n bir \u00e7o\u011fu i\u00e7in platformlara (i\u015fletim sistemleri) \u00f6zg\u00fc k\u00fct\u00fcphane ve yakla\u015f\u0131mlar\u0131 kullanmak zorundayd\u0131k. C++ 11 ile art\u0131k bunlar\u0131n bir \u00e7o\u011funu, standart olarak sunulan API&#8217;leri kullanarak ger\u00e7ekle\u015ftirebiliyoruz. Elbette bir ad\u0131m \u00f6teye gitmek istedi\u011fimiz zaman platforma \u00f6zg\u00fc bir tak\u0131m k\u00fct\u00fcphane ya da API&#8217;leri kullanmam\u0131z gereken durumlar oluyor ama \u00e7o\u011funlukla standart ara\u00e7lar i\u015finiz g\u00f6recektir. A\u015fa\u011f\u0131ya C++ 11 ile sunulan std::chrono yaz\u0131lar\u0131m\u0131 ekliyorum, devam etmeden g\u00f6z atman\u0131zda fayda olabilir:<\/div>\n<ul>\n<li><strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2021\/07\/23\/haftalik-c-39-stdchrono-1\/\">https:\/\/www.yazilimperver.com\/index.php\/2021\/07\/23\/haftalik-c-39-stdchrono-1\/<\/a><\/span><\/strong><\/li>\n<li><strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2021\/08\/16\/haftalik-c-39-stdchrono-2-clocks-time_point\/\">https:\/\/www.yazilimperver.com\/index.php\/2021\/08\/16\/haftalik-c-39-stdchrono-2-clocks-time_point\/<\/a><\/span><\/strong><\/li>\n<\/ul>\n<div><\/div>\n<div>Bu s\u0131n\u0131flara ili\u015fkin kaynak kodlara a\u015fa\u011f\u0131daki adresten ula\u015fabilirsiniz:<\/div>\n<div><\/div>\n<div><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/github.com\/yazilimperver\/uEngine4\/tree\/main\/code\/src\/infra\/time\">https:\/\/github.com\/yazilimperver\/uEngine4\/tree\/main\/code\/src\/infra\/time<\/a><\/strong><\/span><\/div>\n<div><\/div>\n<div>O zaman daha fazla vakit kaybetmeden s\u0131n\u0131flara g\u00f6z atal\u0131m.<\/div>\n<h2><span style=\"color: #0000ff;\"><strong>Timestamp<\/strong><\/span><\/h2>\n<div>Bu s\u0131n\u0131f, sizlere anl\u0131k zamana ili\u015fkin \u00e7e\u015fitli bilgileri sunan statik API&#8217;lerden olu\u015fmaktad\u0131r.<\/div>\n<div>Ayr\u0131ca ilgili yaz\u0131ya da <span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2020\/11\/09\/haftalik-c-33-zaman-bilgisi-etiketi\/\">https:\/\/www.yazilimperver.com\/index.php\/2020\/11\/09\/haftalik-c-33-zaman-bilgisi-etiketi\/<\/a><\/strong><\/span> adresinden ula\u015fabilirsiniz.<\/div>\n<div><\/div>\n<div>Temel olarak sunulan API&#8217;ler ve i\u015flevleri \u015fu \u015fekilde:<\/div>\n<div><\/div>\n<div>\n<pre class=\"lang:c++ decode:true\">\/\/ Basit bir \u015fekilde Epoch anindan bu yana ge\u00e7en zaman\u0131 milisaniye cinsinden almak i\u00e7in\r\nstatic uint64_t getTimestampInMsec();\r\n\r\n\/\/ Asagidaki fonksiyon mevcut zaman\u0131 (Tue Sep 27 14:21:13 2011) format\u0131nda doner\r\nstatic std::string getTimeString();\r\n\r\n\/\/ Bu fonksiyon, mevcut zaman bilgisini biraz daha say\u0131sal ve kay\u0131tlar icin uygun bir formatta sunuyor bizlere\r\n\/\/ Format \u015fu \u015fekilde \"2020-11-09 20:19:45.217\"\r\nstatic std::string getDetailedTimeString();\r\n\r\n\/\/ Bu fonksiyon bir \u00f6nceki metodun ayn\u0131s\u0131n\u0131 verilen zaman i\u00e7in yap\u0131yor. \u00d6zellikle \u00e7e\u015fitli kanallar arac\u0131l\u0131\u011f\u0131\r\n\/\/ ile edindi\u011finiz zaman bilgisini g\u00f6rselle\u015ftirmek i\u00e7in faydal\u0131 olabilir\r\nstatic std::string getDetailedTimeString(uint64_t msec);<\/pre>\n<h2><span style=\"color: #0000ff;\"><strong>ChronoUtil<\/strong><\/span><\/h2>\n<\/div>\n<div>Bir \u00f6nceki s\u0131n\u0131fa benzer \u015fekilde, C++ 11 ile sunulan \u00fc\u00e7 temel zamanlay\u0131c\u0131 kavram\u0131 olan s\u00fcre, saat ve zaman noktas\u0131 kabiliyetlerini kullanarak, zamana ili\u015fkin \u00e7e\u015fitli bilgilerin sunulmas\u0131 amac\u0131 ile kullan\u0131labilecek s\u0131n\u0131ft\u0131r (s\u0131n\u0131fa ve ilgili kavramlar i\u00e7in <strong><a href=\"https:\/\/www.yazilimperver.com\/index.php\/2021\/08\/16\/haftalik-c-39-stdchrono-2-clocks-time_point\/\"><span style=\"color: #008000;\">https:\/\/www.yazilimperver.com\/index.php\/2021\/08\/16\/haftalik-c-39-stdchrono-2-clocks-time_point<\/span>\/<\/a><\/strong> yaz\u0131ma g\u00f6z atabilirsiniz).<\/div>\n<div><\/div>\n<div>S\u0131n\u0131f ile sunulan API&#8217;ler ise a\u015fa\u011f\u0131daki gibidir:<\/div>\n<div><\/div>\n<div>\n<pre class=\"lang:c++ decode:true \">\/\/ timepoint nesnelerimizi time_t tipine, onu da takvimsel saat g\u00f6sterimine (\u00f6r. Mon May 23 13:44:00 2011), \u00e7evirmek i\u00e7in kullanaca\u011f\u0131m\u0131z fonksiyondurdur\r\nstatic std::string ToString (const std::chrono::system_clock::time_point&amp; tp);\r\n\r\n\r\n\/\/ Takvimsel zaman bilgilerinden, sistem saatinin time_point nesnesine \u00e7evirmek i\u00e7in kullanabilece\u011fimi fonksiyondur\r\nstatic std::chrono::system_clock::time_point MakeTimePoint (int32_t year, int32_t mon, int32_t day,\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0int32_t hour, int32_t min, int32_t sec = 0);\r\n\r\n\r\n\/\/ timepoint nesnelerimizi time_t tipine, onu da takvimsel saat g\u00f6sterimine (\u00f6r. Mon May 23 13:44:00 2011), \u00e7evirmek i\u00e7in kullanaca\u011f\u0131m\u0131z fonksiyondurdur\r\nstatic std::string ToString (const std::chrono::system_clock::time_point&amp; tp);\r\n\r\n\/\/ Uc tip saat tipinin sonuclarini gosterir\r\nstatic void PrintThreeClockTypeInfo();\r\n\r\n\/\/ Sistem saatine iliskin bilgileri basalim\r\nstatic void PrintSystemClockInfo();\r\n\r\n\/\/ Saati \u015fablon parametresi olarak ge\u00e7irelim\r\ntemplate &lt;typename T&gt;\r\nstatic void PrintClockInfo(){\u00a0\r\n\u00a0 \u00a0 std::cout &lt;&lt; \"\u00a0 precision: \" &lt;&lt; T::num &lt;&lt; \"\/\" &lt;&lt; T::den &lt;&lt; \" second \" &lt;&lt; \"\\n\";\r\n\u00a0 \u00a0 typedef typename std::ratio_multiply&lt;T,std::kilo&gt;::type MillSec;\r\n\u00a0 \u00a0 typedef typename std::ratio_multiply&lt;T,std::mega&gt;::type MicroSec;\r\n\u00a0 \u00a0 std::cout &lt;&lt; std::fixed;\r\n\u00a0 \u00a0 std::cout &lt;&lt; \"\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\" &lt;&lt; static_cast&lt;double&gt;(MillSec::num)\/MillSec::den &lt;&lt; \" milliseconds \"\u00a0 \u00a0&lt;&lt; \"\\n\";\r\n\u00a0 \u00a0 std::cout &lt;&lt; \"\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\" &lt;&lt; static_cast&lt;double&gt;(MicroSec::num)\/MicroSec::den &lt;&lt; \" microseconds \" &lt;&lt; \"\\n\";\r\n}<\/pre>\n<h2><strong><span style=\"color: #0000ff;\">StopWatch<\/span><\/strong><\/h2>\n<\/div>\n<div>Bu s\u0131n\u0131f ise, uygulamalar\u0131n\u0131z i\u00e7erisinde ihtiya\u00e7 duyaca\u011f\u0131n\u0131z \u00f6l\u00e7\u00fcm i\u015fleri i\u00e7in kullan\u0131labilecek API&#8217;leri sunmaktad\u0131r. Bunu da yaparken, C++ 11 ile sunulan std::chrono k\u00fct\u00fcphanesini kullan\u0131r. Sunulan API&#8217;ler \u015fu \u015fekildedir:<\/div>\n<div><\/div>\n<div>\n<pre class=\"lang:c++ decode:true\">\/* @brief Referans zamanindan bu yana gecen mikrosaniyeyi doner. *\/\r\nuint64_t ElapsedUs() const;\r\n\u00a0 \u00a0\r\n\/* @brief Referans zamanindan bu yana gecen milisaniyeyi doner. *\/\r\nuint64_t ElapsedMs() const;\r\n\r\n\/* @brief Referans zamanindan bu yana gecen saniyeyi doner. *\/\r\nuint64_t ElapsedSec() const;\r\n\r\n\/* @brief\u00a0 Sayacimiz sifirlar\r\n* @return Guncellenen referans zamanini (o an\u0131) donelim\u00a0 *\/\r\nClockToUse::time_point Restart();<\/pre>\n<h2><strong><span style=\"color: #0000ff;\">SleepUtil<\/span><\/strong><\/h2>\n<\/div>\n<div>Bu s\u0131n\u0131f Windows ve di\u011fer sistemler i\u00e7in hassas bekleme API&#8217;leri sunan bir s\u0131n\u0131ft\u0131r. Temelde iki API sunmaktad\u0131r.<\/div>\n<div><\/div>\n<div>\n<pre class=\"lang:c++ decode:true \">\/\/ Mikrosaniye seviyesinde windows uygulamalari icin bekleme sunar\r\nstatic void USleep(int64_t sleepInUSec);\r\n\r\n\/\/ Platform bagimsiz hassas bekleme kabiliyeti sunar\r\nstatic void PreciseSleep(double seconds);<\/pre>\n<p>bunlardan ilki Windows API&#8217;lerini kullanarak, hassas bekleme i\u015flevi sizlere sunar. Bunu da yaparken 100 nanosaniye seviyelerinde girdileri destekler ve SetWaitableTimer API&#8217;si kullan\u0131l\u0131r (<span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/api\/synchapi\/nf-synchapi-setwaitabletimer\">https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/api\/synchapi\/nf-synchapi-setwaitabletimer<\/a><\/strong><\/span>). Bu API sizlere milisaniye ve 100 nanosaniye \u00e7\u00f6z\u00fcn\u00fcrl\u00fcklerde, haber veren zamanlay\u0131c\u0131lar ayarlaman\u0131za olanak sa\u011flar.<\/p>\n<\/div>\n<div><\/div>\n<div>\u0130kinci API ise, sizlere platformunuzdan ba\u011f\u0131ms\u0131z olarak &#8220;Welford&#8221; algoritmas\u0131n\u0131 kullanarak bir bekleme fonksiyonalitesi sunar.<\/div>\n<div>Bu algoritma temelde i\u015flemci kullan\u0131m\u0131 ile zamanlay\u0131c\u0131 hassasiyetini dengeler. Detaylar i\u00e7in <span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/www.wikiwand.com\/en\/Algorithms_for_calculating_variance#\/Welford's_online_algorithm\">https:\/\/www.wikiwand.com\/en\/Algorithms_for_calculating_variance#\/Welford&#8217;s_online_algorithm<\/a><\/strong><\/span>&#8216;na g\u00f6z atabilirsiniz.<\/div>\n<h2><span style=\"color: #0000ff;\"><strong>FPSTimer<\/strong><\/span><\/h2>\n<div>Bu s\u0131n\u0131f, \u00f6zellikle oyun ve grafiksel uygulamalarda, saniyede \u00e7izilen sahnelerin miktar\u0131n\u0131 kontrol etmek i\u00e7in kullanman\u0131za olanak sa\u011flayan bir s\u0131n\u0131ft\u0131r. Detaylar i\u00e7in <a href=\"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/09\/oyun-donguleri\/\"><strong><span style=\"color: #008000;\">https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/09\/oyun-donguleri\/<\/span><\/strong><\/a> yaz\u0131ma g\u00f6z atabilirsiniz. SdlApplication i\u00e7erisinde de kullan\u0131m\u0131n\u0131 g\u00f6rebilirsiniz.<\/div>\n<h2><span style=\"color: #0000ff;\"><strong>ThreadedTimer<\/strong><\/span><\/h2>\n<div>Evet, zamana bilgilerini g\u00f6r\u00fcnt\u00fcleme, bekletme ve \u00f6l\u00e7meye ili\u015fkin servisleri sunan s\u0131n\u0131flara g\u00f6z att\u0131ktan sonra, s\u0131ra geldi ger\u00e7ekten zamanlay\u0131c\u0131 kabiliyetini sunan bir s\u0131n\u0131fa g\u00f6z atmakta. Peki, ne kast ediyorum? Basit\u00e7e, belirli bir s\u00fcre sonra beni haberdar eden ya da verece\u011fim bir s\u00fcrede bir beni haberdar edecek basit ve modern bir ara\u00e7.<\/div>\n<div><\/div>\n<div>\u00d6ncelikle bunu yapman\u0131za olanak sa\u011flayacak, platform ba\u011f\u0131ml\u0131 API&#8217;ler bulunmak ile birlikte, bu s\u0131n\u0131fta asl\u0131nda, temel C++ s\u0131n\u0131flar\u0131n\u0131 kullanarak bunu nas\u0131l yapabilece\u011fimiz g\u00f6receksiniz ki bu da asl\u0131nda ayr\u0131 bir thread i\u00e7erisinden bunu takip etmek olacak (not: bunu milyon tane farkl\u0131 y\u00f6ntemi olabilece\u011finin fark\u0131nday\u0131m, bu s\u0131n\u0131f\u0131n onlardan birisi oldu\u011funu kabul edebilirsiniz, di\u011ferleri i\u00e7in <strong><a href=\"https:\/\/letmegooglethat.com\/?q=c%2B%2B+timer+example\"><span style=\"color: #008000;\">https:\/\/letmegooglethat.com\/?q=c%2B%2B+timer+example<\/span><\/a><\/strong>)<\/div>\n<div><\/div>\n<div>Bu s\u0131n\u0131f ile sunulan API&#8217;ye a\u015fa\u011f\u0131dan ula\u015fabilirsiniz:<\/div>\n<div>\n<pre class=\"lang:c++ decode:true \">\u00a0 \u00a0 \/\/! @brief Milisaniye cinsinden verilen s\u00fcre ge\u00e7ince function'\u0131 \u00e7a\u011f\u0131racak olan zamanlay\u0131c\u0131 API'sidir\r\n\u00a0 \u00a0 void OneShot(auto function, int32_t delayInMsec);\r\n\r\n\r\n\u00a0 \u00a0 \/\/! @brief Milisaniye cinsinden verilen s\u00fcrede bir function'\u0131 \u00e7a\u011f\u0131racak olan zamanlay\u0131c\u0131 API'sidir\r\n\u00a0 \u00a0 void Periodic(auto function, int32_t intervalInMsec);\r\n\u00a0 \u00a0\u00a0\r\n\u00a0 \u00a0 \/\/! @brief Zamanlay\u0131c\u0131 threadini sonland\u0131rmak i\u00e7in kullan\u0131lacak olan API'dir\r\n\u00a0 \u00a0 void Stop();<\/pre>\n<p>Burada ilk akl\u0131n\u0131za tak\u0131lan function kullan\u0131m\u0131 olabilir. Bunun yerine, bu s\u0131n\u0131fa ya da API&#8217;lere IListener tarz\u0131nda bir aray\u00fcz ge\u00e7irerek de, ilgili s\u0131n\u0131f\u0131 haberdar edebilirsiniz. Ben ise bu halini kullanaca\u011f\u0131m.<\/p>\n<\/div>\n<h2><span style=\"color: #0000ff;\"><strong>StoppableTimer<\/strong><\/span><\/h2>\n<div>Evet, yaz\u0131mda de\u011finece\u011fim son zamanlay\u0131c\u0131 s\u0131n\u0131f bu olacak. \u0130sminden de anlayaca\u011f\u0131n\u0131z \u00fczere, durdurulabilir bir zamanlay\u0131c\u0131 kabiliyeti sunan bir s\u0131n\u0131f. Bu noktada, bir dakika yaz\u0131l\u0131mperver, bir \u00f6nceki s\u0131n\u0131f zaten bunu sunmuyor muydu? diye sorabilirsiniz. Dikkatli okuyucular\u0131m, ilgili s\u0131n\u0131f\u0131n bunu sunmad\u0131\u011f\u0131n\u0131 g\u00f6recekler. Tek at\u0131ml\u0131k zamanlay\u0131c\u0131 ve periyodik API&#8217;ler i\u00e7in zaman\u0131n dolmas\u0131n\u0131 beklemek zorundas\u0131n\u0131z, neden peki? \u00c7\u00fcnk\u00fc bizim takip etti\u011fimi yakla\u015f\u0131m i\u00e7in (uyutmak) bu m\u00fcmk\u00fcn olmuyor, fakat platforma \u00f6zg\u00fc API&#8217;ler i\u00e7in bu m\u00fcmk\u00fcn olabilir. Peki bunu nas\u0131l kotarabiliriz?<\/div>\n<div>Yard\u0131m \u00e7ok uzakta de\u011fil, &#8220;condition variables&#8221; \ud83d\ude42 Evet, condition variables ile sunulan ve belirli bir s\u00fcre beklemeye olanak sa\u011flayan <em>wait_for<\/em> API&#8217;si bizim i\u00e7in bi\u00e7ilmez bir kaftan (bu konuya ili\u015fkin yaz\u0131m i\u00e7in ise ba\u011flant\u0131s\u0131na g\u00f6z atabilirsiniz).<\/div>\n<div>Bu API hem bekleme i\u015flevini sunuyor hem de durdurmak istedi\u011fimizde, ge\u00e7irdi\u011fimiz predicate sayesinde beklemeyi de sonland\u0131rmaya olanak sa\u011fl\u0131yor. A\u015fa\u011f\u0131ya ilgili API&#8217;nin nas\u0131l kullan\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6rebilirsiniz:<\/div>\n<div><\/div>\n<div>\n<pre class=\"lang:c++ decode:true \">\u00a0 mThread = std::thread([=]() {\r\n\u00a0 \u00a0 \u00a0 \u00a0 auto lock = std::unique_lock&lt;std::mutex&gt;(mMutex);\r\n\u00a0 \u00a0 \u00a0 \u00a0 mCV.wait_for(lock, duration, [this]() { return mShouldStop.load(); });\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 if (!mShouldStop)\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 callback();\r\n\u00a0 \u00a0 \u00a0 \u00a0 });<\/pre>\n<p>durdurmak i\u00e7in de:<\/p>\n<\/div>\n<div>\n<pre class=\"lang:c++ decode:true\">mCV.notify_one();<\/pre>\n<p>API&#8217;sini \u00e7a\u011f\u0131rman\u0131z yeterli.<\/p>\n<\/div>\n<div><\/div>\n<div>Bu s\u0131n\u0131f i\u00e7erisinde periyodik API&#8217;yi eklemedim ama isterseniz bunu eklemek bir \u00f6nceki s\u0131n\u0131fa bakarak zor olmayacakt\u0131r.<\/div>\n<div><\/div>\n<div>Evet sevgili dostlar, bu yaz\u0131mda, uEngine4 ile sunulan zamanlay\u0131c\u0131 ile ilgili s\u0131n\u0131flara bir bak\u0131\u015f atm\u0131\u015f olduk. Bundan sonra, bir yaz\u0131m\u0131 da, boost taraf\u0131ndan sunulan zamanlay\u0131c\u0131lara ay\u0131rmay\u0131 planl\u0131yorum. O zamana kadar bol kodlu g\u00fcnler \ud83d\ude42<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Merhaba sevgili yaz\u0131l\u0131mperver dostlar\u0131m. Bug\u00fcnk\u00fc yaz\u0131mda, uEngine4 i\u00e7erisinde sessiz sessiz duran bir proje hakk\u0131nda yaz\u0131yor olaca\u011f\u0131m: &#8220;time&#8221;. \u0130sminden de anla\u015f\u0131laca\u011f\u0131 \u00fczere, bu proje i\u00e7erisinde, projelerinizde ihtiya\u00e7 duyabilece\u011fini bir \u00e7ok zamanlay\u0131c\u0131, \u00f6l\u00e7\u00fcm ve benzeri ara\u00e7lar\u0131 bulabilirsiniz. Mevcut uEngine i\u00e7erisinde de, bu s\u0131n\u0131flar\u0131 kullan\u0131yor olaca\u011f\u0131m. Ayr\u0131ca, bunlar\u0131n bir k\u0131sm\u0131na \u00e7e\u015fitli yaz\u0131lar\u0131mda da yer vermi\u015ftim. Yaz\u0131lar\u0131n ba\u011flant\u0131lar\u0131n\u0131 da&#8230; <a class=\"more-link\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2023\/11\/11\/uengine4-seruveni-zamanlayicilar\/\">Continue reading <span class=\"meta-nav\">&#8594;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"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":[33],"tags":[],"class_list":["post-2877","post","type-post","status-publish","format-standard","hentry","category-haber"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>uEngine4 Ser\u00fcveni \u2013 Zamanlay\u0131c\u0131lar - 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\/2023\/11\/11\/uengine4-seruveni-zamanlayicilar\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"uEngine4 Ser\u00fcveni \u2013 Zamanlay\u0131c\u0131lar - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"og:description\" content=\"Merhaba sevgili yaz\u0131l\u0131mperver dostlar\u0131m. Bug\u00fcnk\u00fc yaz\u0131mda, uEngine4 i\u00e7erisinde sessiz sessiz duran bir proje hakk\u0131nda yaz\u0131yor olaca\u011f\u0131m: &#8220;time&#8221;. \u0130sminden de anla\u015f\u0131laca\u011f\u0131 \u00fczere, bu proje i\u00e7erisinde, projelerinizde ihtiya\u00e7 duyabilece\u011fini bir \u00e7ok zamanlay\u0131c\u0131, \u00f6l\u00e7\u00fcm ve benzeri ara\u00e7lar\u0131 bulabilirsiniz. Mevcut uEngine i\u00e7erisinde de, bu s\u0131n\u0131flar\u0131 kullan\u0131yor olaca\u011f\u0131m. Ayr\u0131ca, bunlar\u0131n bir k\u0131sm\u0131na \u00e7e\u015fitli yaz\u0131lar\u0131mda da yer vermi\u015ftim. Yaz\u0131lar\u0131n ba\u011flant\u0131lar\u0131n\u0131 da... Continue reading &#8594;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.yazilimperver.com\/index.php\/2023\/11\/11\/uengine4-seruveni-zamanlayicilar\/\" \/>\n<meta property=\"og:site_name\" content=\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2023-11-11T22:21:26+00:00\" \/>\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=\"5 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\/2023\/11\/11\/uengine4-seruveni-zamanlayicilar\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2023\/11\/11\/uengine4-seruveni-zamanlayicilar\/\"},\"author\":{\"name\":\"yaz\u0131l\u0131mperver\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"headline\":\"uEngine4 Ser\u00fcveni \u2013 Zamanlay\u0131c\u0131lar\",\"datePublished\":\"2023-11-11T22:21:26+00:00\",\"dateModified\":\"2023-11-11T22:21:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2023\/11\/11\/uengine4-seruveni-zamanlayicilar\/\"},\"wordCount\":1081,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"articleSection\":[\"Haber\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2023\/11\/11\/uengine4-seruveni-zamanlayicilar\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2023\/11\/11\/uengine4-seruveni-zamanlayicilar\/\",\"url\":\"https:\/\/www.yazilimperver.com\/index.php\/2023\/11\/11\/uengine4-seruveni-zamanlayicilar\/\",\"name\":\"uEngine4 Ser\u00fcveni \u2013 Zamanlay\u0131c\u0131lar - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#website\"},\"datePublished\":\"2023-11-11T22:21:26+00:00\",\"dateModified\":\"2023-11-11T22:21:26+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2023\/11\/11\/uengine4-seruveni-zamanlayicilar\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2023\/11\/11\/uengine4-seruveni-zamanlayicilar\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2023\/11\/11\/uengine4-seruveni-zamanlayicilar\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Ana sayfa\",\"item\":\"https:\/\/www.yazilimperver.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"uEngine4 Ser\u00fcveni \u2013 Zamanlay\u0131c\u0131lar\"}]},{\"@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":"uEngine4 Ser\u00fcveni \u2013 Zamanlay\u0131c\u0131lar - 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\/2023\/11\/11\/uengine4-seruveni-zamanlayicilar\/","og_locale":"tr_TR","og_type":"article","og_title":"uEngine4 Ser\u00fcveni \u2013 Zamanlay\u0131c\u0131lar - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","og_description":"Merhaba sevgili yaz\u0131l\u0131mperver dostlar\u0131m. Bug\u00fcnk\u00fc yaz\u0131mda, uEngine4 i\u00e7erisinde sessiz sessiz duran bir proje hakk\u0131nda yaz\u0131yor olaca\u011f\u0131m: &#8220;time&#8221;. \u0130sminden de anla\u015f\u0131laca\u011f\u0131 \u00fczere, bu proje i\u00e7erisinde, projelerinizde ihtiya\u00e7 duyabilece\u011fini bir \u00e7ok zamanlay\u0131c\u0131, \u00f6l\u00e7\u00fcm ve benzeri ara\u00e7lar\u0131 bulabilirsiniz. Mevcut uEngine i\u00e7erisinde de, bu s\u0131n\u0131flar\u0131 kullan\u0131yor olaca\u011f\u0131m. Ayr\u0131ca, bunlar\u0131n bir k\u0131sm\u0131na \u00e7e\u015fitli yaz\u0131lar\u0131mda da yer vermi\u015ftim. Yaz\u0131lar\u0131n ba\u011flant\u0131lar\u0131n\u0131 da... Continue reading &#8594;","og_url":"https:\/\/www.yazilimperver.com\/index.php\/2023\/11\/11\/uengine4-seruveni-zamanlayicilar\/","og_site_name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","article_published_time":"2023-11-11T22:21:26+00:00","author":"yaz\u0131l\u0131mperver","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"yaz\u0131l\u0131mperver","Tahmini okuma s\u00fcresi":"5 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.yazilimperver.com\/index.php\/2023\/11\/11\/uengine4-seruveni-zamanlayicilar\/#article","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2023\/11\/11\/uengine4-seruveni-zamanlayicilar\/"},"author":{"name":"yaz\u0131l\u0131mperver","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"headline":"uEngine4 Ser\u00fcveni \u2013 Zamanlay\u0131c\u0131lar","datePublished":"2023-11-11T22:21:26+00:00","dateModified":"2023-11-11T22:21:26+00:00","mainEntityOfPage":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2023\/11\/11\/uengine4-seruveni-zamanlayicilar\/"},"wordCount":1081,"commentCount":0,"publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"articleSection":["Haber"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.yazilimperver.com\/index.php\/2023\/11\/11\/uengine4-seruveni-zamanlayicilar\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.yazilimperver.com\/index.php\/2023\/11\/11\/uengine4-seruveni-zamanlayicilar\/","url":"https:\/\/www.yazilimperver.com\/index.php\/2023\/11\/11\/uengine4-seruveni-zamanlayicilar\/","name":"uEngine4 Ser\u00fcveni \u2013 Zamanlay\u0131c\u0131lar - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/#website"},"datePublished":"2023-11-11T22:21:26+00:00","dateModified":"2023-11-11T22:21:26+00:00","breadcrumb":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2023\/11\/11\/uengine4-seruveni-zamanlayicilar\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.yazilimperver.com\/index.php\/2023\/11\/11\/uengine4-seruveni-zamanlayicilar\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.yazilimperver.com\/index.php\/2023\/11\/11\/uengine4-seruveni-zamanlayicilar\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Ana sayfa","item":"https:\/\/www.yazilimperver.com\/"},{"@type":"ListItem","position":2,"name":"uEngine4 Ser\u00fcveni \u2013 Zamanlay\u0131c\u0131lar"}]},{"@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\/2877","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=2877"}],"version-history":[{"count":2,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/2877\/revisions"}],"predecessor-version":[{"id":2879,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/2877\/revisions\/2879"}],"wp:attachment":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media?parent=2877"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/categories?post=2877"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/tags?post=2877"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}