Assembled Sprite°¡ ¹«¾ùÀ̳Ä. ¹ú½á ¾Ë°í ÀÖ¾ú´Ù¸é ÀÌ»óÇÑ °ÍÀÌ´Ù ³»°¡ Áö¾î³½
¸»À̴ϱî. ÀÌ°ÍÀÇ ¾ÆÀ̵ð¾î´Â Compiled SpriteÀÇ ¿ø¸®¸¦ ±Ù°£À¸·Î ÇÑ´Ù.
´Ü, Compiled Sprite´Â ½Ç½Ã°£¿¡ ÄÄÆÄÀÏµÈ µ¥ÀÌÅ͸¦ ¸¸µé ¼ö ÀÖ°í ±×°ÍÀ» ¾Æ¿¹ ¾î¼Àºí·¯ ¼öÁØ¿¡¼
¸µÅ©Çϱ⵵ ÇÑ´Ù. ({$L ..}¿É¼ÇÀÌ´ø°¡..) ÇÏÁö¸¸ ÀÌ°ÍÀº Àü󸮸¦ ÅëÇØ pascal inline assembly language Äڵ带 »ý¼ºÇÏ°í ±×°ÍÀ»
´Ù½Ã µ¨ÆÄÀÌ ÄÄÆÄÀÏ·¯°¡ ÄÄÆÄÀÏÇÏ¿© ½ºÇÁ¶óÀÌÆ®¸¦ ÀÚ½ÅÀÇ ½ÇÇà ÆÄÀÏ ¼ÓÀ¸·Î ¼û±ä´Ù.
¿¹Àü¿¡ MMX¸¦ ÀÌ¿ëÇÑ '¹«ºÐ±â ½ºÇÁ¶óÀÌÆ®'±â¹ýÀ» ¼Ò°³ÇÑ ÀûÀÌ
ÀÖ´Ù. ±×¶§´Â MMX ¸í·É¾î¿¡ ±âº»À¸·Î Æ÷ÇԵǾî ÀÖ´Â ¸¶½ºÅ· ¸í·ÉÀ» ½è´ø °ÍÀÌ´Ù. ±×·¡¼ ½ºÇÁ¶óÀÌÆ® Ãâ·Â¿¡ Çʼö Äڵ忴´ø if ¹®À» »¬ ¼ö ÀÖ¾ú´Ù.
±×·¸´Ù¸é À̹øÀÇ Assembled Sprite´Â ¹«¾ùÀΰ¡? ÀÌ°ÍÀº if ¹® »Ó¸¸ ¾Æ´Ï¶ó sprite Ãâ·Â
·çƾÀ̶ó¸é ÇʼöÀûÀ¸·Î °¡Áö°í ÀÖ´ø for ·çÇÁ 2°³¸¦ ¸ðµÎ »ý·«ÇÑ °ÍÀÌ´Ù.
ÀÚ ±×·³ ¿ø¸®ºÎÅÍ ¼³¸íÇϱâ À§ÇÑ ±âº» Á¶°ÇÀ» º¸ÀÚ¸é,
1. µ¨ÆÄÀÌ´Â ÀζóÀÎ ¾î¼Àºí¸®¾î¸¦ Áö¿øÇÑ´Ù. 2. µ¨ÆÄÀÌ´Â ÇÔ¼öÇü ŸÀÔÀ» ¼±¾ð ÇÒ ¼ö ÀÖ´Ù. 3. µ¨ÆÄÀÌ´Â fastcallÀ» Áö¿øÇÑ´Ù.
÷ºÎÆÄÀÏ
(28K) (Delphi 5¿¡¼ ÀÛ¼ºµÇ¾úÀ½)
1.
¿ø¸®
- °íÀüÀûÀÎ ½ºÇÁ¶óÀÌÆ® Ãâ·Â ·çƾÀº ÀÌ·¸´Ù.
-
- for y = 0 to sprite.height -
1
- for x = 0 to sprite.width - 1
- if sprite.data[x][y]
<> color_key
-
frame_buffer[x_offset + x][y_offset + y] = sprite.data[x,y]
- end if
- end for
- end for
-
- ÀÌ ·çƾÀ» º¸¸é Å©°Ô Á¡ÇÁ¹®ÀÌ 3±ºµ¥ ÀÖ´Ù. for ·çÇÁ º¹±Í¸¦ À§ÇÑ 2°³¿Í if ¹®À» À§ÇÑ 1°³ÀÌ´Ù. ƯÈ÷
if¹®Àº for ·çÇÁ 2°³ »çÀÌ¿¡ Ç×»ó È£ÃâµÇ´Â °ÍÀ̹ǷΠÆÛÆ÷¸Õ½º ÀúÇϸ¦ °¡Á®¿À´Â ÁÖµÈ ¿øÀÎÀÌ µÈ´Ù. ±×·¡¼ ³ª¿Â °ÍÀÌ ÈçÈ÷ '0¹ø ¾ÐÃà'À̶ó°í
ºÒ¸®´Â ¦Åü RLEÀÌ´Ù. ÀÌ°ÍÀº if ¹®Àº Á¦°ÅÇÒ ¼ö ÀÖÁö¸¸ Àû¾îµµ 2°³ÀÇ for ¹®(ÆÐÅÏ¿¡ ij¸®Áö ¸®ÅÏ Á¤º¸¸¦ ³ÖÀ¸¸é 1°³·Î °¡´É)ÀÌ
ÇÊ¿äÇÏ´Ù.
-
- ±×·³ ÀÌÁ¦ ¸»ÇÏ°íÀÚ ÇÏ´Â Assembled Sprite¸¦ º¸ÀÚ. ÀÌ°ÍÀº ½ºÇÁ¶óÀÌÆ®ÀÇ raw data·ÎºÎÅÍ
Àü󸮸¦ ÅëÇØ inline assembly language¸¦ »ý¼ºÇÑ´Ù°í Çß´Ù. ±×¸®°í ±× ±¸Á¶´Â ´ÙÀ½°ú °°´Ù.
- ÀÌ°ÍÀº ½ºÇÁ¶óÀÌÆ® µ¥ÀÌÅÍÀ̱ä ÇÏÁö¸¸ µ¥ÀÌÅÍ ÀÚü°¡ ÇϳªÀÇ ÄÄÆÄÀÏ °¡´ÉÇÑ
inline assembly language ÀÌ´Ù.
-
- jmp @@START
- [sprite
header]
-
- @@START:
- [sprite data
copying]
- [transparent data
skipping]
- .......
- [sprite data
copying]
- [transparent data
skipping]
-
- ret
-
- @@DATA00001:
- [sprite
data]
- @@DATA00002:
- [sprite
data]
- .......
-
- º¸½Ã´Ù½ÃÇÇ ¸ÞÀÎ ·çƾ¿¡ Á¡ÇÁ¹®Àº ÀüÇô ¾ø´Ù. °è¼Ó Á¤ÇØÁø´ë·Î µ¥ÀÌÅ͸¦ º¹»çÇÏ°í ½ºÅµÇÑ ÈÄ ret¸¦ ¸¸³ª¼ ÇÔ¼ö¸¦ ³¡³»¸é
µÈ´Ù.
- ¶ÇÇÑ »ç¿ëÇÏ´Â »ç¶÷µµ ´ÜÁö ÇÔ¼öó·³ ºÎ¸£±â¸¸ ÇÏ¸é ¾Ë¾Æ¼ Ãâ·ÂÀÌ µÈ´Ù.
-
- µ¥ÀÌÅÍ°¡ ½ÇÇàÆÄÀÏ ¼Ó¿¡ ÇÔ¼öÀÇ ÇüÅ·Π¼û±â ¶§¹®¿¡ À¯ÃâµÇ±âµµ ¾î·Æ°í, Àüü foot-printµµ ÀÛ¾ÆÁø´Ù.
- ÷ºÎÆÄÀÏÀÇ »ùÇÃÀ» ±âÁØÀ¸·Î ÇßÀ» ¶§ , ÀϹÝÀûÀÎ ¸®¼Ò½º Çü½ÄÀ¸·Î´Â (22080+bmpÇì´õ)bytes °¡·®ÀÌ Áõ°¡Çϴµ¥ ¹ÝÇØ ÀÌ ¹æ½ÄÀ»
¾²¸é 18432bytes¸¸ ´Ã¾î ³µ´Ù. (Delphi 5¿¡¼ Å×½ºÆ®)
- ¹°·Ð ´ÜÁ¡µµ ÀÖ´Ù.
-
- 1. ½ºÇÁ¶óÀÌÆ® µ¥ÀÌÅÍ¿¡ Ãâ·Â ·çƾÀÌ »ðÀԵDZ⠶§¹®¿¡ Ư¼öÈ¿°ú¸¦ Áֱ⠾î·Æ´Ù.
(Ư¼öÈ¿°ú¸¦ ÁÖ·Á¸é ±×°ÍÀÌ °¡´ÉÇϵµ·Ï Àü󸮱⸦ »õ·Î
¸¸µé¾î¾ß ÇÑ´Ù.)
- 2. Ŭ¸®ÇÎÀÌ ¾î·Æ´Ù.
(Á÷Á¢ frame buffer¿¡ ¾²´Â °ÍÀº Ŭ¸®ÇÎÀÌ ºÒ°¡´ÉÇÏ°í Àû¾îµµ double bufferingÀÌ µÇ¾î¾ß
Ŭ¸®ÇÎ È¿°ú°¡ °¡´ÉÇÏ´Ù.)
- 3. ½ºÇÁ¶óÀÌÆ® Çü½ÄÀÌ ¾Æ´Ò¶§´Â µµ¸®¾î »çÀÌÁî°¡ Ä¿Áø´Ù.
- 4. ÇÑ ¼Ò½º´Â ÇϳªÀÇ color depth¿¡¸¸ À¯È¿ÇÏ´Ù.
2.
÷ºÎ ÆÄÀÏ ¼³¸í
- Uni1.pas
- Assembled Sprite¸¦ ½ÇÇèÇÒ ¼ö ÀÖ´Â 3°³ÀÇ ¹öÆ°ÀÌ ÀÖ´Â ¿¹Á¦ ÇÁ·Î±×·¥ÀÌ´Ù.
- ¿ÞÂÊ µÎ °³ÀÇ ¹öÆ°Àº °¢°¢ Assembled Sprite¿Í ÀÏ¹Ý ½ºÇÁ¶óÀÌÆ® Ãâ·Â ·çƾ¿¡ ´ëÇÑ ¼Óµµ ºñ±³´Ù.
- °¡Àå ¿À¸¥ÂÊÀÇ ¹öÆ°Àº 'test.bmp'¸¦ ÀÐ¾î¼ ±×°ÍÀº Assembled Sprite ÄÚµå·Î Ãâ·Â ÇØ ÁÖ´Â
¿¹Á¦´Ù.
- ¸ðµç ¿ë¹ýÀº ÀÌ ¾È¿¡ µé¾î°¡ ÀÖ´Ù. ¿¹Á¦´Â ºñ·Ï 15bits Ä÷¯¿¡¼ µ¿ÀÛÇÏÁö¸¸ ÃæºÐÈ÷ 8 bits index
mode³ª 32
bits true color mode¿¡¼µµ µ¿ÀÛÇϵµ·Ï ¼öÁ¤ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
-
- UFrameBuffer.pas
- TBitmapÀ» »ó¼Ó¹Þ¾Æ ¸¸µç °¡»ó frame buffer¸¦ ±¸ÇöÇϱâ À§ÇÑ Å¬·¡½º´Ù.
- ÀÌ frame buffer¸¦ ÅëÇØ ½ºÇÁ¶óÀÌÆ®¸¦ Ãâ·ÂÇÏ°í ÃÖÁ¾ÀûÀ¸·Î form¿¡ ³ªÅ¸³ª°Ô ÇÑ´Ù.
-
- UAsmSprite.pas
- Assembled Sprite¸¦ ¸¸µé±â À§ÇÑ Å¬·¡½º´Ù.
- ƯÁ¤ÇÑ bmp¿Í ±×¿¡ ´ëÇÑ color key¸¦ ÁöÁ¤Çϸé TStringListÀÇ ÇüÅ·ΠÄڵ带 »ý¼ºÇØ ³½´Ù.
- ÇöÀç´Â 15 bits Àü¿ëÀÌÁö¸¸ ¾à°£ÀÇ ¼öÁ¤À¸·Îµµ ÃæºÐÈ÷ ´Ù¸¥ ¸ðµå¿ëÀ» ¸¸µé ¼ö ÀÖÀ» °ÍÀÌ´Ù.
-
- USpriteData.pas
- Assembled Sprite¸¦ ÅëÇØ ¸¸µé¾îÁø ½ºÇÁ¶óÀÌÆ® µ¥ÀÌÅÍ°¡ ÀÖ´Â unit´Ù.
3.
÷ºÎ ³»¿ë ¼³¸í (UAsmSprite.pas)
ÀÌ unitÀº ÇϳªÀÇ Å¬·¡½º·Î ÀÌ·ç¾îÁ®
ÀÖ´Ù. ±â´ÉÀº TBitmapÀ¸·Î Assembled Sprite ½ºÆ®¸µÀ»
»ý¼ºÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù.
¾Æ·¡´Â ±× Ŭ·¡½ºÀÇ ¼±¾ðÀÌ´Ù.
========================================================================== TAssembledSprite
= class public constructor
Create(const
srcImage: TBitmap; const
Id: string; colorKey:
word); procedure
Free(); public spriteCode:
TStrings; end; ==========================================================================
»ý¼ºÀÚ¿¡´Â srcImage¶ó°í ÇÏ´Â
TBitmap Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ ¹Þ´Â´Ù. ÇöÀç´Â srcImageÀº
PixelFormatÀÌ pf15bit¸¸ Áö¿øµÈ´Ù. (ÇÏÁö¸¸ ÃæºÐÈ÷
È®Àå °¡´ÉÇÏ´Ù) ±×¸®°í Assembled SpriteÀÇ À̸§ÀÇ
Á¢¹Ì»ç¸¦ ºÙÀÏ ¼ö ÀÖ´Â Id¶ó´Â ½ºÆ®¸µÀ» ¹ÞÀ¸¸ç,
¸¶Áö¸· ÆĶó¹ÌÅÍ·Î Ä÷¯Å°¸¦ ¹Þ´Â´Ù. ¹°·Ð À̶§ÀÇ
Ä÷¯Å°µµ pf15bit ÇüÅ·ΠÁÖ¾î¾ß ÇÑ´Ù.
ÀÌ Å¬·¡½º´Â »ý¼º ½Ã »ý¼ºÀÚ¿¡
ÆĶó¹ÌÅ͸¦ ³Ñ±â±â¸¸ Çϸé Assembled Sprite·Î
±¸¼ºµÈ TStringListÇüÀÇ public ÇʵåÀÎ spriteCode¿¡
±× °á°ú°¡ µé¾î °¡°Ô µÈ´Ù.
±×·¸´Ù¸é À̹ø¿¡´Â Assembled
Sprite¸¦ ¸¸µå´Â ¿ø¸®¸¦ ¾Ë¾Æ º¸ÀÚ.
´ÙÀ½°ú °°Àº ½ºÇÁ¶óÀÌÆ® µ¥ÀÌÅÍ(1byte
´ÜÀ§)°¡ ÀÖÀ¸¸ç Ä÷¯Å°´Â $00 À̶ó°í Çϸé,
00 00 00 00
00 1A 35 36 85 00 00 00 15 7F 35 56
00 00 1E 3D 00 00 00
¾Æ¸¶µµ °íÀüÀûÀÎ Äڵ忡´Â ¾î¶²
Á¤ÇØÁø ½ºÇÁ¶óÀÌÆ® ó¸® ·çƾ¿¡¼ 00ÀÎ Ä÷¯Å°¸¦
ÆǺ°ÇÏ¿©, Ä÷¯Å°°¡ ¾Æ´Ò ¶§¸¸ ȸ鿡 Ãâ·ÂÇÏ·Á°íÇÒ
°ÍÀÌ´Ù. ÇÏÁö¸¸ Assembled Sprite¿¡¼´Â À§ÀÇ °ÍÀ»
´ÙÀ½°ú °°Àº assembly language ÄÚµå·Î ¸¸µé¾î
ÁØ´Ù.
========================================================================= mov
edi, 5 //
Ãâ·Â ¹öÆÛ 5 bytes À̵¿ lea
esi, @@DATA0001 //
@@DATA0001 ¹øÁö¸¦ esi·Î ÁöÁ¤ mov
ecx, 4 //
º¹»çÇÒ ¹ÙÀÌÆ® ¼ö ÁöÁ¤ rep
movsb //
º¹»ç
mov
edi, 3 lea
esi, @@DATA0002 mov
ecx, 4 rep
movsb
mov
edi, 2 lea
esi, @@DATA0003 mov
ecx, 2 rep
movsb
mov
edi, 3 ......
ret
// ÇÔ¼ö
³¡
@@DATA0001: db
$1A, $35, $36, $85 @@DATA0002: db
$15, $7F, $35, $56 @@DATA0003: db
$1E, $3D ==========================================================================
Ä÷¯Å°¸¦ Á¦¿ÜÇÑ µ¥ÀÌÅ͸¸ ÇÔ¼ö
³»¿¡ Æ÷ÇÔµÇ¸ç ½ºÅµµÇ´Â Ä÷¯Å°¿¡ ´ëÇÑ Á¤º¸´Â
assembly language·Î Ç¥ÇöµÈ´Ù. ¿©±â¼´Â ¾î¶°ÇÑ
Á¡ÇÁ¹®µµ ¾î¶°ÇÑ ºñ±³¹®µµ »ç¿ëµÇÁö ¾Ê°í ¿ÀÁ÷
Ãâ·ÂÀ» À§ÇØ ¹öÆÛ Æ÷ÀÎÅ͸¦ Áõ°¡½ÃÅ°´Â ¸í·É¸¸ÀÌ
Á¸ÀçÇÑ´Ù.
ÀÌ·¸°Ô ¸¸µé¾îÁø assembly language´Â
spriteCode¶ó´Â TStringList Çü ÀνºÅϽº ¾È¿¡
'ÇÔ¼öÀÇ ¼Ò½º ÄÚµå' ÇüÅ·ΠÁ¸ÀçÇÑ´Ù. µû¶ó¼ ÀÌ°ÍÀ»
º¹»çÇÑ ÈÄ ½ÇÁ¦ ÀÚ½ÅÀÇ ÆÄÀÏ¿¡ »ðÀÔÇÏ¿© ÄÄÆÄÀÏ
Çϱ⸸ ÇÏ¸é ¸ðµç °ÍÀÌ ³¡ÀÌ´Ù. (³»¿ëÀº ÷ºÎÇÑ
¿¹Á¦¸¦ Á÷Á¢ ½ÇÇà½ÃÄÑ º¸¸é ÀÌÇØ°¡ ½¬¿ï °ÍÀÌ´Ù.)
°¡Àå °£´ÜÇÑ »ç¿ë ÇüÅ´ ´ÙÀ½°ú
°°´Ù.
========================================================================== var bgImage:
TBitmap; spriteCode:
TAssembledSprite; begin bgImage
:= TBitmap.Create; bgImage.LoadFromFile('./test.bmp'); bgImage.PixelFormat
:= pf15Bit;
spriteCode
:= TAssembledSprite.Create(bgImage, 'Test',
$001F); Memo1.Lines.Assign(spriteCode.spriteCode); spriteCode.Free;
bgImage.Free; end; ==========================================================================
4.
÷ºÎ ³»¿ë ¼³¸í (UFrameBuffer.pas)
ÀÌ Å¬·¡½º´Â Assembled Sprite¸¦
À§Çؼ Ưº°È÷ ±¸ÇöÇÑ °¡»ó frame buffer Ŭ·¡½ºÀ̸ç
½ÇÁ¦·Î´Â TBitmapÀ» »ó¼Ó¹Þ¾Æ ÀÌ¿ëÇÏ°í ÀÖ´Ù.
¾Æ·¡´Â ±× Ŭ·¡½ºÀÇ ¼±¾ðÀÌ´Ù.
========================================================================== TSpriteProc
= procedure(const
pAddr: pointer; const
pitch: longint); register;
TFrameBuffer
= class(TBitmap) public constructor
Create(w, h: integer);
private m_pSurface:
pointer; m_pitch:
longint;
public procedure
DrawImage(x, y: integer; const
proc: TSpriteProc); overload; procedure
DrawImage(x, y: integer; const
bitmap: TBitmap; const
colorKey: word); overload; procedure
Flush(const
canvas: TCanvas; x, y: integer);
end; ==========================================================================
TSpriteProc ŸÀÔÀº Assembled
Sprite·Î ¸¸µé¾îÁø ÇÔ¼ö¿¡ ´ëÇÑ Å¸ÀÔÀÌ´Ù. ÇÔ¼öÀÌÁö¸¸
º¯¼öó·³ ¾µ ¼ö ÀÖ°Ô Çϱâ À§Çؼ ÀÌ·± ÇüÅ·Î
¼±¾ðÇß´Ù. ÀÚ¼¼ÇÑ ¿ë¹ýÀº ¾Æ·¡ÀÇ ³»¿ëÀ» ÂüÁ¶Çϸé
µÈ´Ù.
TFrameBuffer Ŭ·¡½ºÀÇ »ý¼ºÀÚ
Create()´Â frame bufferÀÇ Å©±â¸¦ Á¤ÀÇÇÑ´Ù. w¿Í
h´Â °¢°¢ ³Êºñ¿Í ³ôÀ̸¦ ³ªÅ¸³»¸ç color depth´Â
ÀÏ´Ü 16 bits·Î °íÁ¤µÇ¾î ÀÖ´Ù. (¿ª½Ã ¼öÁ¤ °¡´ÉÇÏ´Ù.)
public ¸Þ¼Òµå´Â µü 3°³°¡ ÀÖ´Ù.
±× Áß¿¡ ù ¹ø° DrawImage()´Â (x, y)ÀÇ À§Ä¡¸¦
Á»ó´Ü ÁÂÇ¥·Î ÇÏ¿© Assembled Sprite¸¦ Ãâ·ÂÇÏ°Ô
ÇØÁØ´Ù. ½ÇÁ¦ procÀº ÇÔ¼öÀÌÁö¸¸ ¿©±â¼´Â ÆĶó¹ÌÅÍó·³
»ç¿ëÇÏ¸é µÈ´Ù. µÎ ¹ø° Drawimage()´Â TBitmap
Ŭ·¡½ºÀÇ À̹ÌÁö µ¥ÀÌÅ͸¦ ¹Þ¾Æ¼ ¶È°°Àº Ãâ·ÂÀ»
ÇÑ´Ù. ÀÌ°ÍÀÌ Á¸ÀçÇÏ´Â ÀÌÀ¯´Â ´ÜÁö ¼Óµµ ºñ±³¸¦
À§ÇؼÀÌ´Ù. ±×¸®°í ¸¶Áö¸· ¸Þ¼Òµå´Â Flush()ÀÌ´Ù.
ÀÌ°ÍÀº ÁöÁ¤ÇÑ canvasÀÇ (x, y)ÀÇ À§Ä¡¸¦ Á»ó´Ü
ÁÂÇ¥·ÎÇÏ¿© frame bufferÀÇ ³»¿ëÀ» ȸ鿡 Ãâ·ÂÇÑ´Ù.
±¸Çö ÀÚü´Â ¾ÆÁÖ °£´ÜÇϹǷÎ
÷ºÎµÈ ¼Ò½º¸¦ ÅëÇؼ È®ÀÎÇϱ⠹ٶõ´Ù.
5.
÷ºÎ ³»¿ë ¼³¸í (USpriteData.pas)
Assembled Sprite¸¦ ÅëÇØ ¸¸µé¾îÁø
ÇÔ¼ö¸¦ µû·Î unitÀ¸·Î ¶¼¾ú´Ù. º¸½Ã´Ù½ÃÇÇ ÄÚµå
ÀÚüÀÇ ¶óÀμö°¡ ³»¿ë¿¡ ºñÇØ ±²ÀåÈ÷ Å©±â ¶§¹®¿¡
µû·Î ºÐ¸®ÇÑ °ÍÀÌ´Ù. ¶óÀÎ ¼ö´Â ¸¹Áö¸¸ ÀÌ µ¥ÀÌÅ͸¦
Á÷Á¢ bitmapÀ¸·Î ´Þ°í ´Ù´Ï´Â °Íº¸´Ù´Â ¹ÙÀ̳ʸ®ÀÇ
Å©±â°¡ ÀÛ¾ÆÁø´Ù.
|