আমার প্রিয় পোস্ট

আমি একজন শিল্পী, গেমার এবং প্রোগ্রামার

int vs. float

২৮ শে নভেম্বর, ২০০৯ বিকাল ৪:৪৭

শেয়ারঃ
0 0 0


উপরের টাইটেল দেখে যারা পোস্টটা দেখছেন তারা সকলে নিশ্চই প্রোগ্রামার বা প্রোগ্রামিং সম্পর্কে জানতে আগ্রহী। আশাকরি ঈদের দিনে আমার প্রচেষ্টা বিফল হয়নি। তারপরও সামান্য বলতেই হয়ঃ

যেসকল সংখ্যায় দশমিক নাই অথবা ভগ্নাংশ নাই সেগুলো integer এবং যেগুলোতে আছে সেগুলো float । যেমন ১২ হল integer এবং ১০.০১ হল float । integer কে সংক্ষেপে int লেখা হয়। যদি বাইনারী রিপ্রেজেন্টেশন দেখেন তাহলে দেখবেন যে int কে মেমোরীতে রাখা খুবই সহজ বা float অপেক্ষা সহজ। অপরদিকে দেখবেন যে float কে রাখার জন্য একগাদা কাজ করতে হচ্ছে। কিন্তু বাস্তবে আমাদের বেশিরভাগ float নিয়েই গণনা করতে হয় [গেমে তো লাইফ আর অস্ত্রের এ্যারে ছাড়া সবই float]। আর int সাধারনত আমরা মুখে মুখে বলি [আমার ধারনা না এটা গেম ডেভেলপাররা বলে] যেমন "একজন মানুষ একটা কলা একহাতে ধরে এক কামড় দিল"। আপনারা যারা এ্যাসিম্বলি প্রোগ্রাম করেছেন তারা নিশ্চই জানেন যে float নিয়ে হিসাব করতে কতটা ঝামেলাই না পোহাতে হয়। আমাকেও হয়েছে। তবে আমি পরেরদিকে ম্যাক্রো তৈরী করে নিয়েছিলাম যেজন্য সহজ হয়ে গিয়েছিল। তবে ম্যাক্রো তৈরী করার সময় আমাকেও ঝামেলা পোহাতে হয়েছে। আপনি নেটে খুজলে অন্যের তৈরী এরকম কিছু ম্যাক্রো লাইব্রেরীও পেয়ে যাবেন।

ধরুন Turbo C++ এর কথা। এটাতে int এর জন্য ২ বাইট মেমোরী এ্যালোকেশন করতে হয় অপরদিকে float এর জন্য ৪ বাইট। gcc তে সামান্য পার্থক্য আছে তবুও int এ সবসময়ই float এর চেয়ে কম মেমোরী লাগবে। যদি একটা ইন্সট্রাকশনে int কে হ্যান্ডেল করা যায় তবে float কে হ্যান্ডেল করতে লাগবে কমপক্ষে এর দ্বি-গুন। গেম বা গ্রাফিক্স প্রোগ্রামের একেবারে লো-লেভেলে সবসময়ই চেষ্টা করা হয় যেন float না ব্যবহার করতে হয়। অনেকেই হয়ত ভাববেন যে তাহলে কনভার্ট করে দিলেই হল। যেমন C++ এঃ
float a = 1.1;
int b = (int) a;
চিন্তা করাটা স্বাভাবিক। কিন্তু একবার চিন্তা করেন যে এই কনভার্ট করতে কি কি ইন্ট্রাকশন এক্সিকিউট করতে হবে। কেননা ১১.৯ মানে ১১ না ১২। আবার ১১.১ মানে ১২ না ১১। এবার চিন্তা করেন যে কনভার্টেই কতটা প্রোসেসিং চলে গেল। ধরলাম যে আপনার মনিটরে রেজুলেশন খুবই কম দিয়ে রেখেছেন ৬৪০x৪৮০ পিক্সেল। আর্থাৎ আপনার মনিটরে ৩০৭২০০ টি পিক্সেল আছে। প্রতিটি পিক্সেলের জন্য যদি আপনি একটা কন্ডিশনাল জাম্প করেন তাহলে আপনি কি মনিটরে তাৎক্ষনিক আউটপুট পাবেন? তাছাড়াও কনভার্ট করার আগ পর্যন্ত তো আপনি float এ হিসাব করছেনই। সেজন্য আরও কিছু এক্সট্রা ইন্সট্রাকশন আপনাকে এক্সিকিউট করতে হয়েছে। আপনি যদি কোন এনিমেশনের ফ্রেমরেট ৩০ চান তাহলে তো আপনাকে সেকেন্ডে ৬৪০x৪৮০x৩০ টা জাম্প করতে হবে। এজন্য আপনাকে সবসময় float ত্যাগ করতে হবে।

মনে করি draw(x, y) একটা ফাংশন যা কালো স্ক্রিনে x, y বিন্দুতে একটা পিক্সেলকে সাদা রং করে দিবে। এখন আমরা যদি x1, y1 থেকে x2, y2 বিন্দুতে দাগ টানতে চাই তাহলে অনেকটা এমন প্রোগ্রাম করতে হবেঃ

public void lineSimple(int x0, int y0, int x1, int y1, Color color)
{
int pix = color.getRGB();
int dx = x1 - x0;
int dy = y1 - y0;

raster.setPixel(pix, x0, y0);
if (dx != 0)
{
float m = (float) dy / (float) dx;
float b = y0 - m*x0;
dx = (x1 > x0) ? 1 : -1;
while (x0 != x1)
{
x0 += dx;
y0 = Math.round(m*x0 + b);
raster.setPixel(pix, x0, y0);
}
}
}

অথবা আপনি এদিক সেদিক সামান্য অথবা অনেক পরিবর্তন করতে পারেন। তবে যাই করেন এভাবে এ্যালগরিদম লিখলে বেশ সমস্যা হবে। যেমন একটু খেয়াল করেন যে প্রোগ্রামটাতে আপনাকে কতটা float এর অপারেশন করতে হয়েছে। তাছাড়াও আবার একটা লাইব্রেরী ফাংশন ব্যবহার করা হয়েছে। এভাবেই যদি প্রোগ্রাম লেখা হয় তাহলে বৃত্ত আঁকতে তো একটা sine আর একটা cosine একটি লুপের ভেতরে দিতে হবে। তাদের আবার নিজস্ব ফাংশন আছে যা সিরিজ থেকে বের করতে হয়। এভাবে আগাতে থাকলে আমরা সেকেন্ডে একটা ফ্রেম রেন্ডার করতে পারব কিনা তার যথেষ্ট পরিমানে সন্দেহ আছে। আসুন দেখি কিভাবে একই কাজ শুধু int ব্যবহার করে করা যায়। আমি একটা এ্যালগরিদম দিলাম। এটা ডেভেলপ করেছেন Bresenham নামের একজন। এই এ্যালগরিদম যদিও গ্রাফিক্স কার্ডের ভেতরে দেয়াই আছে এবং এটা খুবই লো-লেভেলের একটা কাজ তবুও আপনি কম্পিউটার গ্রাফিক্স নিয়ে কাজ [আমি প্রোগ্রামিং এর কথা বুঝিয়েছি (ডাইরেক্ট এক্স বা ওপেন জি এল প্রোগ্রামিং না)] করতে গেলে অথবা আপনি যদি কোন রেন্ডারিং ইন্জিন বানাতে যান তাহলে আপনাকে বেসিক হিসেবে এগুলো জানতে হবে।

function line(x0, x1, y0, y1)
boolean steep := abs(y1 - y0) > abs(x1 - x0)
if steep then
swap(x0, y0)
swap(x1, y1)
if x0 > x1 then
swap(x0, x1)
swap(y0, y1)
int deltax := x1 - x0
int deltay := abs(y1 - y0)
int error := deltax / 2
int ystep
int y := y0
if y0 < y1 then ystep := 1 else ystep := -1
for x from x0 to x1
if steep then plot(y,x) else plot(x,y)
error := error - deltay
if error < 0 then
y := y + ystep
error := error + deltax

এখানে তো দেখা গেল যে int দিয়ে কাজ চালানো গেল কোন Error ছাড়াই। কেননা মনিটর আসলে একগাদা পিক্সেলের সমষ্টি। বর্তমানে যে Physics ব্যবহার হয় তাতে এভাবেই int দিয়েই কাজ চালানোর চেষ্টা করা হয়। কখনও কখনও আবার সামান্য Error কে মেনে নিয়ে কাজ করা হয়। আবার দেখা গেল যে একটা সিরিজ এমনঃ
y = 1/x + 1/x.x + 1/x.x.x + ..... ..... .....
সেখানে আমরা বেশিরভাগই দেখা যায় হয় তিন-চার ধাপ নিই অথবা রেজাল্টাকে ২-৩ দশমিক পর্যন্ত শুদ্ধ করে নিই। আর যদি আমরা মোবাইলে গেম ডেভেলপ করতে যাই তাহলে তো কথাই নাই। এক ধাপ নিয়েই খালাশ করতে হয় এবং int ব্যবহার করতেই হবে। তারপরও দেখা যায় মোবাইলগুলোর 3D গেমের ফ্রেমরেট হয় ২ না হয় ৩। আবার আরও একটা কাজ করা হয় তা হল সামনের বস্তু এবং গেমের প্রধান ক্যারেক্টারগুলোকে দরদ দিয়ে বানানো হয় আর বাকিগুলো খুবই সাদামাটাভাবে বানানো হয়।

আপনারা বলতে পারবেন কি যে nVIDIA, Havok, Uphoria এরা সবাই তাদের Physics নিয়ে খুবই মাতামাতি করে কিন্তু তারপরেও কেন Fight Night Round 4 এরমত একটা সিমুলেশন গেমে কেন মাঝেমাঝেই দড়ির ভেতরে হাত ঢুকে যায়? আবার এমনও হয় যে দড়ির সামান্য উপরেই হাতটা বেধে গেছে? এর একমাত্রই কারন যেটুকো Error হয়েছে তা সবই হয়েছে সেই float থেকে int এর কনভার্সনের কারনে।

আমার মাঝেমাঝেই হাসি পায় যে এত স্পিডের যুগেও আমরা একটা পারফেক্ট ফিজিক্সের জন্য কোন প্লাটফর্ম বানাতে পারিনা [মাইক্রো সিস্টেম]। তবে একটা কথা বলতেই হবে যে PS3 তে ফিজিক্স অনেক শক্তিশালি কেননা এতে ৮টা প্রোসেসর আছে। সেদিক থেকে আমার ড্রিম প্লাটফর্ম হচ্ছে PS3 । আবার আশা আছে PC এর ক্ষেত্রেও কেননা আমার জানা মতে পিসির শক্তিও বৃদ্ধি হবে শীগ্রই। তবে PS3 এর কোন তুলনা না করাই ভাল। আশাকরি একদিন এমন প্লাটফর্মও হবে যেখানে ১০০% ফিজিক্সের সিমুলেশন করা যাবে [মাইক্রো সিস্টেম]। এবং যাতে int এবং float এর কোন পার্থক্য থাকবে না সবই হবে number, real number।

 

লেখাটির বিষয়বস্তু(ট্যাগ/কি-ওয়ার্ড): intfloat ;
সর্বশেষ এডিট : ২৮ শে নভেম্বর, ২০০৯ বিকাল ৪:৫১ | বিষয়বস্তুর স্বত্বাধিকার ও সম্পূর্ণ দায় কেবলমাত্র প্রকাশকারীর...

 

১. ২৮ শে নভেম্বর, ২০০৯ বিকাল ৫:১৫
কাঠের খাঁচা বলেছেন: পেলাচ দিয়া প্রিয়তে রাখলাম। পরে পইড়া দেখমু...........
২৮ শে নভেম্বর, ২০০৯ বিকাল ৫:২৩

লেখক বলেছেন: না পড়েই + । হা হা হা ধন্যবাদ। পড়লেও আর - দিতে পারবেন না।

২. ২৮ শে নভেম্বর, ২০০৯ বিকাল ৫:২১
স্বাধীনতার বার্তা বলেছেন: পিএস থ্রি তে ৭টা প্রসেসর কাজ করে। ১টা বন্ধ থাকে। অর্থাৎ 3.2x7

ইন্টেল কোর আই ৭ এ ৮টা প্রসেসর (3.47x8) আর কোর আই ৯ এ ১২টা প্রসেসর (এইটা আসছে)।

তাছাড়া ৩২বিট অপারেটিং সিস্টেম এ ফিসিক্স ভালো কাজ করে না। ৬৪বিট এ ফিসিক্স খুব ভালো কাজ করে।
এক্সএফএক্স এর এজিপি তো ৩২বিট এ ফিসিক্স বলতে গেলে দিতেই পারে না।

পোস্টে +
২৮ শে নভেম্বর, ২০০৯ বিকাল ৫:২৬

লেখক বলেছেন: আপনার ভাল মনে হলেও সেই একই। যা যা বললেন সবই আমার আছে। কই সেই একই অবস্থা। আপনি একবার নিজে এসডিকে দিয়ে কিছু করে দেখেন। ঐ একই অবস্থা।

৩. ২৮ শে নভেম্বর, ২০০৯ বিকাল ৫:২৭
স্বাধীনতার বার্তা বলেছেন: আর একটা কথা। ফ্রেম রেট এর বিষয়টা বুঝলাম না। যদি ফ্রেম পার সেকেন্ড এর কথা বলেন, তাহলে ডিএমসি৪, আসাসিন'স ক্রিড, প্রোটোটাইপ এ ৬০ পেয়েছি। এফপিএস ২ এ তো কিছুই খেলা যাবে না। তার মানে, আমার বুঝতে ভুল হয়েছে। একটু বুঝাইয়া বলেন।
২৮ শে নভেম্বর, ২০০৯ সন্ধ্যা ৭:৩০

লেখক বলেছেন: আমি আসলে কম্পিউটারে ফ্রেমরেট ২/৩ বলিনি। আমি মোবাইলে ৩ডি -র কথা বলেছি। দেখবেন অধিকাংশ মোবাইলের ৩ডি গেমের ফ্রেমরেট ২/৩ ।

৪. ২৮ শে নভেম্বর, ২০০৯ বিকাল ৫:৩০
প্রতীক্ষিত বলেছেন: ব্যফক জ্ঞ্যানী ফোস্ট। এক্কেরে ঈদের দিনের উফযোগী।
২৮ শে নভেম্বর, ২০০৯ সন্ধ্যা ৭:৩২

লেখক বলেছেন: যাক তাহলে ঈদটা আর মাটি হল না। আর এটাও বুঝলাম যে জ্ঞানীরা ঈদ উৎযাপন করে ব্লগে পোস্ট দিয়ে। হা হা হাঃ

৫. ২৮ শে নভেম্বর, ২০০৯ বিকাল ৫:৩৫
স্বাধীনতার বার্তা বলেছেন: আমি আসলে বলতে চাইছি না যা পিসি বেশি ভালো। শুধুমাত্র পিএস৩ এর প্রসেসিং ক্ষমতার জন্যই তাতে সব ভালো আসবে তা মানতে পারি না।
আসলে গেম ডেভলাপাররা পিসি গেম বানানোর সময় কোর টু ডুয়ো/কোর টু কোয়াড এর হিসাব করে। এ জন্য তারা ওই প্রসেসর ফ্রেন্ডলি ভাবে গেম বানায়।
দান্তেস ইনফের্নো তো এই কারনে পিসি তে বের ই করবে না। আর আমার পিসি ছাড়া আর কিছুই নাই। :(
২৮ শে নভেম্বর, ২০০৯ সন্ধ্যা ৭:৪০

লেখক বলেছেন: আমি তো তা বলিনি। আমি বলেছি যে পিএস৩ তে ফিজিক্সের ডিটেইলস বেশি। যেমন আমার লেখা গড অব ওয়ার ৩ পোস্টটা পড়েন দেখেন সেখানে এমন একটা টেকনোলজি ব্যবহার করেছে যা এখনও পিসিতে ব্যবহার করা হয়নি। তবে কোর আই ৭ ব্যবহার করলে হবে ইনশাল্লহ।

পিসিতে আপনি কোর আই ৭ ব্যবহার করলেও আপনি পিএস৩ এর মত পাবেননা কেননা ওটার সিস্টেম আর্কিটেকচার গেমের জন্য বিশেষভাবে তৈরী। যে কারনে এখন পর্যন্ত আমরা কোন ১০০% পিএস২ এর ইমুলেটর পাইনি। পেয়েছেন কি?? আমার আগের একটা পোস্ট আছে নাম "█ ▲ O X বনাম W A S D" ওটা একবার পড়েন প্লিজ।

কেন? আমি তো ডান্টিস ইনফের্নোর প্লাটফর্মের ভিতরে পিসিও দেখলাম। মত পাল্টালো কবে?

৬. ২৮ শে নভেম্বর, ২০০৯ বিকাল ৫:৪৩
স্বাধীনতার বার্তা বলেছেন: কমেন্ট মডারেশন কেন? এই জিনিশটা বিরক্তিকর। ৪টা কমেন্ট দিয়ে বসে আছি!
২৮ শে নভেম্বর, ২০০৯ সন্ধ্যা ৭:৪৪

লেখক বলেছেন: এজন্য যে অধিকাংশ ব্লগারই টেকনোলোজির পোস্ট পছন্দ করেনা। আর গেমিং টেকনোলোজি তো পাত্তাই দেয় না। তাদের ঝামেলা করা থেকে আটকানোর জন্য।

ব্লগের প্রথম যে পোস্টটা দিয়েছিলাম সেখানে আমাকে একজন গালি দিয়েছিল। এবং বলেছিল যে আমি পাগল কেননা কার কাজ নেই যে ৩ডি ফিজিক্স প্রোগ্রামার হতে যাবে। হাঃ হাঃ হাঃ

৭. ২৮ শে নভেম্বর, ২০০৯ রাত ৮:৫০
স্বাধীনতার বার্তা বলেছেন: প্রোগ্রামিং ভালো। যদিও আমার কোন কিছুতেই তেমন আগ্রহ নেই। টেকনোলজির হাল্কা পাতলা খোঁজ রাখি, গেম হাল্কা পাতলা খেলি, প্রোগ্রামিং সম্পর্কে তেমন কিছুই জানি না।

কমেন্ট মডারেশন তুলে দিতে পারেন। কেউ গালাগালি করলে সাথে সাথে ব্লক। এইটা ভালো বুদ্ধি।
২৮ শে নভেম্বর, ২০০৯ রাত ১০:০৮

লেখক বলেছেন: আমার কিন্তু আগ্রহটা একেবারেই নাছোড় বান্দা। অনেকেই গেম প্রোগ্রামিং এর কথা চিন্তা করে কিন্তু সবাই ছেড়ে দেয়। অন্য লাইনে চলে যায়। আবার কেউ ধাক্কা খেয়ে এ লাইনে আসে। আমি কিন্তু যেই চিন্তা সেই কাজই এখনও করছি।

আপনার উপদেশ শীরধার্য। পরবর্তী পোস্ট থেকে আর মডারেশন দেবনা।

৮. ২৯ শে নভেম্বর, ২০০৯ দুপুর ১:৪৯
_তানজীর_ বলেছেন: স্বাধীনতার বার্তার কমেন্ট মডারেশন বিষয়ে একমত।

অনেক ভালো মানের ডিটেইল লেখা। কে কি বলল সেটা নিয়ে এত ভাবার কি আছে? যে আপনাকে পাগল বলেছে সে ৩ডি গেমের প্রোগ্রামার হতে পারবেনা বলেই বলেছে (আঙ্গুল ফল টক)- এটা আমরা সবাই জানি। আশা রাখি শীঘ্রই এমন জায়গায় চলে যাবেন, যেখানে থেকে ঐসব গালি আর আপনার কানে যাবেনা- কিন্তু নিন্দুকেরা তাদের কাজ সবসময়েই চালিয়ে যাবে। এরকম কোয়ালিটির ট্যাকনিকেল লেখা বাংলাতে খুব বেশি নেই- তাই আমি চাই আপনি (এবং আপনার মত যারা আছেন তারা) আরো বেশি করে লিখুন! দেশের জন্য লিখুন! :)

আপনার লেখার সাথে দ্বিমত করার মত কিছু খুঁজে পেলাম না। অনেক ব্যাপার নিজেই খুব একটা ভালো জানিনা :(

আপনাকে ঈদের শুভেচ্ছা! ভালো থাকবেন!
০২ রা ডিসেম্বর, ২০০৯ সকাল ১১:২৯

লেখক বলেছেন: ধন্যবাদ। আপনাকেও ঈদের শুভেচ্ছা যদিও ঈদ শেষ, তবু আশা আছে কেননা আর এক বছর পরেই তো আবার ঈদ।


""উইন্ডোজ সেভেন সবার সেরা!"" - বেশ ভাল একটা টাইটেল। + দিলাম এখান থেকেই।

৯. ২৯ শে নভেম্বর, ২০০৯ রাত ৮:০৯
স্বাধীনতার বার্তা বলেছেন: হেল্লো ভাইয়া। আমার পোস্টে হা হা হা কেনো দিলেন বললেন না।
একটু বলে আসেন।
এইটা মডারেশনের পর ডিলিট মাইরেন।
০২ রা ডিসেম্বর, ২০০৯ সকাল ১১:৩০

লেখক বলেছেন: জবাবও দিয়েছি, ডিলিটও মারিনি। আবার একটু হাসিঃ হাঃ হাঃ হাঃ

১০. ০৪ ঠা ডিসেম্বর, ২০০৯ সকাল ১০:৫৯
ম্দু বলেছেন: "এরকম কোয়ালিটির ট্যাকনিকেল লেখা বাংলাতে খুব বেশি নেই"----একমত...এরকম ভাল লেখা পেলে আমাদের মত মানুষের কত যে উপকার হয়...প্রিয়তে.. B-)
০৫ ই ডিসেম্বর, ২০০৯ সকাল ১০:৫১

লেখক বলেছেন: আমার এক বন্ধু বলে যে উপকারীর অপর নাম ***** ।

১১. ১৭ ই ডিসেম্বর, ২০০৯ দুপুর ১২:৫৪
হেডফোন বলেছেন: ভাই আপনার সাথে কথা বলতে চাই। আমার ইমেইল এ আপনার ইয়াহু অথবা স্কাইপ অথবা গুগুলটক এর আইডি দেন প্লিজ। আমার ইমেইল হলো । আমি ভিবি দিয়ে স্ক্রলিং আর্কেড গেম বানাইসিলাম, পুরা গেম ইন্জিন-গ্রাফিক্স-মিউজিক-সাউন্ড আমার বানানো সিলো আই মিন নো ডাউনলোড আর্কি। অবশ্য গেমটা মার্কেট পায় নাই। :D
১৮ ই ডিসেম্বর, ২০০৯ রাত ১:০৮

লেখক বলেছেন: আমি আপনাকে মেইল পাঠাচ্ছি।

১২. ২০ শে ডিসেম্বর, ২০০৯ রাত ২:০০
হেডফোন বলেছেন: ভাই আমিতো কোনো ইমেইল রিজিভ করি নাই। ইমেইল পাঠাইলে দেখেন যে বানান ঠিক আসে কি না প্লিজ। আই এম ওয়েটিং।
২০ শে ডিসেম্বর, ২০০৯ সকাল ৭:৩১

লেখক বলেছেন: আমি তো ইমেইল পাঠিয়েছি। অরেকবার পাঠাচ্ছি অপেক্ষা করেন।

 

মোট সময় লেগেছে ১.০১১১ সেকেন্ড

 

সামহোয়‍্যার ইন...ব্লগ বাঁধ ভাঙার আওয়াজ, মাতৃভাষা বাংলায় একটি উন্মুক্ত ও স্বাধীন মত প্রকাশের সুবিধা প্রদানকারী প্ল্যাটফর্ম। এখানে প্রকাশিত লেখা, মন্তব‍্য, ছবি, অডিও, ভিডিও বা যাবতীয় কার্যকলাপের সম্পূর্ণ দায় শুধুমাত্র সংশ্লিষ্ট প্রকাশকারীর...
© সামহোয়্যার ইন...নেট লিমিটেড | ব্যবহারের শর্তাবলী | গোপনীয়তার নীতি
আমি একজন ৩ডি ফিজিক্স প্রোগ্রামার
আমি ভালবাসি গেম, কোড, চিন্তা এবং গেম
অবশ্যই গেম দু'বার
আর এস এস ফিড

পোস্ট আর্কাইভ

আমার লিঙ্কস

আমার বিভাগ

    কোন বিভাগ নেই