Metin2 LibJPEG kaldırma rehberi, client source tarafında JPG screenshot sistemini devre dışı bırakıp DirectX9 üzerinden BMP formatında ekran görüntüsü kaydetmek isteyen geliştiriciler için hazırlandı. Metin2 kaynak yapısında LibJPEG kütüphanesi çoğunlukla screenshot alma işlemi için kullanılır. Bu nedenle farklı bir kayıt yöntemi tercih edildiğinde LibJPEG bağımlılığını kaldırmak mümkün hale gelir.

Bu işlemden sonra screenshot dosyaları artık JPG yerine BMP olarak kaydedilir. BMP formatı sıkıştırmasız olduğu için dosya boyutları JPG’ye göre daha büyük olabilir. Kaynak metinde bu boyutların kaliteye bağlı olarak yaklaşık 3-8 MB aralığına çıkabileceği belirtiliyor. Bu yüzden Metin2 LibJPEG kaldırma rehberi uygulanmadan önce bu değişikliğin bilinçli şekilde yapılması gerekir.
Kısa Bilgi
Bu düzenleme LibJPEG bağımlılığını kaldırır ve screenshot sistemini BMP formatına taşır. İşlem sonrasında JPG screenshot yerine screenshot klasörüne BMP dosyaları kaydedilir.
Metin2 LibJPEG Kaldırma Rehberi: İşlem Ne İşe Yarar?
Metin2 LibJPEG kaldırma rehberi kapsamında yapılan işlem, client tarafında LibJPEG kütüphanesine olan ihtiyacı ortadan kaldırmayı hedefler. Varsayılan yapıda ekran görüntüsü JPG formatında kaydedilir ve bunun için JpegFile.cpp, JpegFile.h ve ilgili LibJPEG kütüphane dosyaları kullanılır.
Yeni yöntemde screenshot işlemi DirectX9 üzerinden arka buffer yüzeyini alarak BMP formatında dosyaya kaydeder. Bu nedenle jpeg_save fonksiyonu, SaveJPEG fonksiyonu ve eski JPG dosya yolu üretme sistemi temizlenir. Yerine daha sade bir SaveScreenShot yapısı kurulur.
Bu rehber özellikle DirectX9 client kullanan geliştiricilere yöneliktir. DirectX8 kullananlar aynı mantığı kendi yapısına uyarlayabilir; ancak kaynakta DirectX8 üzerinde denenmediği belirtilmiştir. Bu nedenle DirectX8 tarafında uygulama yapılacaksa ayrıca test edilmelidir.
İşleme Başlamadan Önce Dikkat Edilmesi Gerekenler
Bu işlem client source üzerinde doğrudan değişiklik yaptığı için mutlaka yedek alınmalıdır. Özellikle extern/lib, EterLib, EterPythonLib ve root/game.py tarafındaki düzenlemeler birbiriyle bağlantılıdır. Yalnızca bir dosyayı değiştirip diğer tarafları eski bırakmak derleme hatasına veya Python tarafında çağrı sorunlarına neden olabilir.
Screenshot dosyalarının BMP formatına geçmesi, dosya boyutlarını artırır. JPG formatı sıkıştırmalı olduğu için daha küçük dosyalar üretirken, BMP dosyaları daha büyük olur. Eğer oyuncular sık sık screenshot alıyorsa, screenshot klasörünün daha hızlı büyüyeceği unutulmamalıdır.
Dikkat Edilmesi Gerekenler
Bu işlemden sonra LibJPEG kütüphanesi kaldırılır. Geri dönmek isterseniz eski dosyalarınızın ve proje ayarlarınızın yedeği mutlaka elinizde olmalıdır.
- Client source dosyalarının tam yedeğini alın.
- Visual Studio proje dosyalarından silinen kaynakları kaldırmayı unutmayın.
- LibJPEG .lib dosyaları silindikten sonra linker ayarlarını kontrol edin.
- PythonGraphic.h, PythonGraphic.cpp ve PythonGraphicModule.cpp değişikliklerini birlikte yapın.
- root/game.py tarafındaki SaveScreen fonksiyonunu yeni çağrıya göre sadeleştirin.
- İşlem sonrası screenshot klasöründe BMP dosyası oluştuğunu test edin.
LibJPEG Dosyalarını Temizleme
İlk adım, LibJPEG kütüphanesine ait dosyaları source yapısından kaldırmaktır. Bunun için Client src/extern/lib klasörüne girip dosya adı libjpeg ile başlayan .lib dosyalarını silmeniz gerekir. Ardından Client src/EterLib klasörü içinde bulunan JpegFile.cpp ve JpegFile.h dosyaları kaldırılmalıdır.
Bu dosyaları yalnızca klasörden silmek yeterli olmayabilir. Visual Studio projesi içinde EterLib projesini açıp JpegFile.cpp ve JpegFile.h dosyalarını projeden de kaldırmanız gerekir. Aksi halde derleme sırasında eksik dosya hatası alabilirsiniz.
Client src/extern/lib - libjpeg ile başlayan .lib dosyalarını silin. Client src/EterLib - JpegFile.cpp dosyasını silin. - JpegFile.h dosyasını silin. Visual Studio / EterLib Project - JpegFile.cpp dosyasını projeden kaldırın. - JpegFile.h dosyasını projeden kaldırın.PythonGraphic.cpp İçinde Kaldırılacak Kodlar
Metin2 LibJPEG kaldırma rehberi içinde en önemli düzenleme noktalarından biri PythonGraphic.cpp dosyasıdır. Burada önce JpegFile include satırı kaldırılmalıdır. Çünkü JpegFile.h artık source yapısında bulunmayacak.
#include "../eterLib/JpegFile.h"Ardından screenshot tag üretimi ve JPG kaydı için kullanılan eski fonksiyonlar silinmelidir. Bu fonksiyonlar LibJPEG üzerinden kayıt yapan eski yapıya aittir.
void GenScreenShotTag(const char* src, DWORD crc32, char* leaf, size_t leafLen) { const char* p = src; const char* n = p; while (n = strchr(p, '\\')) p = n + 1; _snprintf(leaf, leafLen, "YMIR_METIN2:%s:0x%.8x", p, crc32); } bool CPythonGraphic::SaveJPEG(const char* pszFileName, LPBYTE pbyBuffer, UINT uWidth, UINT uHeight) { return jpeg_save(pbyBuffer, uWidth, uHeight, 100, pszFileName) != 0; }Yeni SaveScreenShot Fonksiyonu
Eski SaveScreenShot fonksiyonu dosya adı parametresi alan JPG odaklı yapıdan çıkarılır ve parametresiz hale getirilir. Yeni fonksiyon, DirectX back buffer üzerinden yüzey alır ve screenshot klasörüne tarih-saat bilgisiyle benzersiz bir BMP dosyası kaydeder.
Aşağıdaki kod, PythonGraphic.cpp içinde eski SaveScreenShot fonksiyonunun yerine kullanılacak yeni yapıdır. Kod alanları HTML içinde özellikle pre ve code etiketiyle verilmiştir.
bool CPythonGraphic::SaveScreenShot() { LPDIRECT3DSURFACE9 lpSurface = nullptr; D3DSURFACE_DESC stSurfaceDesc = {}; uint32_t uWidth = stSurfaceDesc.Width; uint32_t uHeight = stSurfaceDesc.Height; ms_lpd3dDevice->CreateOffscreenPlainSurface(uWidth, uHeight, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &lpSurface, NULL); if (SUCCEEDED(ms_lpd3dDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &lpSurface))) { if (!CreateDirectory("screenshot", NULL) && ERROR_ALREADY_EXISTS != GetLastError()) return false; SYSTEMTIME st; GetSystemTime(&st); char szFileName[MAX_PATH]; sprintf_s(szFileName, "screenshot/screenshot_%04d%02d%02d_%02d%02d%02d.bmp", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); D3DXSaveSurfaceToFile(szFileName, D3DXIFF_BMP, lpSurface, NULL, NULL); } else { TraceError("CPythonGraphic::SaveScreenShot() - ScreenShot Basarisiz!"); } if (lpSurface) { lpSurface->Release(); lpSurface = nullptr; } return true; }Kod Notu
Bu yapı screenshot klasörünü otomatik oluşturur ve dosyayı screenshot_YYYYMMDD_HHMMSS.bmp formatıyla kaydeder. Test sırasında klasör oluşumu ve dosya kaydı mutlaka kontrol edilmelidir.
PythonGraphic.h Düzenlemesi
PythonGraphic.h dosyasında artık SaveJPEG bildirimi kullanılmayacağı için kaldırılmalıdır. Ayrıca SaveScreenShot fonksiyonu parametresiz hale getirileceği için header bildirimi de güncellenmelidir.
// Silinecek satır: bool SaveJPEG(const char* pszFileName, LPBYTE pbyBuffer, UINT uWidth, UINT uHeight); // Eski bildirim: bool SaveScreenShot(const char* szFileName); // Yeni bildirim: bool SaveScreenShot();Header ile CPP tarafının uyumlu olması çok önemlidir. Eğer CPP fonksiyonu parametresiz, header bildirimi parametreli kalırsa derleme veya bağlantı hataları ortaya çıkabilir.
PythonGraphicModule.cpp Düzenlemesi
PythonGraphicModule.cpp içinde eski JPG odaklı SaveScreenShot fonksiyonu silinmelidir. Bu fonksiyon özel dizin oluşturma, METIN2 klasörü ve .jpg dosya adı üretme mantığıyla çalıştığı için yeni BMP sisteminde artık gereksizdir.
PyObject* grpSaveScreenShot(PyObject* poSelf, PyObject* poArgs) { struct tm* tmNow; time_t ct; ct = time(0); tmNow = localtime(&ct); char szPath[MAX_PATH + 256]; SHGetSpecialFolderPath(NULL, szPath, CSIDL_PERSONAL, TRUE); strcat(szPath, "\\METIN2\\"); if (-1 == _access(szPath, 0)) { if (!CreateDirectory(szPath, NULL)) { TraceError("Failed to create directory [%s]\n", szPath); return Py_BuildValue("(is)", FALSE, ""); } } sprintf(szPath + strlen(szPath), "%02d%02d_%02d%02d%02d.jpg", tmNow->tm_mon + 1, tmNow->tm_mday, tmNow->tm_hour, tmNow->tm_min, tmNow->tm_sec); BOOL bResult = CPythonGraphic::Instance().SaveScreenShot(szPath); return Py_BuildValue("(is)", bResult, szPath); }Aynı dosyada eski Python binding satırı da kaldırılmalıdır.
{ "SaveScreenShot", grpSaveScreenShot, METH_VARARGS },Ardından grpSaveScreenShotToPath fonksiyonu yeni sisteme göre sadeleştirilir. Artık Python tarafından path gönderilmesine gerek yoktur; C++ fonksiyonu screenshot klasörünü ve dosya adını kendi üretir.
PyObject* grpSaveScreenShotToPath(PyObject* poSelf, PyObject* poArgs) { CPythonGraphic::Instance().SaveScreenShot(); return Py_BuildNone(); }root/game.py SaveScreen Fonksiyonu
Client source tarafı tamamlandıktan sonra root/game.py içinde SaveScreen fonksiyonu sadeleştirilmelidir. Eski yapı screenshot dizini, SCREENSHOT_CWDSAVE ve SCREENSHOT_DIR gibi farklı kayıt yollarına göre çalışır. Yeni sistemde Python tarafının yalnızca SaveScreenShotToPath çağrısı yapması yeterlidir.
Eski fonksiyon aşağıdaki gibidir:
def SaveScreen(self): print "save screen" # SCREENSHOT_CWDSAVE if SCREENSHOT_CWDSAVE: if not os.path.exists(os.getcwd()+os.sep+"screenshot"): os.mkdir(os.getcwd()+os.sep+"screenshot") (succeeded, name) = grp.SaveScreenShotToPath(os.getcwd()+os.sep+"screenshot"+os.sep) elif SCREENSHOT_DIR: (succeeded, name) = grp.SaveScreenShot(SCREENSHOT_DIR) else: (succeeded, name) = grp.SaveScreenShot() # END_OF_SCREENSHOT_CWDSAVE if succeeded: pass """ chat.AppendChat(chat.CHAT_TYPE_INFO, name + localeInfo.SCREENSHOT_SAVE1) chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.SCREENSHOT_SAVE2) """ else: chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.SCREENSHOT_SAVE_FAILURE)Yeni ve sade fonksiyon şu şekilde olmalıdır:
def SaveScreen(self): grp.SaveScreenShotToPath()Metin2 LibJPEG Kaldırma Rehberi İçin Test Adımları
Metin2 LibJPEG kaldırma rehberi uygulandıktan sonra test süreci mutlaka yapılmalıdır. İlk olarak client derlenmeli ve LibJPEG ile ilgili include, unresolved external veya eksik .lib hatası kalmadığından emin olunmalıdır. Ardından client çalıştırılıp screenshot tuşu denenmelidir.
Testte screenshot klasörünün otomatik oluşup oluşmadığı, BMP dosyasının doğru isim formatıyla kaydedilip kaydedilmediği ve dosyanın açılabilir olup olmadığı kontrol edilmelidir. Ayrıca farklı çözünürlüklerde, pencere ve tam ekran modlarında deneme yapmak da faydalı olur.
Genel Değerlendirme
Metin2 LibJPEG kaldırma rehberi, client source tarafını sadeleştirmek ve screenshot sistemini JPG yerine BMP formatına taşımak isteyen geliştiriciler için faydalı bir teknik düzenleme sunuyor. LibJPEG kütüphanesi screenshot dışında kullanılmıyorsa, bu bağımlılığı kaldırmak proje yapısını daha temiz hale getirebilir.
Yine de işlem dikkat ister. Dosya silme, Visual Studio proje düzenleme, C++ fonksiyon değişiklikleri ve Python tarafındaki çağrıların aynı anda uyumlu hale getirilmesi gerekir. Doğru uygulandığında screenshotlar BMP olarak kaydedilir ve LibJPEG bağımlılığı ortadan kalkar. Canlı client’a geçmeden önce mutlaka yedekli test yapılmalı ve farklı kullanım senaryoları kontrol edilmelidir.
Daha Fazla Oyun Icerigi
Rehber, haber, onizleme ve oyun dunyasina dair daha fazla icerige mmooyun.com sitemizden ulasabilirsiniz. Ek icerikler ve oyun odakli guncel paylasimlar icin dev.mmooyun.com adresini de ziyaret edebilirsiniz.
Paylaş :









