برای انکه شما بتوانید با استفاده از GTK+ به توسعه نرم افزار در محیط گنوم بپردازید لازم است که پیش تر بتوانید به راحتی با زبان C کار کنید . Andrew Krause در شماره 21 مجله free software یک مقاله بسیار جامع برای اموزش مفاهیم زبان برنامه نویسی C نوشته است که مطالعه ان برای مبتدیان به عنوان یک مرجع کوتاه و بسیار مفید توصیه می شود . در این مقاله هر انچه که شما باید از زبان C بدانید تا بتوانید با کتابخانه GTK+ کار کنید ذکر شده است .
If you want to develop applications with GTK+, a graphical toolkit used by the GNOME desktop environment, it is essential that you are comfortable with the C programming language. This article is meant to give you a short refresher on the basics of C that you will need to know when developing GTK+ applications.
Basic C program structure
Every C program is composed of one or more functions in the following format. The function receives a number of variable parameters, runs the commands in the function, and then returns a variable of the given type. Note that you can omit the return value by using void as your function type.
type function (parameters)
{
local variables
commands
}
Here is a practical example (don’t worry if you don’t understand it yet):
int my_function(int a)
{
char b;
b='r';
printf("%d %c",a,c);
}
Another example function is shown below. The main() function is the only one that is required by every C program. It receives two parameters (argc and argv), which contain the command line parameters entered when the program begins and the number of parameters. The function should return an integer to exit. The following code will print out “x = 0 and y = 1”. (The printf() function will be covered later in this section!)
#include <stdio.h>
int main (int argc, char *argv[])
{
int x, y;
x = 0;
printf ("x = %d ", x);
y = 1;
printf ("and y = %d", y);
return 0;
}
Compiling your programs
If you are reading this article, you will probably need to compile your programs. Assuming that you call your file result.c, you can compile your programs by typing:
gcc -o result result.c
You will now be able to run the program by typing ./result in the directory where the program was compiled. It’s handy to have a console open with the program, and a second console with the command line above, ready to compile the code.
Variable types
C provides a number of variable types. You may notice that these are very basic types, all holding numbers, but they can be used to represent any piece of data. The following table gives an overview of the types that are available to you.
Data Type |
Bytes |
Lower Bound |
Upper Bound |
char |
1 |
-128 |
127 |
unsigned char |
1 |
0 |
255 |
short (int) |
2 |
-32768 |
32767 |
unsigned short (int) |
2 |
0 |
65536 |
int |
4 |
-2^31 |
2^31 - 1 |
unsigned int |
4 |
0 |
2^32 - 1 |
long (int) |
4 |
-2^31 |
2^31 - 1 |
unsigned long (int) |
4 |
0 |
2^32 - 1 |
float |
4 |
-3.2e38 |
3.2e38 |
double |
8 |
-1.7e308 |
1.7e308 |
C Data Types
It’s important to think about where you place the declaration when creating variables. The scope of a variable refers to which parts of the application can access the variable. In general, variables use the following scope rules in C:
You can declare variables outside any function, such as above the main() function. This is called a global variable. Also, a variable declared within a function is local to that function.
Arrays
The variable types previously mentioned are useful, but what if you want a thousand integers? It would take quite some time to create a variable for each of these integers. To solve this problem, you could create an array of integers. The following program creates an array, and then fills it up with the numbers 1 to 1000. Notice that arrays are indexed beginning from zero.
int arrayOfInt[1000], i;
for (i = 0; i < 1000; i++)
arrayOfInt[i] = i + 1;
It is also possible to create arrays with multiple dimensions. The following applications creates an array that has 1000 columns and 1000 rows, and fills it up with the sum of the indexes.
int multiArray[1000][1000], i, j;
for (i = 0; i < 1000; i++)
for (j = 0; j < 1000; j++)
arrayOfInt[i][j] = i + j;
The maximum number of dimensions is defined by the compiler, but most applications do not use more than three at the most. If you reach the maximum (GCC’s maximum is 29), you should consider rethinking your approach to the problem at hand!
Outputting (printing) data
Although GTK+ is a graphical toolkit, it is still useful to be able to output debugging information to the terminal. To do this in C, you would use printf(), which you already saw in a previous example. You can use additional parameters in this function to embed numbers and strings into the output text. In order for this function to work, you must include the header file stdio.h
The following example would print out “x = 5 and y = 10.7”. The %d is replaced by the first variable, which is an integer. Then, %4.1f is replaced by the second floating point variable with a maximum length of 4 characters and one character following the decimal point.
int x = 5;
double y = 10.74;
printf ("x = %d and y = %4.1f", x, y);
There are a large number of options available of printf(). It would be pointless to enumerate them here since the reference is available on thousands of sites around the Internet. To read more on this function, take a look at this page.
Conditionals and loops
C provides a number of methods for controlling the flow of your program. In order to understand these, you need to understand a few logical operators that are available. They are introduced in the following table.
Operator |
Description |
== |
Comparison operator that returns true if the value on the left is equal to the value on the right. |
!= |
Comparison operator that returns true if the value on the left is not equal to the value on the right. |
< (>) |
Comparison operator that return true if the value on the left is less than (greater than) the value on the right. |
<= (>=) |
Comparison operator that return true if the value on the left is less than (greater than) or equal to the value on the right. |
&& |
Used to concatenate multiple comparisons that will only return true if both evaluate to true. For example, ((2 > 1) && (0 > 1)) would return false. |
|
| | Used to concatenate multiple comparisons that will return true if at least one evaluates to true. For example, ((2 > 1) || (0 > 1)) would return true. |
! |
Returns the opposite value of the following expression. For example, !(1 > 0) would return false. |
Logical Operators in C
If/else comparisons
The if statement is a comparison command that can be used to run code only if a condition is met. In addition, you can include optional else if statements, that will only be evaluated if the previous statements were found to be false. Lastly, an else statement can be used at the end to catch all other cases.
The following example shows you how to use an if. Note, the curly brackets can be omitted if only one command is run after a conditional statement.
int x;
if (x > 0) {
printf ("x is positive");
}
else if (x == 0) {
printf ("x is equal to zero");
}
else {
printf ("x is negative");
}
In this example, what would be printed if x was equal to -5, 0, or 5? The application would print “x is negative”, “x is equal to zero”, and “x is positive” respectively.
The switch statement
The switch can be used as a cleaner style in place of some if statements. It compares the variable or expression in the switch to each case value. If the correct value is found, all of the commands will be run until a break or the end of the statement is reached.
In the following example, white space will be printed if ch is a space, tab, or new line character. If the letter is an uppercase vowel, vowel will be printed. Otherwise, the output will show other character.
char ch;
switch (ch) {
case ' ':
case '\t':
case '\n':
printf ("white space");
break;
case 'A':
case 'E':
case 'I':
case 'O':
case 'U':
printf ("vowel");
break;
default:
printf ("other character");
}
The default case is not required, but it can be used to catch all other cases not previously specified. Note that each case value must be constant, meaning that they cannot be variables.
While loops
The while loop will continue to run its contained commands over and over until its condition is evaluated as false.
while (condition) {
commands
}
In the following example, the while will continue running until x is greater than or equal to ten. The break statement can be used to exit the loop before it is completed. What will this code print out?
int x = 0;
while (x < 10) {
printf ("%d ", x);
x += 2;
if ((x % 3) == 0)
break;
}
The code above will print 0 2 4 . The x variable is incremented by 2 every time, but when it reaches 6, the if statement evaluates to true and exits the loop. Note: The percent sign (%) represents the modulus operator, which returns the remainder of the division.
For loops
The for loop allows you to perform initialization, comparison, and incrementing all at once. You can omit one or all of these steps by leaving it blank, although leaving out the comparison will make an infinite loop. In this case, you could use the break command to exit the loop when necessary.
for (initialize; comparison; increment) {
commands
}
In the following example, the integer i is initialized to zero at the beginning of the loop. It will continue running until i is greater than or equal to ten, incrementing by one every time the loop is run. What will this code output?
int i;
for (i = 0; i < 10; i++) {
if ((x % 3) == 0)
continue;
printf ("%d ", i);
}
The above code will output 1 2 4 5 7 8 . If x is divisible by three, continue will skip the rest of the loop’s iteration, so the values 0, 3, 6, and 9 will not be printed. You can also use the break command with for loops.
Pointers
One of the most important parts the C programming language is the pointer. A pointer is basically a variable that store the memory address of a variable, array, function, etc. There are two operators that are used with pointers:
To help you understand this concept, look at the following example. The second line creates a pointer that stores the memory location of x. The next line dereferences ptr, printing out the integer at that memory location (1). Then, the memory location ptr is set to the value 7. Since ptr points to x, the last statement prints out “7”.
If you find this confusing, slowly re-read the sentence above (yes, it does make sense!) and experiment with the code.
int x = 1;
int *ptr = &x;
printf ("%d", *ptr);
*ptr = 7;
printf ("%d", x);
Pointers are very powerful, because they can be used with arrays. The following example creates an array of one hundred characters, and then uses a pointer to traverse the array, setting each to the value of its index.
char chArray[100];
char *ptr;
int i;
for (i = 0, ptr = &chArray[0]; i < 100; i++, ++ptr)
*ptr = i;
This example shows a few important concepts. First, you should notice that you can provide multiple commands in the first and third parts of the for statement by separating them will commas. This allows you to initialize multiple variables, or provide more than one increment.
In terms of pointers, you can increment or decrement a pointer by using standard integer operations. It is legal to move a pointer with any of the following: ++ptr, --ptr, ptr += 10, ptr -= intVariable, etc.
Strings
Strings are very important to any programming language, because human interaction would be very difficult otherwise. A string is defined in C as an array of char variables. Each string in C must end with the null character (‘\0’ or 0) so that the end can be found. This is because most strings are stored as pointers.
The following example shows one way to create a string. A pointer called text is created that points to nothing at first. It is then initialized to “Hello world!” and printed to the screen.
char *text;
text = "Hello world!";
printf (text);
This string was initialized by setting the text directly, but this is generally not a good idea. Instead, you should use a function defined in string.h called strdup() to dynamically allocate a copy of the string like the following example. Once the application is done with the string, free() should be called so that the memory taken up by that string can be used by other parts of the program.
char *text;
text = strdup ("Hello world!");
printf (text);
free (text);
There are a number of other functions available in string.h for manipulating strings. The following application shows a few of them, but you should reference the header file for a full list of functions.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main ()
{
char *text1, *text2;
text1 = strdup ("+");
text2 = (char*) malloc (10 * sizeof (char));
strcpy (text2, text1);
while (strlen (text2) < 10)
{
if (strcmp (text2, "+++++") == 0)
printf ("Pluses: ");
strcat (text2, text1);
}
printf (text2);
free (text1);
free (text2);
return 0;
}
The example above is a bit frivolous, but it shows some of the most common functions used for string manipulation. First, the malloc() function was used to allocate a piece of memory with a size of 10 bytes. This function requires you to include stdlib.h and will be covered in more detail in the next section.
Then, the contents of text1 are copied into text2 with strcpy(). The loop continues until the length of text2 is nine characters. During each iteration of the loop, a single plus is concatenated to the variable with strcat().
The conditional statement uses strcmp() to compare two strings. It will return a negative number if the first string should be sorted before the second, zero if the two strings are equal, or a positive number otherwise. You should note that you cannot use ==, !=, or any other operator to compare strings, since using those operators would just comparing the pointer location!
Dynamic memory allocation
One of the main reasons for pointers is to enable dynamic memory allocation, or the ability to allocate memory while the application is running. Memory is allocated in C with malloc(), which uses the following syntax. It accepts the number of bytes to allocate, returning a pointer to the newly allocated memory location. When you are done with the memory, you must call free(), or that space will be leaked by your application!
int *data;
data = (int*) malloc (100 * sizeof (int));
In addition to this function, you can use calloc(), which allocates an array of data with the given size. In the following example, an array of 100 elements with a size of 4 bytes is allocated. This code does the same essentially the same thing as the previous example.
int *data;
data = (int*) calloc (100, sizeof (int));
As with malloc(), everything allocated with calloc() should be freed when you are done using it. Also, one of the most common problems encountered with pointers is not allocating memory before using it, so make sure to avoid using uninitialized pointers! Basically, if you get a Segmentation Fault, you are misusing pointers.
Structures
The struct type allows you to create your own data types in C. For example, let us assume you want to store information about an animal. You could use the following structure to do this:
typedef struct
{
char *name;
char *sound;
int legs;
} animal;
The structure definition above creates a new data type called animal. This data type holds two strings and one integer. This is useful because you can create as many instances of animal as you want. The following code shows two ways you can use the new structure, one without and one with pointers.
animal cow;
animal *chicken;
cow.name = strdup ("Cow");
cow.sound = strdup ("Moo");
cow.legs = 4;
chicken = (animal*) malloc (sizeof (animal));
chicken->name = strdup ("Chicken");
chicken->sound = strdup ("Cluck");
chicken->legs = 2;
free (chicken);
In this example, and instance of animal is created called cow. Since this is not a pointer, you can use the period character to reference the members of the structure. In the second part of this code, the memory is allocated for another animal instance. Notice that, with a pointer, you must use -> to access the members of the structure!
It may not be immediately apparent from this example why you would want to use a pointer. However, if you wanted to pass the structure to a function, it would be much more convenient. Passing chicken would just create a copy of the pointer. This is why pointers are preferred in C.
Conclusion
By now, you should be familiar with the basics of the C programming language. While there are other aspects of the language that you may need to learn when programming with GTK+, these basics will allow you to use all but the most advanced portions of the libraries.
If you are interested in learning GTK+, I would encourage you to check out my book on the subject: Foundations of GTK+ Development. This book covers everything from the basics of the libraries to creating your own widgets, and much more in between.
اشاره : یک بازی کامپیوتری را روی کامپیوترتان اجرا میکنید. فعلاً کارت گرافیک شما روی اسلاتAGP سوار میشود، پردازشگر سلرون دارید و ... پس از چند ماه یا چند سال کامپیوتر جدیدی میخرید. اکنون اسلات کارت گرافیکی شما PCI Express است و یک پردازشگر 64 بیتی دارید. همان بازی را روی این کامپیوتر هم نصب و اجرامیکنید! شاید به نظر طبیعی میآید که همه چیز باید همینطور باشد. اما چگونه یک بازی روی کامپیوترهایی با تراشهها و سختافزارهای مختلف و گاه فناوری متفاوت اجرا میشود؟ APIهای گرافیکی یا همان رابطهای برنامهنویسی، بخش بزرگی از این مشکل را حل میکنند و امکانات گسترده دیگری را نیز در اختیار برنامهنویسان و توسعهدهندگان بازی و برنامههای چندرسانهای قرارمیدهند. OpenGL وDirectX، دو مجموعه API گرافیکی و صوتی هستند که برای آسانتر ساختن توسعه بازیها و نرمافزارهای چندرسانهای طراحی شدهاند.
API گرافیکی چیست؟
API درواقع بین برنامه و سختافزاری که برنامه روی آن اجرا میشود، نقش یک هماهنگکننده را دارد و مانند پلی میان سختافزار و نرمافزار ارتباط ایجادمیکند. یعنی برنامهنویس کدهایی مینویسد که دادههای گرافیکی خود را به وسیله دستورهای استانداردی به درایور API میفرستد نه مستقیماً به خود سختافزار. سپس درایوری که شرکت سازنده سختافزار تولیدکرده است، این کداستاندارد تولیدشده را به فرمت بومی و ویژهای که برای آن مدل خاص سختافزار قابل شناسایی است، ترجمه میکند.
Microsoft DirectX
شرکت مایکروسافت در سال 1995 DirectX را ساخته و توسعه دادهاست. این نرمافزار شامل مجموعه یکپارچهای از ابزارهای برنامهنویسی است که به توسعهدهندگان امکان میدهد انواع مختلف نرمافزارهای مالتیمدیا را روی پلتفرم ویندوز تولید کنند. DirectX به برنامهای که بر پایه آن طراحی شده امکان میدهد به آسانی قابلیتهای سختافزار کامپیوتر را شناسایی کند و پارامترهای برنامه را با آن هماهنگ سازد.
DirectX شامل APIهایی است که دسترسی به بخشهای ویژهای از سختافزار مانند تراشههای شتابدهنده گرافیک سهبعدی و کارت صوتی را میسرمیکند. این APIها کنترل توابع سطح پایین، یعنی نزدیک به سختافزار، شامل شتابدهنده گرافیکی دو بعدی، پشتیبانی از دستگاههای ورودی مانند دسته بازی، صفحهکلید و ماوس، و کنترل میکس و خروجی صدا را انجام میدهند.
DirectX 7.0 در سال 1999 با شش کامپوننت عرضه شد که عبارت بودند از: Direct3D،DirectDraw ،DirectSound ،DirectPlay ،DirectInput و DirectMusic.
در اواخر سال 2000 میلادی، DirectX 8.0 عرضه شد که در آن کامپوننتهای DirectSound و DirectMusic با هم ادغام شدند و با نام کامپوننت Direct Audio معرفی شدند.
Direct3D و DirectDraw نیز با هم ادغام شدند و یک کامپوننت با نام DirectX Graphics را ساختند. DirectShow نیز به صورت یک API جداگانه پیادهسازی شد و به یکی از کامپوننتهای DirectX تبدیل گردید.
DirectX 9.0 در ژانویه سال 2003 عرضه شد. ویژگیهای خاص این نسخه عبارتند از:
- قابلیتهای صوتی جدید در DirectSound
- سختافزار رندرکننده ویدیویی با شتاب بیشتر
- بهبود قابلیت برنامهریزی گرافیکی
APIهای همه کامپوننتهای DirectX برپایه COM یا Component Object Model هستند. در ادامه به بررسی هفت کامپوننت DirectX 9.0 میپردازیم که عبارتند از: DirectDraw ،Direct3D ،DirectShow ،DirectSound ،DirectMusic ،DirectInput و DirectPlay.
1- DirectDraw
DirectDraw، کامپوننتی ویژه طراحی دوبعدی است که به برنامهنویس اجازه میدهد مستقیماً به حافظه کارت گرافیک دسترسی یابد، صحنهها و فریمها را با هم ترکیب نماید یا bitmapها را در آنجا ذخیره کند. همچنین، برای برنامهها امکان دسترسی به سختافزارهای ویژه نمایش را مستقل از نوع سختافزار فراهم میکند.
هر برنامه کاربردی DirectDraw الگوی یکسانی دارد که عبارت است از:
- ایجاد یک شی
- شروع حلقه
- انتقال به مانتیور
- پایان حلقه
- پاک کردن آن شی
منظور از واژه <یک شی> میتواند هر تصویر دوبعدیای باشد و منظور از حلقه، حلقهای است که در برنامهنویسی هنگام تکرار منظم دستهای از دادهها یا دستورها به کار میبریم. تصویر ایجادشده پس از مدتی پاک میشود و جای خود را به تصویر دیگری میدهد.
2- Direct3D
این کامپوننت، دسترسی به توابع رندرکننده گرافیک سهبعدی تعبیه شده در بیشتر کارتهای گرافیک را فراهم میکند. Direct3D یک API سطح پایین سهبعدی است که به نرمافزار امکان میدهد مستقل از سختافزار، با سختافزار شتابدهنده ارتباط برقرار کند. لایهای که برای توسعهدهندگان بازی و گرافیک کامپیوتری امکان طراحی و ساخت بازیها را مستقل از سختافزار کامپیوترها فراهم میکند، لایهای به نام
Hardware Abstraction Layer) HAL) است.
HAL با قابلیتهایی که به صورت گسترده در سختافزارهای گرافیک سهبعدی پیادهسازی شدهاند ارتباط ایجاد میکند و به سازندگان امکانمیدهد درایورهایی را تولید کنند که لایه HAL را به سختافزار پیوند دهد. این کار باعث میشود برنامههای کاربردی Direct 3D بدون اینکه برای نوع خاصی از قطعه سختافزاری نوشته شده باشد، از ویژگیهای بخشهای خاص آن قطعه سختافزاری بهرهببرد. در شکل یک چگونگی ارتباط لایه HAL با سختافزار و نرمافزارهای مرتبط نشان داده شده است.
شکل 1 - چگونگی ارتباط لایه HAL با کارت گرافیک و نرمافزارهای مرتبط
همانگونه که در شکل یک، نشان داده شده، نرمافزار بازی بالاترین سطح است و پس از آن کامپوننتهای ترسیم دوبعدی و سه بعدی، یعنی DirectDraw و Direct3D قرار دارند. لایه HAL یک رابط میان کامپوننتهای DirectX و کارت گرافیک است.
در سیستم رندر Direct3D، ساختار اشیای سهبعدی پیش از آنکه شتابدهنده سهبعدی، یک صحنه سهبعدی را رندر نماید و آن را به مانیتور منتقل کند، به وسیله CPU پردازش میشود. نسخه ششم کامپوننت Direct3D از قابلیتهای کارتهای گرافیک جدیدتر پشتیبانی مینماید و در هر گذر، چندین بافت را با هم رندر میکند.
کاهش زمان رندر به استفاده از نقشه بافتها نیاز دارد. این نسخه تکنیکهایی برای افزودن جلوهای واقعیتر به صحنههای سه بعدی را نیز دربردارد.
مانند anistropic filtering که عنصر عمق را به trilinear filtering و نقشه برجستهسازی میافزاید که موجب ایجاد شباهت بیشتر بافتها و نیز منابع نور تابیده شده بر سطوح مسطح با نمونههای واقعی آنها میشود.
نسخه هفتم DirectX نسبت به نسخههای پیش از خود بیست درصد سریعتر و شامل چند ویژگی دیگر بود. مهمترین آنها پشتیبانی از تغییرات شتاب سختافزاری و نوردهی (T&L) به وسیله اغلب کارتهای گرافیک سهبعدی آنزمان به ویژه کارتهایی است که برپایه تراشههای nVidia Geforce 256 و S3 Savage 2000 ساخته شدهاند. از زمانی که T&L عرضه شد، وقتگیرترین وظیفه CPU هنگام اجرای بازیهای پیشرفته به شتابدهنده سهبعدی داده شد و بخش بزرگی از ظرفیت پردازنده اصلی به کارهای دیگر مانند هوشمصنوعی بازی اختصاص داده شد و توسعهدهندگان بازی توانستند رندر را با جزئیات بیشتر انجام دهند و جلوههای ویژه پیچیدهتری را در بازیها بهکار ببرند.
3- DirectShow
این کامپوننت از بسیاری از فرمتهای صوتی و ویدیویی شامل AVI ،MPEG ،ASF ،WMA/WMV ،DV و MP3 و DirectX پشتیبانی میکند و روی ویندوزهای 98، 2000، اکسپی و نرمافزار اینترنت اکسپلورر عرضه شده است.DirectShow پروسه کارهای مالتیمدیا مانند نمایش فایل ویدیویی را به مجموعهای از مراحل که با نام
filter شناخته میشوند تقسیم میکند.
فیلترها تعدادی pin ورودی و خروجی دارند که آنها را به هم متصل میکند. طراحی کلی سازوکار اتصال به این صورت است که فیلترها میتوانند به روشهای مختلف به هم متصل شوند که هر نوع از این اتصالها به معنی انجام دادن یک کار است و توسعهدهندگان نرمافزار میتوانند افکتهای خود یا فیلترهای دیگری را به بخشی از این گراف برای انجام کار ویژهای بیفزایند. گراف فیلتر DirectShow به صورت گسترده در ضبط صدا و فیلم، و ویرایش آنها به کار میرود.
شکل 2 - یک گراف فیلتر که کار نمایش یک فایل MPEG را نشان میدهد.
در شکل دو، یک گراف نمایش برای فایل فیلمی از نوع MPEG نشان داده شده است. برنامههای کاربردی DirectShow، برای پردازش دادههای مالتیمدیا، از این گراف استفاده میکنند.
دادههای چند رسانهای در این گراف (در حالی که کارها به وسیله برنامه کاربردی کنترل میشوند) از فایل منبع به سمت مقصد که میتواند یک قطعه سختافزاری باشد حرکت میکنند.
ولی در برخی مواقع، برنامه کاربردی علاوه بر کنترل گراف، دریافتکننده یا فرستنده داده نیز هست.
هر گره این گراف، همانگونه که گفته شد، یک فیلتر است و کار ویژه خود را انجام میدهد. فیلتر source، دادهها را از یک فایل یا URL میخواند. فیلتر Parser، بخشهایی از دادههای صوتی و ویدیویی را به رمزگشای مناسب میفرستد. رمزگشاها، دادههای صوتی و ویدیویی را رمزگشایی مینمایند یا از حالت فشردگی خارج میکنند.
فیلتر رندرکننده، دادههای دریافت شده صوتی و ویدیویی از رمزگشا را پخش میکند یا آنها را نمایش میدهد.
4- DirectSound
این کامپوننت همزمان با ساخت ویندوز 95، زمانی که درایورهای صوتی از نوع VXD بودند به DirectX افزوده شد. در این کامپوننت APIهای ویژهای ایجاد شد که نویسندگان درایورهای صوتی میبایست آنها را به محصولات خود، که فرمت VXD داشت، میافزودند تا به درستی با DirectSound کار کند.
برنامههای چندرسانهای با این کامپوننت به سختافزارهای صوتی مانند کارت صوتی دسترسی پیدامیکنند. از مهمترین ویژگیهای این API، ترکیب صدا و کنترل سطح آن است.
DirectSound همچنین اجازه میدهد چندین برنامه کاربردی، بدون پیش آوردن وقفه، همزمان به کارت صوتی دسترسی داشته باشند. ایجاد افکتهای صوتی از دیگر تواناییهای DirectSound است. پس از سالها توسعه، اکنون DirectSound یک API پخته و کامل است و بسیاری قابلیتهای دیگر را نیز فراهم میکند؛ مانند قابلیت پخش صداهای چند کاناله با وضوح و دقت بالا.
5- DirectMusic
تاکنون بازیهایی را تجربه کردهاید که در تمام مدت یک مرحله، موسیقی یکنواخت و ثابتی دارند؟ بازیای را در نظر بگیرید که برنامهنویسان آن میخواهند یک آهنگ، در تمام مدت، در یک مرحله از آن به صدا دربیاید. با استفاده از برنامه DirectMusic Producer، آنها میتوانند در آن مرحله برای آهنگ، یک درجه در نظر بگیرند.
این درجه میتواند بسته به نوع عملکرد شخصیت بازی، تغییر کند. اگر شخصیت بازی در حال راه رفتن است، آهنگ آرام و هنگامی که با دشمن خود مبارزه میکند، آهنگ تندتر میشود و یا نوع آهنگ تغییر میکند و هنگامی که مبارزه تمام میشود، آهنگ دوباره آرام میشود. این تغییرها بدون ایجاد وقفه، به صورت پویا و بدون دخالت کاربر انجام میشود. چون براساس DirecMusic، آهنگ به صورت شناور و بدون وقفه با نواختن واریاسیونهای مختلف با قابلیت واکنش به رویدادهای بازی تولید میشود.
DirectMusic، با دادههای موسیقی براساس پیامهای حاوی اطلاعات کار میکند. یک آهنگ میتواند در داخل سختافزار و با نرمافزارهای آهنگساز مانند Microsoft Synthesizer ساخته شود. DirectMusic از استانداردهایMIDI و DLS پشتیبانی میکند.
6- DirectInput
این کامپوننت، سازوکار مشترکی را برای دسترسی به بسیاری از کنترلکنندههای بازی مانند دسته بازی، گیمپد، صفحه کلید و ماوس فراهم میآورد. مهمترین تغییری که هنگام عرضه DirectX8 در DirectInput ایجاد شد، آمدنaction map بود. action map از توابعی مانند راندن یک وسیله یا شلیک یک گلوله (که بهوسیله دستگاههای ورودی ایجاد میشود) استفاده میکند. زمانی که یک سختافزار ورودی مانند دسته بازی را میخرید، معمولا ًaction mapنیز برای بسیاری از انواع رایج بازیها مانند شبیهساز پرواز، تیراندازی اول شخص و بازیهای مسابقهای در آن پیادهسازی شده است.
7- DirectPlay
این کامپوننت امکان بازی چند نفر را در بازیهای چندنفره فراهم میآورد، دسترسی به سرویسهای ارتباطی را آسان میسازد و راهی را برای بازیها فراهم میکند تا مستقل از پروتکل یا نوع سرویس آنلاین با یکدیگر در ارتباط باشند. همچنین از پروتکلهای ارتباطی مطمئن پشتیبانیمیکند تا مانع از گم شدن دادههای مهم بازی روی شبکه شود. در واقع DirectPlay به صورت لایهای است که روی پروتکلهای معمول شبکه مانند IPX ،TCP/IP و ... قرار دارد.
در واقع یک session یا جلسه در DirectPlay یک کانال ارتباطی بین چندین کامپیوتر است. یک برنامه کاربردی پیش از آنکه بتواند با سیستمهای دیگر ارتباط برقرار کند، باید در یک Session یا جلسه باشد. هر جلسه تنها یک میزبان دارد و آن برنامه کاربردیای است که آن جلسه را ایجاد کردهاست. تنها میزبان میتواند ویژگیهای یک Session را تغییر دهد.
DirectX 9.0
این کامپوننت، آخرین نسخه DirectX تا پیش از عرضه رسمی ویندوز ویستا است. مهمترین چیزی که همراه DirectX 9.0 عرضه شد، High-Level Shader Language) HLSL) است. زبان HLSL جایگزین زبان اسمبلی برای نوشتن pixel shaderها و vertex shaderها در DirectX است. پیش از ارائه DirectX 9.0 توسعهدهندگان بازی بایدshaderها را با استفاده از یک زبان اسمبلی سطح پایین توسعه میدادند. HLSL با فراهمآوردن یک محیط برنامهنویسی توسعهدهنده ساده، توسعه همه بخشهای نرمافزار مانند انیمیشن و برنامهنویسی افکتها را آسان میکند.
HLSL با همه پردازشگرهای گرافیکی (GPU) سازگار با DirectX کار میکند و به توسعهدهندگان امکان میدهد افکتهای بصری را روی گستره وسیعتری از پلتفرمها ایجاد کنند؛ بدون اینکه نیاز داشته باشند به جزئیات سختافزار گرافیکی توجه کنند.
DirectX 9.0 روی ویندوز 95 نصب نمیشود. چون بازیهایی که به DirectX 9.0 نیاز دارند، به کامپیوترهای جدیدتر و قویتری هم نیاز دارند که ویندوز 98 یا نسخههای جدیدتر روی آنها نصب میشود. تاکنون نسخههای a ،b و c از DirectX 9.0 ارائه شده است. هر نسخه جدیدتر از DirectX دارای امنیت، کارایی و سیستم رفع خطای بهتری است.
DirectX 10
دوستداران بازی باید خوشحال باشند از اینکه بدانند شرکت مایکروسافت DirectX را نیز تولید کرده است و همراه پیش توزیع Direct3D 10 عرضه خواهد شد. همچنین نرمافزارMicrosoft Windows Game Explorer نیز عرضه شده که به برنامهنویسان و توسعهدهندگان امکان میدهد امکانات بروزکردن خودکار (auto-updating) را به بازیهایشان بیفزایند. مایکروسافت میخواهد DirectX 9.0 و DirectX 10 را روی ویندوز ویستا عرضه کند. به گفته Rodolph Balaz از برنامهنویسان توسعهدهنده Direct3D و OpenGL در مایکروسافت، DirectX 10 تنها با سیستمعاملهای جدید کار خواهد کرد و در حال حاضر مایکروسافت، برنامهای برای پشتیبانی ویندوز اکسپی از آن ندارد.
تا زمان نوشته شدن این مقاله هنوز نسخه رسمی ویندوز ویستا عرضه نشده است. ولی به نظر میآید این ویندوز، هم از DirectX 10 و هم از DirectX 9.0 پشتیبانی خواهد کرد.
SGL OpenGL
شرکت سیلیکون گرافیکس(SGI ،OpenGL) را با هدف ساخت یک API برای توسعه برنامههای گرافیکی دوبعدی و سه بعدی عرضهکردهاست. پیش از ساخته شدن APIهای گرافیکی مانند OpenGL و DirectX، بسیاری از تولیدکنندگان سختافزار، کتابخانههای گرافیکی مختلف و متفاوتی داشتند. به همین دلیل پشتیبانی از نسخههای مختلف نرمافزارهایشان روی پلتفرمهای سختافزاری مختلف هزینهبر و انتقال یک برنامه کاربردی از یک پلتفرم سختافزاری به پلتفرم سختافزاری دیگر بسیار وقتگیر و سخت بود.
بنابراین SGI نمونه برنامهای را تولید کرد که تولیدکنندگان سختافزار باید از آن برای توسعه درایورهای OpenGL در سختافزارهایشان استفاده کنند. این برنامه به صورت اپنسورس ارائه شدهاست. ولی سازندگان این سختافزارها میتوانند قابلیتهای گوناگونی را برپایه OpenGL در سختافزارهایشان ایجاد کنند. تصمیمگیری درباره ایجاد تغییرات در OpenGL را کنسرسیوم ARB اتخاذ میکند.
این کنسرسیوم شامل اعضای مهمی همچون اپل، اینتل، آیبیام، سان، ATI، دل، nVIDIA، سیلیکونگرافیکس و3Dlabs است و از سوی شرکتهای معتبر دیگری مانند متراکس، S3 ،Xi و Quantum 3D حمایت میشود. توسعهدهندگان نرمافزار برای استفاده از OpenGL در نرمافزارهایشان نیازی به اخذ مجوز ندارند. ولی تولیدکنندگان سختافزار برای پیادهسازی سختافزاری OpenGL نیازمند اخذ مجوز از SGI هستند.
OpenGL چیست؟
در اوایل پیدایش OpenGL، از این API در کارهای صنعتی، طراحی وسایل داخلی، مکانیکی و نیز در آنالیزهای علمی و آماری استفاده میشد.
در سال 1996، نویسندگان و توسعهدهندگان بازیهای کامپیوتری از نسخه ویندوزی OpenGL برای ساخت بازیهای کامپیوتری استفاده کردند. OpenGL برای پشتیبانی از گستره وسیعی از تکنیکهای رندرکردن گرافیکی پیشرفته طراحی شده است که میتوان پارهای از آنها را به اینصورت نام برد:
نورپردازی: قابلیت تحلیل میزان رنگ هنگام تابش مدلهای متفاوت نور به یک سطح از یک یا چند منبع نور مختلف.
سایهسازی نرم: قابلیت تحلیل افکتهای سایه هنگام تابش نور به یک زاویه و ایجاد اختلاف نور خفیف در مقابل آن سطح (مانند نور کمی که هنگام تابش آفتاب به یک صخره یخی در اطراف آن ایجاد میشود).
حرکت محو ومدلسازی: توانایی تغییر مکان و اندازه پرسپکتیو یک شی در فضای سه بعدی.
مجموعه امکانات OpenGL شبیه Direct3D است. ولی API سطح پایینتر آن (نزدیکتر به سطح سختافزار) باعث میشود کنترل خوبی روی عناصر اصلی ایجاد صحنههای سه بعدی مانند اطلاعات سهضلعیها که سلولهای تشکیلدهنده یک مدل سه بعدی هستند داشته باشد.
دو سطح پشتیبانی از شتابدهندگی سختافزاری برای OpenGL وجود دارد: installing client driver) ICDs) که به نوردهی ایجاد تغییر و رسترکردن (تبدیل یک فریم سه بعدی چند ضلعی ذخیره شده درframe buffer به یک تصویر کامل با بافتها و نشانههای عمق و نور) شتاب میدهد و mini client server) MCs) که از رسترکردن پشتیبانی میکند.
OpenGL 1.4 و OpenGL 1.5 بهترتیب در تابستان 2002 و 2003 معرفی شدند که هر یک امکانات و کاربردهای بیشتری از نسخههای پیش از خود داشتند. بزرگترین آنها OpenGL Shading Language بود؛ زبانی ویژه برنامهنویسی vertex-shader و pixel-shader که در صورت نیاز به OpenGL الصاق میشد. OpenGLShading Language زبانی شد که به سرعت در سطح گستردهای مورد پشتیبانی یونیکس، ویندوز، لینوکس و دیگر سیستمعاملها برای توسعهدهنده گرافیکهای تعاملی و برنامههای کاربردی ترسیمی قرار گرفت.
OpenGL 2.0
OpenGL 2.0 آخرین نسخه عرضه شده تا اوایل سال 2006 میلادی است. OpenGL Shader Language همراه با این نسخه عرضه شده و بر پایه استاندارد ANSYC طراحی شده است. برخی قابلیتهای تازه این نسخه عبارتند از:
- سایهزنی قابل برنامهریزی بهوسیله OpenGL Shader Language و APIهای آن. قدرت ایجاد Shader و برنامهنویسی اشیا، بخش دیگری از تغییرات ایجاد شده در این نسخه است.
- رندر چندگانه که به shaderهای قابل برنامهنویسی امکان میدهد در بافرهای خروجی چندگانه در یک گذر مقادیر مختلفی بنویسند.
- بافتهای دو طرفه، با قابلیت تعریف کاربرد آن بافت برای سطح جلو و پشت یک مدل اولیه که کیفیت حجم سایه و کارایی الگویمهای رندر هندسی اشیای سخت را ارتقا میدهد.
- Spriteهای نقطه که مختصات بافت یک نقطه را با مختصات بافت قرار داده شده در مقابل آن نقطه جابهجا میکنند و رسم نقاط را در بافتهای طراحی شده در کامپیوترهای معمولی نیز ممکن میسازند.
- بافتهای Non-power-of-two که برای همه انواع بافت کاربرد دارد که در نتیجه از بافتهای چهارگوش پشتیبانی مینماید و درعمل حافظه کمتری اشغال میکند.
OpenAL
OpenAL، یک API دیگر است که برای ایجاد و مدیریت صداهای سه بعدی در بازیهای کامپیوتری و دیگر انواع نرمافزارها به صورت یک پروژه مشترک میان شرکت Loki Software و Creative ساخته شده است.
کتابخانه این API مجموعهای از صداهای قابل حرکت در فضای سهبعدی را مدلسازی میکند. عناصر اصلی OpenAL شامل یک شنونده، یک منبع و یک بافر است. ممکن است تعداد زیادی بافر وجودداشته باشد که شامل دادههای صوتی هستند. هر بافر میتواند به یک یا چند منبع ضمیمه شود. همیشه یک عنصر شنونده (برای محتوای صوتی) وجود دارد که موقعیت مکانی منبع صوتی که صدای آن شنیده میشود را نشان میدهد. OpenAL در موتورهای گرافیکی Epic Games Unreal نیز برای ساخت افکتهای صوتی به کار میرود.
OpenGL Performer
OpenGL Performer، رابط برنامهنویسی قدرتمند و کاملی است که توسعهدهندگان برای شبیهسازی بصری از آن استفاده میکنند. ابزارهای موجود در آن، توسعه برنامههای شبیهسازی بصری، طراحی بر اساس شبیهسازی، واقعیت مجازی، نرمافزارهای علمی، سرگرمیهای تعاملی، برنامههای ویدیویی و طراحی با کامپیوتر را آسان میکند. این رابط برنامهنویسی به برنامهنویسان امکان میدهد از قابلیتهای سیستم به صورت بهینه استفاده کنند. آخرین نسخه این نرمافزار OpenGL Performer 3.2 است.
OpenGL Volumizer
OpenGL Volumizer، یک API گرافیکی است که در بخشهای انرژی، تولید، داروسازی و تجارت کاربرد دارد. این API برای انجام کارهای تعاملی با کیفیت بالا و بصری نمودن و شبیهسازی یک محیط با استفاده از مجموعه بزرگی از دادههای حجمی (دادههایی که مختصات یک شی در فضای سه بعدی را نشان میدهند) طراحی شده است. برای نمونه در نرمافزارهای پزشکی برای شبیهسازی وضعیت بخش خاصی از بدن، از این نرمافزار استفاده میشود. OpenGL Volumizer آخرین نسخه این API تا اوایل سال 2006 میلادی است که بر پایه کتابخانه گرافیکی استانداردOpenGL ساخته شده و شامل رابط کلاس ++C و قابلاستفاده در سیستمعاملهای ویندوز و لینوکس 32بیتی و 64بیتی است.
OpenGL Multipipe SDK
OpenGL Multipipe SDK یک لایه API است که مدیریت برنامههای گرافیکی را در زیر سیستمها و ساختارهای گرافیکی چندگانه آسان میکند. برنامههای کاربردی نوشته شده برپایه این API به نرمی و روانی، هم روی سیستمهای رومیزی تک پردازندهای و هم روی سیستمهای چند پردازندهای با سیستمهای گرافیکی قدرتمند اجرا میشوند.
نتیجهگیری
همانگونه که بیان شد ارتباط بین برنامهها و سختافزاری که آنرا اجرا میکند برعهده API است. سازندگان بزرگ نرمافزار و سختافزار API خاصی را برای برنامههای مالتیمدیا آماده کردهاند که مطرح ترین آنها DirectX و OpenGL هستند.
Qt is a cross-platform application framework. It includes
An intuitive class library
Integrated development tools
Support for C++ and Java development