{"id":164,"date":"2017-12-09T17:43:35","date_gmt":"2017-12-09T17:43:35","guid":{"rendered":"http:\/\/www.yazilimperver.com\/?p=164"},"modified":"2018-01-02T20:18:07","modified_gmt":"2018-01-02T20:18:07","slug":"oyun-donguleri","status":"publish","type":"post","link":"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/09\/oyun-donguleri\/","title":{"rendered":"Oyun Geli\u015ftirme &#8211; Oyun D\u00f6ng\u00fcleri"},"content":{"rendered":"<div>Evet arkada\u015flar oyun geli\u015ftirme ile ilgili ilk yaz\u0131m\u0131z\u0131 her oyunun temel ta\u015flar\u0131ndan biri olan oyun d\u00f6ng\u00fclerine ay\u0131raca\u011f\u0131z.<\/div>\n<div>Her ne kadar son y\u0131llarda art\u0131k tek bir d\u00f6ng\u00fc \u00fczerinden d\u00f6nen oyunlardan ziyade task\/thread tabanl\u0131 di\u011fer bir deyi\u015fle b\u00fct\u00fcn i\u015fleri par\u00e7alara b\u00f6l\u00fcp bunlar\u0131 ba\u011f\u0131ms\u0131z \u015fekilde \u00e7al\u0131\u015ft\u0131rmaya dayal\u0131 y\u00f6ntemler ortaya \u00e7\u0131ksa da b\u00fct\u00fcn bunlar\u0131n temeli yine de basit oyun d\u00f6ng\u00fclerine dayanmaktad\u0131r.<\/div>\n<div><\/div>\n<div>\u0130nternet \u00fczerinde bu konu ile ilgili olduk\u00e7a \u00e7e\u015fitli kaynaklar bulunmakta ve bu sayfan\u0131n sonunda da bunlar\u0131n aras\u0131nda bana g\u00f6re en faydal\u0131 olanlar\u0131 sizler ile payla\u015faca\u011f\u0131m. Bu yaz\u0131m\u0131 da asl\u0131nda bu kaynaklar\u0131n derlenmi\u015f ve s\u00fcz\u00fclm\u00fc\u015f hali olarak d\u00fc\u015f\u00fcnebilirsiniz. Tabi bu kaynaklar\u0131n \u00e7o\u011funun da ingilizce olmas\u0131 t\u00fcrk\u00e7e kaynak bulman\u0131n zorlu\u011fu da b\u00f6yle bir yaz\u0131 haz\u0131rlamaya itti.<\/div>\n<div><\/div>\n<div>Yava\u015f ve h\u0131zl\u0131 donan\u0131mlarda olan durumlar\u0131n ayr\u0131ca ifade edilmesi benim de ho\u015fuma gitti ve ben de bu yaz\u0131mda bu yakla\u015f\u0131mlar\u0131 bu \u015fekilde ifade etme yoluna gittim.<\/div>\n<div><\/div>\n<div>Farkl\u0131 oyun d\u00f6ng\u00fc yakla\u015f\u0131mlar\u0131n\u0131 ba\u015fl\u0131klar alt\u0131nda vererek her birine ili\u015fkin a\u00e7\u0131klamalar\u0131 bunlar\u0131n alt\u0131na eklemeye \u00e7al\u0131\u015faca\u011f\u0131m.<\/div>\n<h2><span style=\"color: #3366ff;\"><span style=\"text-decoration: underline;\"><strong>Y\u00f6ntem 1 : Allah ne verdiyse \ud83d\ude03<\/strong><\/span>:<\/span><\/h2>\n<div>\u00a0A\u015fa\u011f\u0131da C++ programlama dili ile yaz\u0131lm\u0131\u015f olan bir oyun d\u00f6ng\u00fcs\u00fcn\u00fc g\u00f6rebilirsiniz. Bu ad\u0131mlar eminim sizlere bir fikir vermi\u015ftir. G\u00f6rebilece\u011finiz en basit oyun d\u00f6ng\u00fcs\u00fc muhtemelen buna benzeyecektir. Bu oyun d\u00f6ng\u00fcs\u00fc genel olarak bir oyun d\u00f6ng\u00fcs\u00fc i\u00e7erisinde neler yap\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6stermek ile birlikte ayn\u0131 zamanda basit oyunlar i\u00e7in kullan\u0131labilecek bir d\u00f6ng\u00fc te\u015fkil etmektedir.<\/div>\n<div>\n<pre class=\"lang:c++ decode:true \" title=\"Y\u00f6ntem 1: Basit Oyun D\u00f6ng\u00fcs\u00fc\">\/\/ Basit bir oyun d\u00f6ng\u00fcs\u00fc\r\nint main()\r\n{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0...\r\n\u00a0 \u00a0 \u00a0while(true)\r\n\u00a0 \u00a0 \u00a0{\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ProcessInputs();\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Update();\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Display();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0 \u00a0 \u00a0...\r\n}<\/pre>\n<p>Burada her bir sat\u0131rda neneler yap\u0131ld\u0131\u011f\u0131ndan k\u0131saca bahsedelim.<\/p>\n<\/div>\n<div>ProcessInputs: Kullan\u0131c\u0131 girdilerini kontrol et. Neler olabilir bunlar:<\/div>\n<ul>\n<li>Klavye tu\u015f bas\u0131m\u0131 (Space ile z\u0131plama),<\/li>\n<li>Fare hareketi (Silah ni\u015fangah\u0131n\u0131 hareket ettirme),<\/li>\n<li>Ak\u0131ll\u0131 telefon ekran\u0131n dokunma (Se\u00e7im), vb.).<\/li>\n<\/ul>\n<div>Update: Gerek kullan\u0131c\u0131 girdileri ile gerekse di\u011fer olay veya etkile\u015fimler \u0131\u015f\u0131\u011f\u0131nda oyunun mevcut durumunu g\u00fcncelle.<\/div>\n<ul>\n<li>Z\u0131plama girdisi gelmi\u015fti o zaman karakterin y\u00fcksekli\u011fini artt\u0131ral\u0131m vs<\/li>\n<\/ul>\n<div>\u00a0Display: \u0130sminden de anla\u015f\u0131laca\u011f\u0131 \u00fczere b\u00fct\u00fcn oyun ile ilgili \u00e7izimlerin ve benzeri i\u015flerin ger\u00e7ekle\u015ftirildi\u011fi ad\u0131m i\u015fte budur.<\/div>\n<ul>\n<li>Kullan\u0131c\u0131y\u0131 \u00e7iz,<\/li>\n<li>Arka plan\u0131 \u00e7iz.<\/li>\n<\/ul>\n<div>\u00a0A\u015fa\u011f\u0131 yukar\u0131 b\u00fct\u00fcn oyunlar bu ad\u0131mlar\u0131 i\u00e7erse de elbette daha fazlas\u0131 da vard\u0131r (fizik sim\u00fclasyonu, yapay zeka aktiviteleri, a\u011f haberle\u015fmesi vs). Ama bu yaz\u0131m\u0131zda biz bu \u00fc\u00e7\u00fcne yo\u011funla\u015faca\u011f\u0131z, fizi\u011fe de de\u011finiriz. \u00c7\u00fcnk\u00fc genelde bu d\u00f6ng\u00fcler aras\u0131nda ge\u00e7en zamandan en \u00e7ok etkilenen kabiliyetler fizik ile ilgili olanlar olmaktad\u0131r.<\/div>\n<div><\/div>\n<div>Burada bahsetmemizde yarar oldu\u011funu d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcm bir de\u011fer kavramlar ise FPS (Frame Per Second) ve Oyun H\u0131z\u0131. \u00d6zellikle FPS \u00e7ok s\u0131k bir \u015fekilde duydu\u011fumuz ve yukar\u0131da verdi\u011fimiz d\u00f6ng\u00fcde bulunan\u00a0 Display () metodunun saniyede ka\u00e7 kere \u00e7a\u011fr\u0131ld\u0131\u011f\u0131d\u0131r. Oyun H\u0131z\u0131 ise oyunun mevcut durumunun saniyede ka\u00e7 kere g\u00fcncellendi\u011fidir (bir di\u011fer deyi\u015fle Update() metodunun ka\u00e7 kere \u00e7a\u011fr\u0131ld\u0131\u011f\u0131d\u0131r).<\/div>\n<div><\/div>\n<div>\u015eimdi bu d\u00f6ng\u00fcy\u00fc inceledi\u011fimiz zaman ilk g\u00f6z\u00fcm\u00fcze \u00e7arpan husus bu d\u00f6ng\u00fc \u00fczerinden herhangi bir kontrol\u00fcm\u00fcz olmamas\u0131 ve zaman\u0131 hi\u00e7 bir \u015fekilde kullan\u0131m\u0131yor olmas\u0131d\u0131r. Bir di\u011fer deyi\u015fle h\u0131zl\u0131 bir makinada oyununuz \u00e7ok h\u0131zl\u0131 bir \u015fekilde \u00e7al\u0131\u015faca\u011f\u0131 i\u00e7in oyuncu neler oldu\u011funu kavrayamayabilir. \u00c7ok yava\u015f makinada da her \u00e7ey \u00e7ok yava\u015f olaca\u011f\u0131ndan her t\u00fcrl\u00fc pek tercih edilmeyecek bir y\u00f6ntem olarak d\u00fc\u015f\u00fcnebiliriz. Tabi bundan \u00e7ok uzun zaman \u00f6nce farkl\u0131 konfig\u00fcrasyonda bilgisayarlar\u0131n bu kadar yayg\u0131n olmad\u0131\u011f\u0131 ve bilgisayalar\u0131n h\u0131zlar\u0131n\u0131n belli oldu\u011fu zamanlar i\u00e7in bu d\u00f6ng\u00fc olduk\u00e7a makul.<\/div>\n<h2><span style=\"text-decoration: underline; color: #3366ff;\"><b>Y\u00f6ntem 2 (Sabit oyun h\u0131z\u0131na ba\u011fl\u0131 sabit FPS):<\/b><\/span><\/h2>\n<div>Zaman\u0131 d\u00f6ng\u00fcye dahil etme anlam\u0131nda ataca\u011f\u0131m\u0131z ilk ad\u0131m, oyunumuzun FPS&#8217;ni sabitlemek olacak. A\u015fa\u011f\u0131da bu yakla\u015f\u0131m \u0131\u015f\u0131\u011f\u0131nda g\u00fcncellenmi\u015f d\u00f6ng\u00fcy\u00fc g\u00f6rebilirsiniz. Yaz\u0131m\u0131n sonunda bu yakla\u015f\u0131mlar\u0131n hepsini i\u00e7eren \u00f6rnek kodlara ula\u015fabilirsiniz.<\/div>\n<div>\n<pre class=\"lang:c++ decode:true\" title=\"Y\u00f6ntem 2: Sabit oyun h\u0131z\u0131na ba\u011fl\u0131 sabit FPS\">constexpr int AIMED_FPS = 25;\r\nconstexpr PER_TICK_SKIP_TIME_IN_MS = 1000 \/ AIMED_FPS ;\r\n\u00a0\r\n\/\/ GetTimeInMSec() sistem baslatildigindan bu yana milisaniye\r\n\/\/ cinsinden ne kadar zaman gectigi\r\nunsigned int nextGameTime = GetTimeInMSec();\r\n\u00a0\r\n\/\/ Ne kadar uyuyacagiz\r\nint sleep_time = 0;\r\n\u00a0\r\nwhile( game_is_running )\r\n{\r\n\u00a0 \/\/ Temel oyun dongu elemanlari\r\n\u00a0 Input();\r\n\u00a0 Update();\r\n\u00a0 Display();\r\n\u00a0\r\n\u00a0 nextGameTime += PER_TICK_SKIP_TIME_IN_MS;\r\n\u00a0\r\n\u00a0 \/\/ Ne kadar zaman gecti\r\n\u00a0 sleep_time = nextGameTime - GetTimeInMSec();\r\n\u00a0\r\n\u00a0 \/\/ Bakalim beklememiz gerekiyor mu?\r\n\u00a0 if( sleep_time &gt;= 0 )\r\n\u00a0 {\r\n\u00a0     Sleep( sleep_time );\r\n\u00a0 }\r\n\u00a0 else\r\n\u00a0 {\r\n\u00a0     \/\/ Uykuya gerek yok, hatta geri kalmis durumdayiz!\r\n\u00a0 }\r\n}<\/pre>\n<p>Evet bu y\u00f6ntem olduk\u00e7a basit, her bir d\u00f6ng\u00fcn\u00fcn ka\u00e7 kere \u00e7a\u011fr\u0131laca\u011f\u0131n\u0131 biliyoruz. Ayr\u0131ca bu tarz d\u00f6ng\u00fclerde tekrar oynatma i\u00e7in de olduk\u00e7a uygun.<\/p>\n<\/div>\n<div>Sonradan ekledi\u011fimiz Sleep metodu ile d\u00f6ng\u00fc fonksiyonlar\u0131n\u0131n h\u0131zl\u0131 tamamlanmas\u0131 durumunda biraz d\u00f6ng\u00fcy\u00fc bekletiyoruz.<\/div>\n<div>\u015eimdi bu durumda h\u0131zl\u0131 \u00e7al\u0131\u015fan bir bilgisayarda bu d\u00f6ng\u00fcde ne kazan\u0131yoruz? Asl\u0131nda hedefledi\u011fimiz FPS&#8217;i kazansak ta Sleep ile bir \u00e7ok CPU zaman\u0131n\u0131 bo\u015fa harc\u0131yoruz. Ger\u00e7i mobil oyunlar i\u00e7in bu bir avantaj da say\u0131labilir \ud83d\ude42<\/div>\n<div>Peki d\u00f6ng\u00fc fonksiyonlar\u0131 daha fazla zaman al\u0131rsa ne yapaca\u011f\u0131z? Asl\u0131nda yapabilece\u011fimiz \u00e7ok ta bir \u015fey yok yani ya ger\u00e7ekle\u015ftirdi\u011fimiz i\u015fleri d\u00f6ng\u00fc h\u0131z\u0131m\u0131za g\u00f6re d\u00fczenleyece\u011fiz ya da oyunumuz yava\u015flayacak.<\/div>\n<div><\/div>\n<div>Bu d\u00f6ng\u00fc y\u00f6ntemi basit ve k\u00fc\u00e7\u00fck oyunlarda hedef FPS nin do\u011fru bir \u015fekilde belirlenmesi durumunda kullan\u0131labilir. FPS&#8217;nin \u00e7ok y\u00fcksek tan\u0131mlanmas\u0131 yava\u015f bilgisayarlar i\u00e7in s\u0131k\u0131nt\u0131 yaratabilir.<\/div>\n<h2><span style=\"color: #3366ff;\"><strong><span style=\"text-decoration: underline;\">Y\u00f6ntem 3 (De\u011fi\u015fken FPS&#8217;ye Ba\u011fl\u0131 Oyun H\u0131z\u0131):<\/span><\/strong><\/span><\/h2>\n<div>Bir di\u011fer yayg\u0131n oyun d\u00f6ng\u00fc mekanizmas\u0131 ise oyunu ilk y\u00f6ntemdeki gibi olabildi\u011fince h\u0131zl\u0131 \u00e7al\u0131\u015ft\u0131rmak fakat ilkinden farkl\u0131 olarak bir \u00f6nceki d\u00f6ng\u00fcden bu yana ge\u00e7en zaman\u0131 girdi olarak kullanmak. Bu yakla\u015f\u0131m a\u015fa\u011f\u0131daki gibi \u00f6zetlenebilir:<\/div>\n<div><\/div>\n<div>\n<pre class=\"lang:c++ decode:true \" title=\"Y\u00f6ntem 3: De\u011fi\u015fken FPS'ye Ba\u011fl\u0131 Oyun H\u0131z\u0131\">unsigned int prev_frame_time;\r\nunsigned int curr_frame_time = GetTimeInMSec();\r\n\u00a0\r\nbool game_is_running = true;\r\nwhile( game_is_running )\r\n{\r\n\u00a0 prev_frame_time = curr_frame_time;\r\n\u00a0 curr_frame_time = GetTimeInMSec();\r\n\u00a0\r\n\u00a0 Input();\r\n\u00a0\r\n\u00a0 \/\/ Ge\u00e7en zaman\u0131 oyun g\u00fcncelleme metoduna ge\u00e7ir\r\n\u00a0 Update( curr_frame_time - prev_frame_time );\r\n\u00a0\r\n\u00a0 Display();\r\n}<\/pre>\n<p>Bu yakla\u015f\u0131mdaki en \u00f6nemli nokta oyun mant\u0131\u011f\u0131n\u0131 g\u00fcncelledi\u011fimiz Update metou i\u00e7erisinde art\u0131k ge\u00e7en zaman\u0131 da g\u00f6z \u00f6n\u00fcnde bulundurmam\u0131z gerekmekte. Bu fark\u0131n b\u00fcy\u00fcmesi mevcut oyunun durumunun daha b\u00fcy\u00fck ad\u0131mlar ile g\u00fcncellenmesi anlam\u0131na geliyor.<\/p>\n<\/div>\n<div>\u015eimdi gelelim bu yakla\u015f\u0131m\u0131n bize sunduklar\u0131nda. Yava\u015f bir donan\u0131mda Update metoduna gelecek olan zaman de\u011feri de hali ile olduk\u00e7a b\u00fcy\u00fck olacakt\u0131r. Dikkatli bir \u015fekilde bu ele al\u0131nmaz ise normalde \u00f6rne\u011fin duvara \u00e7arpma durumlar\u0131 veya ince manevralar b\u00fcy\u00fck zaman atlamalar\u0131 sebebi ile kaybolabilir.<\/div>\n<div>Bu duruma en g\u00fczel \u00f6rnek asl\u0131nda ekran\u0131n bir taraf\u0131ndan di\u011fer taraf\u0131na giden mermi durumu ile ifade edilebilir. H\u0131zl\u0131 bir makinada merminin konumu her bir d\u00f6ng\u00fcde azar azar g\u00fcncellenirken, yava\u015f bir makinada her bir ad\u0131mda daha b\u00fcy\u00fck atlamalar olacakt\u0131r. Bu da ilk durumda animasyonun daha kusursuz olmas\u0131n\u0131 sa\u011flamaktad\u0131r.<\/div>\n<div><\/div>\n<div>Burada tabi bu tarz durumlar\u0131 kotarmaya y\u00f6nelik baz\u0131 \u00f6nlemler al\u0131nabilir fakat bu da kodu olduk\u00e7a karma\u015f\u0131kla\u015ft\u0131racak ve genel olarak ta uygulamay\u0131 hantalla\u015ft\u0131rabilir. Ayr\u0131ca \u00f6zellikle fizik motorlar\u0131n\u0131n kullan\u0131lmas\u0131 durumunda b\u00fcy\u00fck ve d\u00fczensiz zaman atlamalar\u0131 bu motorlar\u0131n tutars\u0131z davranmalar\u0131na yol a\u00e7abilir.<\/div>\n<div><\/div>\n<div>Peki h\u0131zl\u0131 bir donan\u0131mda ne t\u00fcr durumlar olu\u015fabilir. \u00c7o\u011fu oyun ondal\u0131kl\u0131 (floating) say\u0131lar\u0131 kullanmaktad\u0131r ve bunlarda zaman ile yuvarlama hatalar\u0131 olabilmektedir. Tahmin edece\u011finiz \u00fczere h\u0131zl\u0131 bir makinada bu hata \u00e7ok daha h\u0131zl\u0131 bir \u015fekilde b\u00fcy\u00fcyecektir. Ayr\u0131ca yava\u015f olmas\u0131 durumu gibi d\u00f6ng\u00fcn\u00fcn \u00e7ok ta h\u0131zl\u0131 olmas\u0131 da yine fizik motorlar\u0131n\u0131 tutars\u0131zla\u015ft\u0131rabilir.<\/div>\n<div><\/div>\n<div>Her ne kadar bu yakla\u015f\u0131m \u00e7ekici g\u00f6r\u00fcnse de, sonu\u00e7 olarak asl\u0131nda oyun d\u00f6ng\u00fcs\u00fc pek kestirilebilir ve tutarl\u0131 olmayan bir hale gelmektedir.<\/div>\n<h2><span style=\"color: #3366ff;\">\u00a0<span style=\"text-decoration: underline;\"><b>Y\u00f6ntem 4 (Maksimum FPS ile Sabit Oyun H\u0131z\u0131):<\/b><\/span><\/span><\/h2>\n<div>\u00a0Bu yakla\u015f\u0131m ile, ikinci yakla\u015f\u0131mda yava\u015f donan\u0131mda ya\u015fad\u0131\u011f\u0131m\u0131z s\u0131k\u0131nt\u0131y\u0131 bir nebze \u00e7\u00f6zmeye\u00a0\u00e7al\u0131\u015faca\u011f\u0131z. Neydi oradaki s\u0131k\u0131nt\u0131, donan\u0131m yava\u015f oldu\u011fu durumda her oyun h\u0131z\u0131 hem de FPS d\u00fc\u015f\u00fcyordu. Bu yakla\u015f\u0131mda FPS d\u00fc\u015fse bile oyun h\u0131z\u0131n\u0131 korumaya y\u00f6nelik olacak. Bu yakla\u015f\u0131m a\u015fa\u011f\u0131daki kod ile \u00f6zetlenebilir:<\/div>\n<div>\n<pre class=\"lang:c++ decode:true \" title=\"Y\u00f6ntem 4: Maksimum FPS ile Sabit Oyun H\u0131z\u0131\">constexpr int TICKS_PER_SECOND = 25;\r\nconstexpr int PER_TICK_SKIP_TIME_IN_MS = 1000 \/ TICKS_PER_SECOND;\r\nconstexpr int MAX_FRAMESKIP = 10;\r\n\u00a0\r\nunsigned int next_game_tick_time = GetTimeInMSec();\r\nint loops;\r\n\u00a0\r\nbool game_is_running = true;\r\nwhile( game_is_running ) {\r\n\u00a0\r\n\u00a0 loops = 0;\r\n\u00a0 while( GetTimeInMSec() &gt; next_game_tick_time &amp;&amp; loops &lt; MAX_FRAMESKIP)\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 Input();\r\n\u00a0 \u00a0 \u00a0 \u00a0\u00a0 Update();\r\n\u00a0 \u00a0 \u00a0 \u00a0\u00a0 next_game_tick_time += PER_TICK_SKIP_TIME_IN_MS;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0loops++;\r\n\u00a0 }\r\n\u00a0\r\n\u00a0 Display();\r\n}<\/pre>\n<p>Bu durumda da yine oyunumuz her saniye 25 kere g\u00fcncelleniyor olacak ve g\u00f6rselle\u015ftirme ise kalan zaman olabildi\u011finde fazla yap\u0131lacak. E\u011fer burada g\u00fcncellemeler \u00e7ok h\u0131zl\u0131 olur ve g\u00f6rselle\u015ftirme saniye 25 kereyi ge\u00e7er ise g\u00f6rsellenen sahneler (frame) bir \u00f6ncekinin ayn\u0131 olacak.<\/p>\n<\/div>\n<div>Burada yava\u015f bir makinada, her bir d\u00f6ng\u00fcdeki g\u00fcncelleme adeti\u00a0MAX_FRAMESKIP e gelen kadar oyun h\u0131z\u0131 de\u011fi\u015fmeyecek fakat FPS biraz d\u00fc\u015febilir. E\u011fer g\u00fcncelleme adeti\u00a0MAX_FRAMESKIP i de ge\u00e7meye ba\u015flarsa hem oyun hem de FPS d\u00fc\u015fecektir.<\/div>\n<div>H\u0131zl\u0131 bir makinada ise bir \u00f6nceki y\u00f6ntemin aksine herhangi bir s\u0131k\u0131nt\u0131 olmayacakt\u0131r (tabiki CPU ticklerinin bo\u015fa harcanmas\u0131 d\u0131\u015f\u0131nda ama bunu tabiki bizler de\u011ferlendirebiliriz \ud83d\ude03<\/div>\n<div>Bu durumda da yine en \u00f6nemli i\u015flerde birisi TICKS_PER_SECOND belirlemek olacakt\u0131r. \u00c7ok b\u00fcy\u00fck de\u011ferler yava\u015f donan\u0131mda s\u0131k\u0131nt\u0131lar yaratacakt\u0131r. \u00c7ok d\u00fc\u015f\u00fck de\u011ferler de h\u0131zl\u0131 makinalarda ayn\u0131 sahnenin bo\u015fu bo\u015funa tekrar tekrar g\u00f6sterilmesine sebep olacakt\u0131r.<\/div>\n<h2><span style=\"text-decoration: underline; color: #3366ff;\"><span style=\"text-decoration: underline;\"><b>Y\u00f6ntem 5 (De\u011fi\u015fken FPS&#8217;lerden ba\u011f\u0131ms\u0131z Sabit Oyun H\u0131z\u0131):<\/b><\/span><\/span><\/h2>\n<div>\u00a0Bu y\u00f6ntemde bir \u00f6nceki y\u00f6ntemi yava\u015f makinelerde daha h\u0131zl\u0131 \u00e7al\u0131\u015ft\u0131rma ve h\u0131zl\u0131 makinelerde de g\u00f6rsellik anlam\u0131nda daha fazla iyile\u015ftirmeye \u00e7al\u0131\u015faca\u011f\u0131z. Asl\u0131nda oyun durumunu g\u00fcncelleyen k\u0131s\u0131mlar\u0131 de\u011fi\u015ftirmeden g\u00f6rselle\u015ftirme taraflar\u0131 ile oynayaca\u011f\u0131z.<\/div>\n<div><\/div>\n<div>\n<pre class=\"lang:c++ decode:true \" title=\"Y\u00f6ntem 5: De\u011fi\u015fken FPS'lerden ba\u011f\u0131ms\u0131z Sabit Oyun H\u0131z\u0131\">constexpr int TICKS_PER_SECOND = 25;\r\nconstexpr int PER_TICK_SKIP_TIME_IN_MS = 1000 \/ TICKS_PER_SECOND;\r\nconstexpr int MAX_FRAMESKIP = 10;\r\n\u00a0\r\nunsigned int next_game_tick_time = GetTimeInMSec();\r\nint loops;\r\nfloat interpolation;\r\n\u00a0\r\nbool game_is_running = true;\r\nwhile( game_is_running )\r\n{\r\n\u00a0 loops = 0;\r\n\u00a0 while( GetTimeInMSec() &gt; next_game_tick_time &amp;&amp; loops &lt; MAX_FRAMESKIP)\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 Input();\r\n\u00a0 \u00a0 \u00a0 \u00a0\u00a0 Update();\r\n\u00a0\r\n\u00a0 \u00a0 \u00a0 \u00a0\u00a0 next_game_tick_time += PER_TICK_SKIP_TIME_IN_MS;\r\n\u00a0 \u00a0 \u00a0 \u00a0\u00a0 loops++;\r\n\u00a0 }\r\n\u00a0\r\n\u00a0 interpolation = float( GetTimeInMSec() + PER_TICK_SKIP_TIME_IN_MS - next_game_tick_time )\r\n\u00a0 \/\r\n\u00a0 float( PER_TICK_SKIP_TIME_IN_MS );\r\n\u00a0\r\n\u00a0 Display( interpolation );\r\n}<\/pre>\n<p>Yukar\u0131daki koddan da anlayaca\u011f\u0131n\u0131z \u00fczere \u00fc\u00e7\u00fcnc\u00fc y\u00f6ntemde oyun durumunu g\u00fcncellemek i\u00e7in Update() metoduna ge\u00e7irdi\u011fimiz zaman fark\u0131n\u0131 bu sefer Display() metoduna ge\u00e7iriyoruz. Peki bu ne anlama geliyor? Oyun g\u00f6rselle\u015ftirmelerinde &#8220;interpolation&#8221; yapaca\u011f\u0131z. Update metodunu X zaman\u0131 i\u00e7in \u00e7a\u011f\u0131rd\u0131k ve sahneyi g\u00f6rselle\u015ftirece\u011fiz. Bu da \u015fu anlama geliyor asl\u0131nda oyun zaman\u0131 olarak (X + 1)\u00a0 deki zaman yerine X + 0.4 sn g\u00f6re\u00a0 g\u00f6rselle\u015ftirece\u011fiz.<\/p>\n<\/div>\n<div>Yava\u015f bir makina durumunu d\u00fc\u015f\u00fcn\u00fcrsek. \u00c7o\u011fu oyunda Input ve Update k\u0131s\u0131mlar\u0131 genelde Display den \u00e7ok daha az bir zaman alacakt\u0131r ve kuvvetle muhtemel Update metodu saniyede \u00e7ok rahat 25 kere \u00e7al\u0131\u015facakt\u0131r. G\u00f6rselleme k\u0131sm\u0131 da \u00e7ok<\/div>\n<div>b\u00fcy\u00fck yava\u015flamalar olmad\u0131\u011f\u0131 m\u00fcddet\u00e7e kabul edilebilir d\u00fczeyde olacakt\u0131r.<\/div>\n<div><\/div>\n<div>H\u0131zl\u0131 makinelerde ise oyunu h\u0131z\u0131m\u0131 yine saniyede 25 olarak kalmaya devam edecektir. Fakat g\u00f6rselle\u015ftirme k\u0131sm\u0131nda kullanaca\u011f\u0131m\u0131z &#8220;Interpolation&#8221; ile \u00e7ok daha h\u0131zl\u0131 \u00e7al\u0131\u015f\u0131yor izlenimi veriyor olaca\u011f\u0131z.<\/div>\n<h2><span style=\"text-decoration: underline; color: #3366ff;\"><strong>Sonu\u00e7:<\/strong><\/span><\/h2>\n<div>Evet arkada\u015flar sonu\u00e7 olarak en mant\u0131kl\u0131 yakla\u015f\u0131m son y\u00f6ntem g\u00f6r\u00fcn\u00fcyor. Ben de a\u00e7\u0131k\u00e7as\u0131 oyunlar\u0131mda bu y\u00f6ntemi kullanmay\u0131 tercih ediyorum. Fakat her \u015fey oldu\u011funu gibi y\u00f6ntemin se\u00e7imi birazda ihtiya\u00e7 ve k\u0131s\u0131tlara ba\u011fl\u0131. Son y\u00f6ntem bu y\u00f6ntemler aras\u0131nda en karma\u015f\u0131k olan\u0131. Fakat hem h\u0131zl\u0131 hem de yava\u015f makine ve oyunlara adapte olabiliyor. E\u011fer interpolasyon vs ile u\u011fra\u015fmak istemiyorsan\u0131z 4. y\u00f6ntem de yeterli olacakt\u0131r.<\/div>\n<div><\/div>\n<div>Birinci y\u00f6ntem mobil oyunlar i\u00e7in pek uygun olmayabilir ama basit PC oyunlar\u0131 ve prototipler i\u00e7in tercih edilebilir.<\/div>\n<div>\u0130kinci y\u00f6ntem basit olmas\u0131, g\u00fc\u00e7 dostu olmas\u0131 onu \u00f6ne \u00e7\u0131kar\u0131yor. \u00c7ok h\u0131zl\u0131 olmayan oyunlar i\u00e7in tercih edilebilir.<\/div>\n<div><\/div>\n<div>Evet arkada\u015flar uzun bir yaz\u0131m\u0131z\u0131n sonuna geldik. Umar\u0131m a\u00e7\u0131klay\u0131c\u0131 olmu\u015ftur. Bu arada faydaland\u0131\u011f\u0131m kaynaklara Kaynaklar k\u0131sm\u0131ndan ula\u015fabilirsiniz. 3. kaynak biraz daha fizik tabanl\u0131 bir yakla\u015f\u0131m. Ayr\u0131ca Unity&#8217;de bu i\u015flerin nas\u0131l kotar\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6rmek i\u00e7in de 4. kayna\u011fa bakabilirsiniz. Bir sonraki yaz\u0131m\u0131 pencere y\u00f6netim k\u00fct\u00fcphanelerine ay\u0131rmay\u0131 d\u00fc\u015f\u00fcn\u00fcyorum o zamana kadar g\u00f6r\u00fc\u015fmek dile\u011fiyle.<\/div>\n<h2><span style=\"text-decoration: underline; color: #3366ff;\"><strong>Kaynaklar:<\/strong><\/span><\/h2>\n<ol>\n<li><a href=\"http:\/\/gameprogrammingpatterns.com\/game-loop.html\">Game Loop,\u00a0Game Programming Patterns\/Sequencing Patterns, http:\/\/gameprogrammingpatterns.com\/game-loop.html<\/a><\/li>\n<li>deWiTTERS Game Loop, Koen Witters,\u00a0<a href=\"http:\/\/www.koonsolo.com\/news\/dewitters-gameloop\/\">http:\/\/www.koonsolo.com\/news\/dewitters-gameloop\/<\/a><\/li>\n<li>Fix Your Timestep!, Glenn Fiedler,\u00a0<a href=\"https:\/\/gafferongames.com\/post\/fix_your_timestep\/\">https:\/\/gafferongames.com\/post\/fix_your_timestep\/<\/a><\/li>\n<li>Execution Order of Event Functions in Unity,\u00a0<a href=\"https:\/\/docs.unity3d.com\/560\/Documentation\/Manual\/ExecutionOrder.html\">https:\/\/docs.unity3d.com\/560\/Documentation\/Manual\/ExecutionOrder.html<\/a><\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Evet arkada\u015flar oyun geli\u015ftirme ile ilgili ilk yaz\u0131m\u0131z\u0131 her oyunun temel ta\u015flar\u0131ndan biri olan oyun d\u00f6ng\u00fclerine ay\u0131raca\u011f\u0131z. Her ne kadar son y\u0131llarda art\u0131k tek bir d\u00f6ng\u00fc \u00fczerinden d\u00f6nen oyunlardan ziyade task\/thread tabanl\u0131 di\u011fer bir deyi\u015fle b\u00fct\u00fcn i\u015fleri par\u00e7alara b\u00f6l\u00fcp bunlar\u0131 ba\u011f\u0131ms\u0131z \u015fekilde \u00e7al\u0131\u015ft\u0131rmaya dayal\u0131 y\u00f6ntemler ortaya \u00e7\u0131ksa da b\u00fct\u00fcn bunlar\u0131n temeli yine de basit oyun&#8230; <a class=\"more-link\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/09\/oyun-donguleri\/\">Continue reading <span class=\"meta-nav\">&#8594;<\/span><\/a><\/p>\n","protected":false},"author":1,"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":[10,25],"tags":[13,39,52,53,26],"class_list":["post-164","post","type-post","status-publish","format-standard","hentry","category-c","category-oyun-gelistirme","tag-c","tag-dongu","tag-game-development","tag-mainloop","tag-oyun-gelistirme"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Oyun Geli\u015ftirme - Oyun D\u00f6ng\u00fcleri - 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\/2017\/12\/09\/oyun-donguleri\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Oyun Geli\u015ftirme - Oyun D\u00f6ng\u00fcleri - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"og:description\" content=\"Evet arkada\u015flar oyun geli\u015ftirme ile ilgili ilk yaz\u0131m\u0131z\u0131 her oyunun temel ta\u015flar\u0131ndan biri olan oyun d\u00f6ng\u00fclerine ay\u0131raca\u011f\u0131z. Her ne kadar son y\u0131llarda art\u0131k tek bir d\u00f6ng\u00fc \u00fczerinden d\u00f6nen oyunlardan ziyade task\/thread tabanl\u0131 di\u011fer bir deyi\u015fle b\u00fct\u00fcn i\u015fleri par\u00e7alara b\u00f6l\u00fcp bunlar\u0131 ba\u011f\u0131ms\u0131z \u015fekilde \u00e7al\u0131\u015ft\u0131rmaya dayal\u0131 y\u00f6ntemler ortaya \u00e7\u0131ksa da b\u00fct\u00fcn bunlar\u0131n temeli yine de basit oyun... Continue reading &#8594;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/09\/oyun-donguleri\/\" \/>\n<meta property=\"og:site_name\" content=\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2017-12-09T17:43:35+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-01-02T20:18:07+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=\"12 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\/2017\/12\/09\/oyun-donguleri\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/09\/oyun-donguleri\/\"},\"author\":{\"name\":\"yaz\u0131l\u0131mperver\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/30ee263812776c4abb84418d028b5ef4\"},\"headline\":\"Oyun Geli\u015ftirme &#8211; Oyun D\u00f6ng\u00fcleri\",\"datePublished\":\"2017-12-09T17:43:35+00:00\",\"dateModified\":\"2018-01-02T20:18:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/09\/oyun-donguleri\/\"},\"wordCount\":2067,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"keywords\":[\"c++\",\"D\u00f6ng\u00fc\",\"Game Development\",\"Mainloop\",\"Oyun Geli\u015ftirme\"],\"articleSection\":[\"C++\",\"Oyun Geli\u015ftirme\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/09\/oyun-donguleri\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/09\/oyun-donguleri\/\",\"url\":\"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/09\/oyun-donguleri\/\",\"name\":\"Oyun Geli\u015ftirme - Oyun D\u00f6ng\u00fcleri - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#website\"},\"datePublished\":\"2017-12-09T17:43:35+00:00\",\"dateModified\":\"2018-01-02T20:18:07+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/09\/oyun-donguleri\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/09\/oyun-donguleri\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/09\/oyun-donguleri\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Ana sayfa\",\"item\":\"https:\/\/www.yazilimperver.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Oyun Geli\u015ftirme &#8211; Oyun D\u00f6ng\u00fcleri\"}]},{\"@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\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/30ee263812776c4abb84418d028b5ef4\",\"name\":\"yaz\u0131l\u0131mperver\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1fba597722a6cfbfac6eb03b348b1f5065b583004abb13322f432c3f00276b3f?s=96&d=wp_user_avatar&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/1fba597722a6cfbfac6eb03b348b1f5065b583004abb13322f432c3f00276b3f?s=96&d=wp_user_avatar&r=g\",\"caption\":\"yaz\u0131l\u0131mperver\"},\"description\":\"\u00d6\u011frenmeyi ve payla\u015fmay\u0131 seven bir yaz\u0131l\u0131mperver :)\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Oyun Geli\u015ftirme - Oyun D\u00f6ng\u00fcleri - 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\/2017\/12\/09\/oyun-donguleri\/","og_locale":"tr_TR","og_type":"article","og_title":"Oyun Geli\u015ftirme - Oyun D\u00f6ng\u00fcleri - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","og_description":"Evet arkada\u015flar oyun geli\u015ftirme ile ilgili ilk yaz\u0131m\u0131z\u0131 her oyunun temel ta\u015flar\u0131ndan biri olan oyun d\u00f6ng\u00fclerine ay\u0131raca\u011f\u0131z. Her ne kadar son y\u0131llarda art\u0131k tek bir d\u00f6ng\u00fc \u00fczerinden d\u00f6nen oyunlardan ziyade task\/thread tabanl\u0131 di\u011fer bir deyi\u015fle b\u00fct\u00fcn i\u015fleri par\u00e7alara b\u00f6l\u00fcp bunlar\u0131 ba\u011f\u0131ms\u0131z \u015fekilde \u00e7al\u0131\u015ft\u0131rmaya dayal\u0131 y\u00f6ntemler ortaya \u00e7\u0131ksa da b\u00fct\u00fcn bunlar\u0131n temeli yine de basit oyun... Continue reading &#8594;","og_url":"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/09\/oyun-donguleri\/","og_site_name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","article_published_time":"2017-12-09T17:43:35+00:00","article_modified_time":"2018-01-02T20:18:07+00:00","author":"yaz\u0131l\u0131mperver","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"yaz\u0131l\u0131mperver","Tahmini okuma s\u00fcresi":"12 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/09\/oyun-donguleri\/#article","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/09\/oyun-donguleri\/"},"author":{"name":"yaz\u0131l\u0131mperver","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/30ee263812776c4abb84418d028b5ef4"},"headline":"Oyun Geli\u015ftirme &#8211; Oyun D\u00f6ng\u00fcleri","datePublished":"2017-12-09T17:43:35+00:00","dateModified":"2018-01-02T20:18:07+00:00","mainEntityOfPage":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/09\/oyun-donguleri\/"},"wordCount":2067,"commentCount":0,"publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"keywords":["c++","D\u00f6ng\u00fc","Game Development","Mainloop","Oyun Geli\u015ftirme"],"articleSection":["C++","Oyun Geli\u015ftirme"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/09\/oyun-donguleri\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/09\/oyun-donguleri\/","url":"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/09\/oyun-donguleri\/","name":"Oyun Geli\u015ftirme - Oyun D\u00f6ng\u00fcleri - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/#website"},"datePublished":"2017-12-09T17:43:35+00:00","dateModified":"2018-01-02T20:18:07+00:00","breadcrumb":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/09\/oyun-donguleri\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/09\/oyun-donguleri\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/09\/oyun-donguleri\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Ana sayfa","item":"https:\/\/www.yazilimperver.com\/"},{"@type":"ListItem","position":2,"name":"Oyun Geli\u015ftirme &#8211; Oyun D\u00f6ng\u00fcleri"}]},{"@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\/"}},{"@type":"Person","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/30ee263812776c4abb84418d028b5ef4","name":"yaz\u0131l\u0131mperver","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/1fba597722a6cfbfac6eb03b348b1f5065b583004abb13322f432c3f00276b3f?s=96&d=wp_user_avatar&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1fba597722a6cfbfac6eb03b348b1f5065b583004abb13322f432c3f00276b3f?s=96&d=wp_user_avatar&r=g","caption":"yaz\u0131l\u0131mperver"},"description":"\u00d6\u011frenmeyi ve payla\u015fmay\u0131 seven bir yaz\u0131l\u0131mperver :)"}]}},"_links":{"self":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/164","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\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/comments?post=164"}],"version-history":[{"count":7,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/164\/revisions"}],"predecessor-version":[{"id":211,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/164\/revisions\/211"}],"wp:attachment":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media?parent=164"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/categories?post=164"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/tags?post=164"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}