<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Allegro 5 performance</title>
		<link>http://www.allegro.cc/forums/view/618223</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sat, 12 Sep 2020 00:51:51 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve been developing a game using Allegro 4, recently I tried switched to Allegro 5 due to some issues which I&#39;ll write about in a separate post. However, the performance is much, much worse. In Allegro 4 I was writing all graphics to a memory bitmap, then using AllegroGL to scale the backbuffer to the screen. In Allegro 5 I&#39;m using al_draw_scaled_bitmap to display the backbuffer. With memory bitmaps it&#39;s incredibly slow, but even with video bitmaps it&#39;s far too slow.</p><p>Comparison of profiling results (render1 = write sprites to backbuffer, render2 = scale backbuffer to screen)<br />(This is on a level where 2000 sprites are being displayed per frame)</p><p>Allegro 4:<br />Render1: 12ms, Render2: 10ms</p><p>Allegro 5, new bitmap flags = ALLEGRO_ALPHA_TEST<br />Render1: 30.9ms  Render2: 13.6ms</p><p>As above but also with ALLEGRO_NO_PRESERVE_TEXTURE<br />Render1: 71.4ms  Render2: 10.4ms</p><p>With ALLEGRO_OPENGL, but without ALLEGRO_NO_PRESERVE_TEXTURE<br />Render1: 95.9ms  Render2: 15.3ms</p><p>Turned off alpha channel (will be ok for most sprites):<br />Render1: 28.9ms  Render2: 15.1ms</p><p>Attached is a screenshot of the level. This level is much bigger than the standard one, but even on smaller levels the performance is terrible.</p><p>The tile sprites, which make up the majority of the sprites in this image, are 32x32.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Andrew Gillett)</author>
		<pubDate>Sat, 29 Aug 2020 14:54:04 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>This sounds symptomatic of memory bitmaps being used elsewhere (ie. as part of your pipeline - not with texture preservation). Allegro 5 isn&#39;t good at memory bitmap stuff <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /></p><p>So - are you using memory bitmaps <i>anywhere</i> in your Allegro 5 code when you say &quot;even with video bitmaps it&#39;s far too slow&quot;?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (dthompson)</author>
		<pubDate>Sat, 29 Aug 2020 16:09:51 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>There are only 2 calls to al_create_bitmap and 1 call to al_load_bitmap in the entire codebase, and al_set_new_bitmap_flags is called before each of them. If I call al_get_bitmap_flags before each draw, I get 0x410 (ALLEGRO_VIDEO_BITMAP | ALLEGRO_ALPHA_TEST) for most of them, but the display gets 0x400 (ALLEGRO_VIDEO_BITMAP).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Andrew Gillett)</author>
		<pubDate>Sat, 29 Aug 2020 23:29:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It&#39;s likely you&#39;re doing something wrong. Weird drawing code. Locking bitmaps (which forces copying to memory). Etc.</p><p>I get easily 100x performance with Allegro 5 with a similar tiled bitmap game on a tiny netbook.</p><p>Is this Linux, Windows, or Mac OS X?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Chris Katko)</author>
		<pubDate>Sun, 30 Aug 2020 01:55:05 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I believe you have likely done some testing but just in case this can help - if you are working with tilemaps and Allegro5 then a good solution to speed things up (considerably) would be to modify your tilemap drawing code to use vertex buffer objects (you can check a non-optimized version of this here <a href="https://github.com/mikiZX/Allegro5-2d-Platformer-Demo-using-VBOs-and-Tiled-tilemaps">https://github.com/mikiZX/Allegro5-2d-Platformer-Demo-using-VBOs-and-Tiled-tilemaps</a> ). <br />You could also optimize this (and likely your actual code) by segmenting your tilemap in smaller sections and only drawing the ones which are actually visible on the screen (sort of using many 32x32 tiles segments) - in case you are drawing all of them each frame and only part is visible.<br />As suggested, with Allegro5 there are drawing operations on video bitmaps that require locking of the bitmap before the operation is performed (like i.e. al_put_pixel) - if you use al_put_pixel multiple times without locking the bitmap this could slow things down a lot.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (MikiZX)</author>
		<pubDate>Sun, 30 Aug 2020 02:58:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I am on Windows. I am not calling al_lock_bitmap, and all put/get_pixel calls are commented out.</p><p>I have done some more tests, and found that even when nothing was being drawn, a single call to OutputDebugString (Microsoft&#39;s function for writing to Visual Studio&#39;s debug output) caused the enclosing profiling region to randomly vary between low numbers (eg 0.5ms, still not great for a single debug print but not out of the ordinary for that function) and very high numbers, sometimes over 10ms - see attached image.</p><p>Problem solved? I re-enabled the drawing code and commented out OutputDebugString, but performance was no better - still in the region of 40-80ms per frame. Both drawing the sprites to the backbuffer, and drawing the backbuffer to the screen, vary by up to a factor of 2, although the latter is more stable.</p><p>Does it matter that the backbuffer does not have power of 2 width/height?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Andrew Gillett)</author>
		<pubDate>Sun, 30 Aug 2020 05:09:39 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>For sure the Allegro wizards that follow this forum will be able to provide a definite answer but I&#39;ve searched Allegro&#39;s GitHub repository for &#39;power-of-two&#39; and &#39;pot&#39; and it says this (seems to be the case for both OpenGL and DirectX):<br />&quot;* Also, we do support old OpenGL drivers where textures must have<br /> * power-of-two dimensions. If a non-power-of-two bitmap is created in<br /> * such a case, we use a texture with the next larger POT dimensions,<br /> * and just keep some unused padding space to the right/bottom of the<br /> * pixel data.&quot;<br />So it appears this is handled by Allegro internally so should not be the issue here.<br />I would try profiling my code and pinpoint exact section of the code that runs slow? Likely there are better ways - but a noob like me - I would keep a global variable and store system time in it ever so often throughout your code and each time just before you store a new system time value in it check out the difference between actual time and the variable itself - if the value is large enough then print out a debug message.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (MikiZX)</author>
		<pubDate>Sun, 30 Aug 2020 17:22:26 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>In Allegro 5 you just don&#39;t use memory bitmaps, hardly ever.</p><p>The A5 way is drawing from a tile atlas, you have like 22 unique tiles on that screen at 32x32, that&#39;s 2x11=64x352 which would easily fit in an atlas that was 512x512 or better.</p><p><img src="http://www.allegro.cc/forums/smileys/cool.gif" alt="8-)" /></p><p>And of course OutputDebugString will slow your program down writing to the console like that. It&#39;s much faster to write to a file.</p><p><b>EDIT</b><br />Show game loop and rendering code.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sun, 30 Aug 2020 17:51:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/618223/1047133#target">Edgar Reynaldo</a> said:</div><div class="quote"><p> The A5 way is drawing from a tile atlas
</p></div></div><p>What&#39;s the difference between using a 512x512 atlas (together with sub-bitmaps, I assume) and using 22 different source bitmaps? Does it affect performance?.<br />Also, if I remember correctly, sub-bitmaps doesn&#39;t support tiling so, when you need tiling, you can&#39;t use them.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p> Show game loop and rendering code
</p></div></div><p>I second this, could be useful for doing a benchmark on different systems. I&#39;ve noticed that Allegro 5 performance drops when drawing lots of bitmaps but I always blamed it on having an old graphics card and using open source drivers. I&#39;ve never done any serious benchmark but I&#39;ve noticed CPU usage increasing considerably when drawing lots of bitmaps, which always seemed a bit off to me considering that Allegro 5 is supposed to do its drawing on the GPU but, as I said, I&#39;ve never done any serious testing and just considered using the low level primitives in cases when you need to draw lots of bitmaps.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kenmasters1976)</author>
		<pubDate>Tue, 01 Sep 2020 07:58:02 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/618223/1047144#target">kenmasters1976</a> said:</div><div class="quote"><p>What&#39;s the difference between using a 512x512 atlas (together with sub-bitmaps, I assume) and using 22 different source bitmaps? Does it affect performance?</p></div></div><p>

Using 22 separate bitmaps probably won&#39;t be an issue, but once you start getting into the hundreds, I&#39;d <i>imagine</i> you&#39;d start seeing a serious dip in performance (or increased memory usage). I&#39;m being quite unscientific here though; I&#39;m just aware that it&#39;s better to have fewer discrete textures.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>I&#39;ve never done any serious testing and just considered using the low level primitives in cases when you need to draw lots of bitmaps.</p></div></div><p>

Yes indeed - it&#39;ll be even faster if you&#39;re using <a href="https://liballeg.org/a5docs/trunk/primitives.html#al_create_vertex_buffer">vertex buffers</a>.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (dthompson)</author>
		<pubDate>Tue, 01 Sep 2020 15:52:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/618223/1047144#target">kenmasters1976</a> said:</div><div class="quote"><p>
What&#39;s the difference between using a 512x512 atlas (together with sub-bitmaps, I assume) and using 22 different source bitmaps? Does it affect performance?.
</p></div></div><p>
Yes! IIRC, drawing from different source bitmaps is the equivalent of several OpenGL texture changes. This will slow down drawing and should be avoided if possible (e.g. use an atlas with sub bitmaps, or even sort by source bitmap if possible). </p><p>So it&#39;s not about the number of source bitmaps but the number of switches between them. IIRC, this should be adressed before attempting to use vertex buffers.</p><p>The GPU is happiest if you setup &quot;state&quot; once and then only send geometry or alter matrices.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Polybios)</author>
		<pubDate>Wed, 02 Sep 2020 00:38:45 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/618223/1047144#target">kenmasters1976</a> said:</div><div class="quote"><p>
I&#39;ve never done any serious benchmark but I&#39;ve noticed CPU usage increasing considerably when drawing lots of bitmaps, which always seemed a bit off to me considering that Allegro 5 is supposed to do its drawing on the GPU 
</p></div></div><p>
I doubt this would be due to your graphics card (unless it is over maybe 15 years old). The likely reason the CPU usage would increase is due to &#39;feeding&#39; the GPU with the data it needs to draw - sort of &#39;bottlenecking&#39; the GPU-CPU data transfer on the CPU side as CPU will not be able to feed the data to the GPU at the rate at which the GPU can draw. This is I believe the main reason one would like to have the CPU send data only once to the GPU (using VBO) as opposed to sending the data many times (once per bitmap you wish to draw). From my experience (not very extensive, mind you) it is faster to give the CPU task of re-creating the VBO each frame and then drawing that than actually sending each bitmap individually. The atlas idea is used here as one VBO draw call will be bound to only one bitmap(or a single set of bitmaps if a special shader is used) - if you want to draw different bitmaps with VBO you will need to create one VBO per bitmap you will use (and this will again increase the amount of cpu-gpu talk). Thus packing all your bitmaps into a single one and having only one VBO draw call will/should be the fastest way.<br />Also, what is said above about the context changes is also a factor, one mediated again with using a single vbo.<br />As for tiling, this can be achieved with VBO though it would require adding additional geometry to simulate the tiling effect (as opposed to simply increasing the UV coordinates which I believe is what one would normally do - if I understand your question correctly).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (MikiZX)</author>
		<pubDate>Wed, 02 Sep 2020 02:03:04 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If you don&#39;t need tiling, atlas&#39;es and sub bitmaps are the way to go.</p><p>If you need tiling, you need either a <s>single texture</s> one texture per tile, or a shader.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Wed, 02 Sep 2020 04:08:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Well, that&#39;s some interesting info on VBOs which is not immediately obvious when using Allegro 5, in particular if you come from using Allegro 4 in the past. I always thought &#39;hardware accelerated&#39; meant the graphics card would take care of all the drawing with little to no load on the CPU; I also assumed that loading a bitmap as video bitmap meant it was loaded as a texture on video memory, from where the graphics card could access it and draw it with no load on the CPU either, even when using the traditional Allegro 4 way of drawing things, but apparently it is passing the coordinates/geometry to the GPU what can slow down the process? This requires a whole new way of thinking about the drawing process in Allegro 5.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kenmasters1976)</author>
		<pubDate>Wed, 02 Sep 2020 22:53:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>1. Can you just post the whole project so we can profile it?<br />2. What are your hardware specs?</p><p>I have no problems holding 60 FPS... on a netbook... with an i3 celeron and intel HD graphics while drawing multiple tile layers (floors, walls, &quot;decals&quot;, &quot;dirt&quot;, and lighting layers) in 1366x768.</p><p>I don&#39;t use VBOs or display lists or anything &quot;fancy&quot;.</p><p>It&#39;s even possible your measuring wrong. If you&#39;re running Windows, use one of those nVidia (or Windows [Windows Key + G] or whatever) FPS meters. Linux might have an equivalent.</p><p>Also, what&#39;s your video mode? You&#39;re not in some kind of creepy 24-bit mode? (somehow different than your images in memory, forcing a color conversion every frame.)</p><p>Letting other people compile and profile your project will eliminate many of these variables.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Chris Katko)</author>
		<pubDate>Thu, 03 Sep 2020 15:03:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve done some more profiling and I&#39;m getting better results than I had been getting before – so it&#39;s possible there was something else going on like a rogue logging call somewhere.</p><p>Here are some profiling results from a simplified test where it draws around 2000 32x32 sprites per frame. Render1 is drawing the sprites and Render2 is scaling the backbuffer to the screen. In this test, the screen resolution is 1680x1050 and the back buffer is 1888x1120 (although most levels will be considerably smaller than this).</p><p>Allegro 5<br />Render1: 10.0ms  Render2: 18.8ms  Frame: 28.8ms<br />Render1: 9.4ms  Render2: 20.9ms  Frame: 30.3ms<br />Render1: 10.0ms  Render2: 20.3ms  Frame: 30.3ms<br />Render1: 8.8ms  Render2: 23.8ms  Frame: 32.6ms<br />Render1: 8.6ms  Render2: 16.9ms  Frame: 25.5ms<br />Render1: 9.9ms  Render2: 18.9ms  Frame: 28.8ms<br />Render1: 9.7ms  Render2: 20.8ms  Frame: 30.6ms</p><p>Allegro 4 (Render2 uses allegro_gl_make_texture_ex and draws a quad, Render1 uses draw_rle_sprite)<br />Render1: 13.6ms  Render2: 8.9ms  Frame: 22.5ms<br />Render1: 13.6ms  Render2: 8.9ms  Frame: 22.5ms<br />Render1: 13.7ms  Render2: 8.9ms  Frame: 22.5ms<br />Render1: 13.7ms  Render2: 8.9ms  Frame: 22.5ms<br />Render1: 13.6ms  Render2: 8.9ms  Frame: 22.5ms<br />Render1: 13.6ms  Render2: 8.9ms  Frame: 22.5ms<br />Render1: 13.6ms  Render2: 8.9ms  Frame: 22.4ms<br />Render1: 13.6ms  Render2: 8.9ms  Frame: 22.5ms</p><p>In this case you can see that Allegro 5 is faster at drawing the small sprites but slower at scaling the back buffer to the screen as compared to the AllegroGL code I&#39;m using in the old version. I&#39;m going to look into the practicality of scaling the sprites directly to the screen rather than going through the additional render2 step.</p><p>The players in my game are drawn by creating a temporary bitmap, copying the relevant head and body parts to the bitmap, and then drawing that to the screen – with additional steps if lighting and/or transparency are needed. In the Allegro 4 version they are also modified in real time using get/put pixel (primarily replacing the default player colour with the desired player colour, but also sometimes for a shield effect which puts a white outline around the player). I know this kind of pixel replacement is a non-starter for Allegro 5. Even without any lighting or transparency effects, in my test the Allegro 5 version averages 8ms to draw 16 players (49 draw sprite calls), while the Allegro 4 version runs about 20% faster. Given that the pixel replacement stuff is not feasible for Allegro 5, I will have to generate and store the sprites at the start of the level, so that should help performance.</p><p>Both machines I&#39;ve tested on are around six or seven years old and have Intel on-board graphics. Timing uses QueryPerformanceCounter.</p><p>Something strange I noticed is that when I request a list of graphics modes in Allegro 5, all the modes are reported as having 23 bit colour depth. However, when I print the actual bitmap colour depths, they are all 32.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Andrew Gillett)</author>
		<pubDate>Thu, 03 Sep 2020 16:22:43 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Just to be absolutely sure: what frame rates are you getting? Could any of this be vsync-related? I notice that all of the &#39;Render2&#39; timings are over 16.6ms (some of them very close) which is close to the frame timing of a 60Hz display with vsync: 1000ms / 60Hz = 16.6ms.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (dthompson)</author>
		<pubDate>Thu, 03 Sep 2020 18:11:23 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>vsync is off. I just tested it on a much better PC and got these timings (window resolution was 1768x992):</p><p>Render1: 6.0ms  Render2: 3.9ms  Frame: 9.9ms<br />Render1: 6.0ms  Render2: 4.0ms  Frame: 10.0ms<br />Render1: 6.0ms  Render2: 4.0ms  Frame: 10.0ms<br />Render1: 6.0ms  Render2: 3.9ms  Frame: 9.9ms<br />Render1: 6.1ms  Render2: 4.0ms  Frame: 10.1ms<br />Render1: 6.0ms  Render2: 4.0ms  Frame: 10.0ms<br />Render1: 6.0ms  Render2: 4.2ms  Frame: 10.2ms<br />Render1: 6.2ms  Render2: 3.9ms  Frame: 10.2ms<br />Render1: 6.0ms  Render2: 3.9ms  Frame: 9.9ms
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Andrew Gillett)</author>
		<pubDate>Thu, 03 Sep 2020 19:11:40 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/618223/1047186#target">Andrew Gillett</a> said:</div><div class="quote"><p> I&#39;m going to look into the practicality of scaling the sprites directly to the screen rather than going through the additional render2 step
</p></div></div><p>In my recent Allegro 5 project I did set up an allegro transformation so that all drawing is automatically scaled to fit the screen/window size. It seems to work pretty good for 2D.</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/618223/1047189#target">Andrew Gillett</a> said:</div><div class="quote"><p> I just tested it on a much better PC and got these timings
</p></div></div><p>Is the Allegro 4 timing still better?.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kenmasters1976)</author>
		<pubDate>Thu, 03 Sep 2020 22:02:29 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Timings from a Paperspace cloud PC, which is faster than mine:</p><p>al5<br />Render1: 9.0ms  Render2: 4.9ms  Frame: 13.9ms<br />Render1: 9.8ms  Render2: 5.1ms  Frame: 14.9ms<br />Render1: 11.0ms  Render2: 5.5ms  Frame: 16.5ms<br />Render1: 10.9ms  Render2: 4.4ms  Frame: 15.3ms<br />Render1: 9.2ms  Render2: 4.3ms  Frame: 13.5ms<br />Render1: 8.7ms  Render2: 4.7ms  Frame: 13.4ms<br />Render1: 8.7ms  Render2: 4.4ms  Frame: 13.2ms<br />Render1: 9.8ms  Render2: 4.1ms  Frame: 13.9ms<br />Render1: 9.3ms  Render2: 4.0ms  Frame: 13.3ms<br />Render1: 9.1ms  Render2: 4.1ms  Frame: 13.2ms<br />Render1: 9.8ms  Render2: 4.6ms  Frame: 14.4ms<br />Render1: 9.8ms  Render2: 5.6ms  Frame: 15.4ms<br />Render1: 9.3ms  Render2: 4.0ms  Frame: 13.3ms</p><p>al4<br />Render1: 11.0ms  Render2: 2.6ms  Frame: 13.6ms<br />Render1: 11.0ms  Render2: 2.6ms  Frame: 13.6ms<br />Render1: 10.9ms  Render2: 2.6ms  Frame: 13.5ms<br />Render1: 10.8ms  Render2: 2.5ms  Frame: 13.4ms<br />Render1: 10.8ms  Render2: 2.5ms  Frame: 13.3ms<br />Render1: 10.8ms  Render2: 2.5ms  Frame: 13.2ms<br />Render1: 10.7ms  Render2: 2.4ms  Frame: 13.2ms<br />Render1: 10.6ms  Render2: 2.4ms  Frame: 13.1ms<br />Render1: 10.6ms  Render2: 2.4ms  Frame: 13.0ms<br />Render1: 10.5ms  Render2: 2.4ms  Frame: 13.0ms</p><p>EDIT: I originally wrote that the Al5 version varies a lot in terms of frame timings but I just realised that the Al4 version is showing smoothed out timings (as this text was originally written to the screen and is hard to read if the numbers are varying a lot every frame), whereas I changed this in the Al5 version.</p><p>I tried scaling sprites directly to the screen rather than using an intermediate backbuffer. These are the timings I got on my desktop - a little better than before but not much.</p><p>Render1: 8.6ms  Render2: 13.9ms  Frame: 22.6ms<br />Render1: 10.0ms  Render2: 18.2ms  Frame: 28.2ms<br />Render1: 8.4ms  Render2: 22.7ms  Frame: 31.1ms<br />Render1: 8.8ms  Render2: 15.6ms  Frame: 24.4ms<br />Render1: 11.2ms  Render2: 16.8ms  Frame: 28.1ms<br />Render1: 9.3ms  Render2: 20.6ms  Frame: 29.9ms<br />Render1: 8.6ms  Render2: 15.0ms  Frame: 23.6ms</p><p>The problem is that the scaling ratio is not a whole number, so in this level I end up with a 1 pixel gap every 2 or 3 tiles.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Andrew Gillett)</author>
		<pubDate>Fri, 04 Sep 2020 16:23:07 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Download my binaries and try ex_draw_bitmap after running RunA525Examples.bat from a command line.</p><p><a href="https://bitbucket.org/bugsquasher/unofficial-allegro-5-binaries/downloads/">https://bitbucket.org/bugsquasher/unofficial-allegro-5-binaries/downloads/</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sat, 05 Sep 2020 00:27:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I get 60fps +- 2, varies between around 1200 and 2500 / sec.</p><p>With 1024 sprites, 29fps +- 0, 140-230/sec.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Andrew Gillett)</author>
		<pubDate>Sat, 05 Sep 2020 04:17:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ok, second question. Are you running on an integrated GPU or a dedicated card. What are your CPU specs and GPU model(s). Have you updated your drivers since purchasing the card?</p><p><b>EDIT</b><br />Also, those numbers are pretty bad. Have you exceeded the maximum texture size and inadvertently produced a memory bitmap? How old is your gpu?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sat, 05 Sep 2020 05:06:11 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Intel Core i5-3570K with integrated GPU, latest drivers<br /><a href="https://ark.intel.com/content/www/us/en/ark/products/65520/intel-core-i5-3570k-processor-6m-cache-up-to-3-80-ghz.html">https://ark.intel.com/content/www/us/en/ark/products/65520/intel-core-i5-3570k-processor-6m-cache-up-to-3-80-ghz.html</a></p><p>As mentioned previously, I put in some code to confirm that none of the bitmaps being drawn to are memory bitmaps.</p><p>but...</p><p>I just tried ALLEGRO_NO_PRESERVE_TEXTURE, having tried it a while back, and now I get vastly better Render2 performance.</p><p>Render1: 8.5ms  Render2: 0.5ms  Frame: 9.0ms<br />Render1: 8.6ms  Render2: 0.6ms  Frame: 9.2ms<br />Render1: 9.3ms  Render2: 0.7ms  Frame: 9.9ms<br />Render1: 8.3ms  Render2: 0.7ms  Frame: 9.0ms<br />Render1: 8.6ms  Render2: 0.6ms  Frame: 9.3ms<br />Render1: 8.7ms  Render2: 0.6ms  Frame: 9.3ms<br />Render1: 8.5ms  Render2: 0.5ms  Frame: 9.1ms
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Andrew Gillett)</author>
		<pubDate>Sat, 05 Sep 2020 16:27:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Those numbers are much better. With the D3D driver, allegro automatically tries to back up textures, which is very slow at times. Try the OpenGL driver and see what your numbers are like.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sun, 06 Sep 2020 00:50:08 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>95% of all problems would be solved by posting the project file instead of just guessing into a black box.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Chris Katko)</author>
		<pubDate>Sun, 06 Sep 2020 13:37:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I have uploaded a project here:</p><p><a href="https://drive.google.com/file/d/106m6ZxFLGTzWhnULdlzYuJM172r8dgkp/view?usp=sharing">https://drive.google.com/file/d/106m6ZxFLGTzWhnULdlzYuJM172r8dgkp/view?usp=sharing</a></p><p>What I&#39;ve found is that for this test, performance is much worse in OpenGL, as compared to Direct3D with ALLEGRO_NO_PRESERVE_TEXTURE set on the backbuffer. The Render1 step which draws lots of small sprites takes about 24ms, compared with 8 for Direct3D.</p><p>If you want to try it, the key lines to look at are:</p><p>Psector.cpp 15, 441, 469, 499<br />Sprites.cpp 20-23, 76, 159
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Andrew Gillett)</author>
		<pubDate>Sun, 06 Sep 2020 17:40:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I installed visual studio 2019 and loaded your project and got this error</p><div class="source-code snippet"><div class="inner"><pre>C:\Users----\Downloads\psector.ultrasimplifiedprofiling\psector.vcxproj <span class="k2">:</span> error  <span class="k2">:</span> Error HRESULT E_FAIL has been returned from a call to a COM component.
</pre></div></div><p>

sigh... why does this stuff never work the first time. <img src="http://www.allegro.cc/forums/smileys/rolleyes.gif" alt="::)" /></p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
  &lt;/entry&gt;<br />  &lt;entry&gt;<br />    &lt;record&gt;402&lt;/record&gt;<br />    &lt;time&gt;2020/09/08 11:35:07.956&lt;/time&gt;<br />    &lt;type&gt;Information&lt;/type&gt;<br />    &lt;source&gt;VisualStudio&lt;/source&gt;<br />    &lt;description&gt;Begin package load [Visual C++ Package]&lt;/description&gt;<br />    &lt;guid&gt;{1B027A40-8F43-11D0-8D11-00A0C91BC942}&lt;/guid&gt;<br />  &lt;/entry&gt;<br />  &lt;entry&gt;<br />    &lt;record&gt;403&lt;/record&gt;<br />    &lt;time&gt;2020/09/08 11:35:07.957&lt;/time&gt;<br />    &lt;type&gt;Error&lt;/type&gt;<br />    &lt;source&gt;VisualStudio&lt;/source&gt;<br />    &lt;description&gt;LegacySitePackage failed for package [Visual C++ Package]Source: &amp;apos;mscorlib&amp;apos; Description: ValueFactory attempted to access the Value property of this instance.&amp;#x000D;&amp;#x000A;System.InvalidOperationException: ValueFactory attempted to access the Value property of this instance.&amp;#x000D;&amp;#x000A;   at System.Lazy`1.CreateValue()&amp;#x000D;&amp;#x000A;--- End of stack trace from previous location where exception was thrown ---&amp;#x000D;&amp;#x000A;   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()&amp;#x000D;&amp;#x000A;   at System.Lazy`1.get_Value()&amp;#x000D;&amp;#x000A;   at Microsoft.VisualStudio.VC.CppSvc.get_IVCPreferences()&amp;#x000D;&amp;#x000A;   at Microsoft.VisualStudio.VC.ManagedInterop.Initialize(IServiceProvider serviceProvider)&lt;/description&gt;<br />    &lt;guid&gt;{1B027A40-8F43-11D0-8D11-00A0C91BC942}&lt;/guid&gt;<br />    &lt;hr&gt;80131509&lt;/hr&gt;<br />    &lt;errorinfo&gt;&lt;/errorinfo&gt;<br />  &lt;/entry&gt;<br />  &lt;entry&gt;<br />    &lt;record&gt;404&lt;/record&gt;<br />    &lt;time&gt;2020/09/08 11:35:07.959&lt;/time&gt;<br />    &lt;type&gt;Error&lt;/type&gt;<br />    &lt;source&gt;VisualStudio&lt;/source&gt;<br />    &lt;description&gt;SetSite failed for package [Visual C++ Package](null)&lt;/description&gt;<br />    &lt;guid&gt;{1B027A40-8F43-11D0-8D11-00A0C91BC942}&lt;/guid&gt;<br />    &lt;hr&gt;80131509&lt;/hr&gt;<br />    &lt;errorinfo&gt;&lt;/errorinfo&gt;<br />  &lt;/entry&gt;<br />  &lt;entry&gt;<br />    &lt;record&gt;405&lt;/record&gt;<br />    &lt;time&gt;2020/09/08 11:35:07.961&lt;/time&gt;<br />    &lt;type&gt;Error&lt;/type&gt;<br />    &lt;source&gt;VisualStudio&lt;/source&gt;<br />    &lt;description&gt;End package load [Visual C++ Package]&lt;/description&gt;<br />    &lt;guid&gt;{1B027A40-8F43-11D0-8D11-00A0C91BC942}&lt;/guid&gt;<br />    &lt;hr&gt;80131509&lt;/hr&gt;<br />    &lt;errorinfo&gt;&lt;/errorinfo&gt;<br />  &lt;/entry&gt;<br />  &lt;entry&gt;<br />    &lt;record&gt;406&lt;/record&gt;<br />    &lt;time&gt;2020/09/08 11:35:07.964&lt;/time&gt;<br />    &lt;type&gt;Information&lt;/type&gt;<br />    &lt;source&gt;VisualStudio&lt;/source&gt;<br />    &lt;description&gt;Begin package load [Visual C++ Package]&lt;/description&gt;<br />    &lt;guid&gt;{1B027A40-8F43-11D0-8D11-00A0C91BC942}&lt;/guid&gt;<br />  &lt;/entry&gt;<br />  &lt;entry&gt;<br />    &lt;record&gt;407&lt;/record&gt;<br />    &lt;time&gt;2020/09/08 11:35:07.964&lt;/time&gt;<br />    &lt;type&gt;Error&lt;/type&gt;<br />    &lt;source&gt;VisualStudio&lt;/source&gt;<br />    &lt;description&gt;LegacySitePackage failed for package [Visual C++ Package]Source: &amp;apos;mscorlib&amp;apos; Description: ValueFactory attempted to access the Value property of this instance.&amp;#x000D;&amp;#x000A;System.InvalidOperationException: ValueFactory attempted to access the Value property of this instance.&amp;#x000D;&amp;#x000A;   at System.Lazy`1.CreateValue()&amp;#x000D;&amp;#x000A;--- End of stack trace from previous location where exception was thrown ---&amp;#x000D;&amp;#x000A;   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()&amp;#x000D;&amp;#x000A;   at System.Lazy`1.get_Value()&amp;#x000D;&amp;#x000A;   at Microsoft.VisualStudio.VC.CppSvc.get_IVCPreferences()&amp;#x000D;&amp;#x000A;   at Microsoft.VisualStudio.VC.ManagedInterop.Initialize(IServiceProvider serviceProvider)&lt;/description&gt;<br />    &lt;guid&gt;{1B027A40-8F43-11D0-8D11-00A0C91BC942}&lt;/guid&gt;<br />    &lt;hr&gt;80131509&lt;/hr&gt;<br />    &lt;errorinfo&gt;&lt;/errorinfo&gt;<br />  &lt;/entry&gt;<br />&lt;/activity&gt;
</p></div></div><p>
... C++ didn&#39;t install right maybe? <img src="http://www.allegro.cc/forums/smileys/huh.gif" alt="???" /> I have no idea why I&#39;m a magnet for such obscure errors.</p><p>[edit] hmmm........ maybe a combination of visual studio &quot;wanting to restart to finish&quot; + windows feature update applying on restart clobbered a dependency. I bet that&#39;s it.</p><p>GG Microsoft.</p><p>[edit] it compiles now.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Chris Katko)</author>
		<pubDate>Tue, 08 Sep 2020 16:39:52 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Which version of MSVC 2019 are you on?</p><p>Here they suggest updating and deleting the .vs folder<br /><a href="https://developercommunity.visualstudio.com/content/problem/526997/vs2019-update-to-1601-broke-something.html">https://developercommunity.visualstudio.com/content/problem/526997/vs2019-update-to-1601-broke-something.html</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Andrew Gillett)</author>
		<pubDate>Tue, 08 Sep 2020 16:56:07 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>[edit] nvm it&#39;s a user pragma</p><p>Well this looks wrong. I sure as heck don&#39;t have a &quot;23bit&quot; or &quot;13bit&quot; color screen.</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">   1</span>The thread <span class="n">0x3dec</span> has exited with code <span class="n">0</span> <span class="k2">(</span><span class="n">0x0</span><span class="k2">)</span>.
<span class="number">   2</span><span class="n">0</span><span class="k2">:</span> <span class="n">640x480</span>, <span class="n">23b</span>it, <span class="n">60</span>Hz
<span class="number">   3</span><span class="n">0</span><span class="k2">:</span> <span class="n">640x480</span>, <span class="n">23b</span>it, <span class="n">72</span>Hz
<span class="number">   4</span><span class="n">0</span><span class="k2">:</span> <span class="n">640x480</span>, <span class="n">23b</span>it, <span class="n">75</span>Hz
<span class="number">   5</span><span class="n">0</span><span class="k2">:</span> <span class="n">720x480</span>, <span class="n">23b</span>it, <span class="n">60</span>Hz
<span class="number">   6</span><span class="n">0</span><span class="k2">:</span> <span class="n">720x480</span>, <span class="n">23b</span>it, <span class="n">59</span>Hz
<span class="number">   7</span><span class="n">0</span><span class="k2">:</span> <span class="n">720x576</span>, <span class="n">23b</span>it, <span class="n">50</span>Hz
<span class="number">   8</span><span class="n">0</span><span class="k2">:</span> <span class="n">800x600</span>, <span class="n">23b</span>it, <span class="n">60</span>Hz
<span class="number">   9</span><span class="n">0</span><span class="k2">:</span> <span class="n">800x600</span>, <span class="n">23b</span>it, <span class="n">72</span>Hz
<span class="number">  10</span><span class="n">0</span><span class="k2">:</span> <span class="n">800x600</span>, <span class="n">23b</span>it, <span class="n">75</span>Hz
<span class="number">  11</span><span class="n">0</span><span class="k2">:</span> <span class="n">1024x768</span>, <span class="n">23b</span>it, <span class="n">60</span>Hz
<span class="number">  12</span><span class="n">0</span><span class="k2">:</span> <span class="n">1024x768</span>, <span class="n">23b</span>it, <span class="n">70</span>Hz
<span class="number">  13</span><span class="n">0</span><span class="k2">:</span> <span class="n">1024x768</span>, <span class="n">23b</span>it, <span class="n">75</span>Hz
<span class="number">  14</span><span class="n">0</span><span class="k2">:</span> <span class="n">1152x864</span>, <span class="n">23b</span>it, <span class="n">75</span>Hz
<span class="number">  15</span><span class="n">0</span><span class="k2">:</span> <span class="n">1176x664</span>, <span class="n">23b</span>it, <span class="n">50</span>Hz
<span class="number">  16</span><span class="n">0</span><span class="k2">:</span> <span class="n">1176x664</span>, <span class="n">23b</span>it, <span class="n">60</span>Hz
<span class="number">  17</span><span class="n">0</span><span class="k2">:</span> <span class="n">1176x664</span>, <span class="n">23b</span>it, <span class="n">59</span>Hz
<span class="number">  18</span><span class="n">0</span><span class="k2">:</span> <span class="n">1280x720</span>, <span class="n">23b</span>it, <span class="n">60</span>Hz
<span class="number">  19</span><span class="n">0</span><span class="k2">:</span> <span class="n">1280x720</span>, <span class="n">23b</span>it, <span class="n">59</span>Hz
<span class="number">  20</span><span class="n">0</span><span class="k2">:</span> <span class="n">1280x720</span>, <span class="n">23b</span>it, <span class="n">50</span>Hz
<span class="number">  21</span><span class="n">0</span><span class="k2">:</span> <span class="n">1280x768</span>, <span class="n">23b</span>it, <span class="n">60</span>Hz
<span class="number">  22</span><span class="n">0</span><span class="k2">:</span> <span class="n">1280x800</span>, <span class="n">23b</span>it, <span class="n">60</span>Hz
<span class="number">  23</span><span class="n">0</span><span class="k2">:</span> <span class="n">1280x960</span>, <span class="n">23b</span>it, <span class="n">60</span>Hz
<span class="number">  24</span><span class="n">0</span><span class="k2">:</span> <span class="n">1280x960</span>, <span class="n">23b</span>it, <span class="n">75</span>Hz
<span class="number">  25</span><span class="n">0</span><span class="k2">:</span> <span class="n">1280x1024</span>, <span class="n">23b</span>it, <span class="n">60</span>Hz
<span class="number">  26</span><span class="n">0</span><span class="k2">:</span> <span class="n">1280x1024</span>, <span class="n">23b</span>it, <span class="n">75</span>Hz
<span class="number">  27</span><span class="n">0</span><span class="k2">:</span> <span class="n">1360x768</span>, <span class="n">23b</span>it, <span class="n">60</span>Hz
<span class="number">  28</span><span class="n">0</span><span class="k2">:</span> <span class="n">1366x768</span>, <span class="n">23b</span>it, <span class="n">60</span>Hz
<span class="number">  29</span><span class="n">0</span><span class="k2">:</span> <span class="n">1600x900</span>, <span class="n">23b</span>it, <span class="n">60</span>Hz
<span class="number">  30</span><span class="n">0</span><span class="k2">:</span> <span class="n">1600x1024</span>, <span class="n">23b</span>it, <span class="n">59</span>Hz
<span class="number">  31</span><span class="n">0</span><span class="k2">:</span> <span class="n">1600x1024</span>, <span class="n">23b</span>it, <span class="n">60</span>Hz
<span class="number">  32</span><span class="n">0</span><span class="k2">:</span> <span class="n">1600x1200</span>, <span class="n">23b</span>it, <span class="n">60</span>Hz
<span class="number">  33</span><span class="n">0</span><span class="k2">:</span> <span class="n">1600x1200</span>, <span class="n">23b</span>it, <span class="n">59</span>Hz
<span class="number">  34</span><span class="n">0</span><span class="k2">:</span> <span class="n">1600x1200</span>, <span class="n">23b</span>it, <span class="n">24</span>Hz
<span class="number">  35</span><span class="n">0</span><span class="k2">:</span> <span class="n">1600x1200</span>, <span class="n">23b</span>it, <span class="n">23</span>Hz
<span class="number">  36</span><span class="n">0</span><span class="k2">:</span> <span class="n">1600x1200</span>, <span class="n">23b</span>it, <span class="n">25</span>Hz
<span class="number">  37</span><span class="n">0</span><span class="k2">:</span> <span class="n">1600x1200</span>, <span class="n">23b</span>it, <span class="n">30</span>Hz
<span class="number">  38</span><span class="n">0</span><span class="k2">:</span> <span class="n">1600x1200</span>, <span class="n">23b</span>it, <span class="n">29</span>Hz
<span class="number">  39</span><span class="n">0</span><span class="k2">:</span> <span class="n">1600x1200</span>, <span class="n">23b</span>it, <span class="n">50</span>Hz
<span class="number">  40</span><span class="n">0</span><span class="k2">:</span> <span class="n">1680x1050</span>, <span class="n">23b</span>it, <span class="n">59</span>Hz
<span class="number">  41</span><span class="n">0</span><span class="k2">:</span> <span class="n">1680x1050</span>, <span class="n">23b</span>it, <span class="n">60</span>Hz
<span class="number">  42</span><span class="n">0</span><span class="k2">:</span> <span class="n">1768x992</span>, <span class="n">23b</span>it, <span class="n">25</span>Hz
<span class="number">  43</span><span class="n">0</span><span class="k2">:</span> <span class="n">1768x992</span>, <span class="n">23b</span>it, <span class="n">30</span>Hz
<span class="number">  44</span><span class="n">0</span><span class="k2">:</span> <span class="n">1768x992</span>, <span class="n">23b</span>it, <span class="n">29</span>Hz
<span class="number">  45</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1080</span>, <span class="n">23b</span>it, <span class="n">60</span>Hz
<span class="number">  46</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1080</span>, <span class="n">23b</span>it, <span class="n">59</span>Hz
<span class="number">  47</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1080</span>, <span class="n">23b</span>it, <span class="n">50</span>Hz
<span class="number">  48</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1080</span>, <span class="n">23b</span>it, <span class="n">30</span>Hz
<span class="number">  49</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1080</span>, <span class="n">23b</span>it, <span class="n">29</span>Hz
<span class="number">  50</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1080</span>, <span class="n">23b</span>it, <span class="n">25</span>Hz
<span class="number">  51</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1080</span>, <span class="n">23b</span>it, <span class="n">24</span>Hz
<span class="number">  52</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1080</span>, <span class="n">23b</span>it, <span class="n">23</span>Hz
<span class="number">  53</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1200</span>, <span class="n">23b</span>it, <span class="n">60</span>Hz
<span class="number">  54</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1200</span>, <span class="n">23b</span>it, <span class="n">59</span>Hz
<span class="number">  55</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1200</span>, <span class="n">23b</span>it, <span class="n">24</span>Hz
<span class="number">  56</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1200</span>, <span class="n">23b</span>it, <span class="n">23</span>Hz
<span class="number">  57</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1200</span>, <span class="n">23b</span>it, <span class="n">25</span>Hz
<span class="number">  58</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1200</span>, <span class="n">23b</span>it, <span class="n">30</span>Hz
<span class="number">  59</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1200</span>, <span class="n">23b</span>it, <span class="n">29</span>Hz
<span class="number">  60</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1200</span>, <span class="n">23b</span>it, <span class="n">50</span>Hz
<span class="number">  61</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1440</span>, <span class="n">23b</span>it, <span class="n">60</span>Hz
<span class="number">  62</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1440</span>, <span class="n">23b</span>it, <span class="n">59</span>Hz
<span class="number">  63</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1440</span>, <span class="n">23b</span>it, <span class="n">24</span>Hz
<span class="number">  64</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1440</span>, <span class="n">23b</span>it, <span class="n">23</span>Hz
<span class="number">  65</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1440</span>, <span class="n">23b</span>it, <span class="n">25</span>Hz
<span class="number">  66</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1440</span>, <span class="n">23b</span>it, <span class="n">30</span>Hz
<span class="number">  67</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1440</span>, <span class="n">23b</span>it, <span class="n">29</span>Hz
<span class="number">  68</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1440</span>, <span class="n">23b</span>it, <span class="n">50</span>Hz
<span class="number">  69</span><span class="n">0</span><span class="k2">:</span> <span class="n">2048x1536</span>, <span class="n">23b</span>it, <span class="n">60</span>Hz
<span class="number">  70</span><span class="n">0</span><span class="k2">:</span> <span class="n">2048x1536</span>, <span class="n">23b</span>it, <span class="n">59</span>Hz
<span class="number">  71</span><span class="n">0</span><span class="k2">:</span> <span class="n">2048x1536</span>, <span class="n">23b</span>it, <span class="n">24</span>Hz
<span class="number">  72</span><span class="n">0</span><span class="k2">:</span> <span class="n">2048x1536</span>, <span class="n">23b</span>it, <span class="n">23</span>Hz
<span class="number">  73</span><span class="n">0</span><span class="k2">:</span> <span class="n">2048x1536</span>, <span class="n">23b</span>it, <span class="n">25</span>Hz
<span class="number">  74</span><span class="n">0</span><span class="k2">:</span> <span class="n">2048x1536</span>, <span class="n">23b</span>it, <span class="n">30</span>Hz
<span class="number">  75</span><span class="n">0</span><span class="k2">:</span> <span class="n">2048x1536</span>, <span class="n">23b</span>it, <span class="n">29</span>Hz
<span class="number">  76</span><span class="n">0</span><span class="k2">:</span> <span class="n">2048x1536</span>, <span class="n">23b</span>it, <span class="n">50</span>Hz
<span class="number">  77</span><span class="n">0</span><span class="k2">:</span> <span class="n">2560x1440</span>, <span class="n">23b</span>it, <span class="n">60</span>Hz
<span class="number">  78</span><span class="n">0</span><span class="k2">:</span> <span class="n">2560x1440</span>, <span class="n">23b</span>it, <span class="n">59</span>Hz
<span class="number">  79</span><span class="n">0</span><span class="k2">:</span> <span class="n">2560x1440</span>, <span class="n">23b</span>it, <span class="n">24</span>Hz
<span class="number">  80</span><span class="n">0</span><span class="k2">:</span> <span class="n">2560x1440</span>, <span class="n">23b</span>it, <span class="n">23</span>Hz
<span class="number">  81</span><span class="n">0</span><span class="k2">:</span> <span class="n">2560x1440</span>, <span class="n">23b</span>it, <span class="n">25</span>Hz
<span class="number">  82</span><span class="n">0</span><span class="k2">:</span> <span class="n">2560x1440</span>, <span class="n">23b</span>it, <span class="n">30</span>Hz
<span class="number">  83</span><span class="n">0</span><span class="k2">:</span> <span class="n">2560x1440</span>, <span class="n">23b</span>it, <span class="n">29</span>Hz
<span class="number">  84</span><span class="n">0</span><span class="k2">:</span> <span class="n">2560x1440</span>, <span class="n">23b</span>it, <span class="n">50</span>Hz
<span class="number">  85</span><span class="n">0</span><span class="k2">:</span> <span class="n">2560x1600</span>, <span class="n">23b</span>it, <span class="n">60</span>Hz
<span class="number">  86</span><span class="n">0</span><span class="k2">:</span> <span class="n">2560x1600</span>, <span class="n">23b</span>it, <span class="n">59</span>Hz
<span class="number">  87</span><span class="n">0</span><span class="k2">:</span> <span class="n">2560x1600</span>, <span class="n">23b</span>it, <span class="n">24</span>Hz
<span class="number">  88</span><span class="n">0</span><span class="k2">:</span> <span class="n">2560x1600</span>, <span class="n">23b</span>it, <span class="n">23</span>Hz
<span class="number">  89</span><span class="n">0</span><span class="k2">:</span> <span class="n">2560x1600</span>, <span class="n">23b</span>it, <span class="n">25</span>Hz
<span class="number">  90</span><span class="n">0</span><span class="k2">:</span> <span class="n">2560x1600</span>, <span class="n">23b</span>it, <span class="n">30</span>Hz
<span class="number">  91</span><span class="n">0</span><span class="k2">:</span> <span class="n">2560x1600</span>, <span class="n">23b</span>it, <span class="n">29</span>Hz
<span class="number">  92</span><span class="n">0</span><span class="k2">:</span> <span class="n">2560x1600</span>, <span class="n">23b</span>it, <span class="n">50</span>Hz
<span class="number">  93</span><span class="n">0</span><span class="k2">:</span> <span class="n">1440x900</span>, <span class="n">23b</span>it, <span class="n">60</span>Hz
<span class="number">  94</span><span class="n">0</span><span class="k2">:</span> <span class="n">1400x1050</span>, <span class="n">23b</span>it, <span class="n">59</span>Hz
<span class="number">  95</span><span class="n">0</span><span class="k2">:</span> <span class="n">1400x1050</span>, <span class="n">23b</span>it, <span class="n">60</span>Hz
<span class="number">  96</span><span class="n">0</span><span class="k2">:</span> <span class="n">3840x2160</span>, <span class="n">23b</span>it, <span class="n">60</span>Hz
<span class="number">  97</span><span class="n">0</span><span class="k2">:</span> <span class="n">3840x2160</span>, <span class="n">23b</span>it, <span class="n">59</span>Hz
<span class="number">  98</span><span class="n">0</span><span class="k2">:</span> <span class="n">3840x2160</span>, <span class="n">23b</span>it, <span class="n">24</span>Hz
<span class="number">  99</span><span class="n">0</span><span class="k2">:</span> <span class="n">3840x2160</span>, <span class="n">23b</span>it, <span class="n">23</span>Hz
<span class="number"> 100</span><span class="n">0</span><span class="k2">:</span> <span class="n">3840x2160</span>, <span class="n">23b</span>it, <span class="n">25</span>Hz
<span class="number"> 101</span><span class="n">0</span><span class="k2">:</span> <span class="n">3840x2160</span>, <span class="n">23b</span>it, <span class="n">30</span>Hz
<span class="number"> 102</span><span class="n">0</span><span class="k2">:</span> <span class="n">3840x2160</span>, <span class="n">23b</span>it, <span class="n">29</span>Hz
<span class="number"> 103</span><span class="n">0</span><span class="k2">:</span> <span class="n">3840x2160</span>, <span class="n">23b</span>it, <span class="n">50</span>Hz
<span class="number"> 104</span><span class="n">0</span><span class="k2">:</span> <span class="n">4096x2160</span>, <span class="n">23b</span>it, <span class="n">50</span>Hz
<span class="number"> 105</span><span class="n">0</span><span class="k2">:</span> <span class="n">4096x2160</span>, <span class="n">23b</span>it, <span class="n">60</span>Hz
<span class="number"> 106</span><span class="n">0</span><span class="k2">:</span> <span class="n">4096x2160</span>, <span class="n">23b</span>it, <span class="n">59</span>Hz
<span class="number"> 107</span><span class="n">0</span><span class="k2">:</span> <span class="n">4096x2160</span>, <span class="n">23b</span>it, <span class="n">24</span>Hz
<span class="number"> 108</span><span class="n">0</span><span class="k2">:</span> <span class="n">4096x2160</span>, <span class="n">23b</span>it, <span class="n">23</span>Hz
<span class="number"> 109</span><span class="n">0</span><span class="k2">:</span> <span class="n">4096x2160</span>, <span class="n">23b</span>it, <span class="n">25</span>Hz
<span class="number"> 110</span><span class="n">0</span><span class="k2">:</span> <span class="n">4096x2160</span>, <span class="n">23b</span>it, <span class="n">30</span>Hz
<span class="number"> 111</span><span class="n">0</span><span class="k2">:</span> <span class="n">4096x2160</span>, <span class="n">23b</span>it, <span class="n">29</span>Hz
<span class="number"> 112</span><span class="n">0</span><span class="k2">:</span> <span class="n">640x480</span>, <span class="n">13b</span>it, <span class="n">60</span>Hz
<span class="number"> 113</span><span class="n">0</span><span class="k2">:</span> <span class="n">640x480</span>, <span class="n">13b</span>it, <span class="n">72</span>Hz
<span class="number"> 114</span><span class="n">0</span><span class="k2">:</span> <span class="n">640x480</span>, <span class="n">13b</span>it, <span class="n">75</span>Hz
<span class="number"> 115</span><span class="n">0</span><span class="k2">:</span> <span class="n">720x480</span>, <span class="n">13b</span>it, <span class="n">60</span>Hz
<span class="number"> 116</span><span class="n">0</span><span class="k2">:</span> <span class="n">720x480</span>, <span class="n">13b</span>it, <span class="n">59</span>Hz
<span class="number"> 117</span><span class="n">0</span><span class="k2">:</span> <span class="n">720x576</span>, <span class="n">13b</span>it, <span class="n">50</span>Hz
<span class="number"> 118</span><span class="n">0</span><span class="k2">:</span> <span class="n">800x600</span>, <span class="n">13b</span>it, <span class="n">60</span>Hz
<span class="number"> 119</span><span class="n">0</span><span class="k2">:</span> <span class="n">800x600</span>, <span class="n">13b</span>it, <span class="n">72</span>Hz
<span class="number"> 120</span><span class="n">0</span><span class="k2">:</span> <span class="n">800x600</span>, <span class="n">13b</span>it, <span class="n">75</span>Hz
<span class="number"> 121</span><span class="n">0</span><span class="k2">:</span> <span class="n">1024x768</span>, <span class="n">13b</span>it, <span class="n">60</span>Hz
<span class="number"> 122</span><span class="n">0</span><span class="k2">:</span> <span class="n">1024x768</span>, <span class="n">13b</span>it, <span class="n">70</span>Hz
<span class="number"> 123</span><span class="n">0</span><span class="k2">:</span> <span class="n">1024x768</span>, <span class="n">13b</span>it, <span class="n">75</span>Hz
<span class="number"> 124</span><span class="n">0</span><span class="k2">:</span> <span class="n">1152x864</span>, <span class="n">13b</span>it, <span class="n">75</span>Hz
<span class="number"> 125</span><span class="n">0</span><span class="k2">:</span> <span class="n">1176x664</span>, <span class="n">13b</span>it, <span class="n">50</span>Hz
<span class="number"> 126</span><span class="n">0</span><span class="k2">:</span> <span class="n">1176x664</span>, <span class="n">13b</span>it, <span class="n">60</span>Hz
<span class="number"> 127</span><span class="n">0</span><span class="k2">:</span> <span class="n">1176x664</span>, <span class="n">13b</span>it, <span class="n">59</span>Hz
<span class="number"> 128</span><span class="n">0</span><span class="k2">:</span> <span class="n">1280x720</span>, <span class="n">13b</span>it, <span class="n">60</span>Hz
<span class="number"> 129</span><span class="n">0</span><span class="k2">:</span> <span class="n">1280x720</span>, <span class="n">13b</span>it, <span class="n">59</span>Hz
<span class="number"> 130</span><span class="n">0</span><span class="k2">:</span> <span class="n">1280x720</span>, <span class="n">13b</span>it, <span class="n">50</span>Hz
<span class="number"> 131</span><span class="n">0</span><span class="k2">:</span> <span class="n">1280x768</span>, <span class="n">13b</span>it, <span class="n">60</span>Hz
<span class="number"> 132</span><span class="n">0</span><span class="k2">:</span> <span class="n">1280x800</span>, <span class="n">13b</span>it, <span class="n">60</span>Hz
<span class="number"> 133</span><span class="n">0</span><span class="k2">:</span> <span class="n">1280x960</span>, <span class="n">13b</span>it, <span class="n">60</span>Hz
<span class="number"> 134</span><span class="n">0</span><span class="k2">:</span> <span class="n">1280x960</span>, <span class="n">13b</span>it, <span class="n">75</span>Hz
<span class="number"> 135</span><span class="n">0</span><span class="k2">:</span> <span class="n">1280x1024</span>, <span class="n">13b</span>it, <span class="n">60</span>Hz
<span class="number"> 136</span><span class="n">0</span><span class="k2">:</span> <span class="n">1280x1024</span>, <span class="n">13b</span>it, <span class="n">75</span>Hz
<span class="number"> 137</span><span class="n">0</span><span class="k2">:</span> <span class="n">1360x768</span>, <span class="n">13b</span>it, <span class="n">60</span>Hz
<span class="number"> 138</span><span class="n">0</span><span class="k2">:</span> <span class="n">1366x768</span>, <span class="n">13b</span>it, <span class="n">60</span>Hz
<span class="number"> 139</span><span class="n">0</span><span class="k2">:</span> <span class="n">1600x900</span>, <span class="n">13b</span>it, <span class="n">60</span>Hz
<span class="number"> 140</span><span class="n">0</span><span class="k2">:</span> <span class="n">1600x1024</span>, <span class="n">13b</span>it, <span class="n">59</span>Hz
<span class="number"> 141</span><span class="n">0</span><span class="k2">:</span> <span class="n">1600x1024</span>, <span class="n">13b</span>it, <span class="n">60</span>Hz
<span class="number"> 142</span><span class="n">0</span><span class="k2">:</span> <span class="n">1600x1200</span>, <span class="n">13b</span>it, <span class="n">60</span>Hz
<span class="number"> 143</span><span class="n">0</span><span class="k2">:</span> <span class="n">1600x1200</span>, <span class="n">13b</span>it, <span class="n">59</span>Hz
<span class="number"> 144</span><span class="n">0</span><span class="k2">:</span> <span class="n">1600x1200</span>, <span class="n">13b</span>it, <span class="n">24</span>Hz
<span class="number"> 145</span><span class="n">0</span><span class="k2">:</span> <span class="n">1600x1200</span>, <span class="n">13b</span>it, <span class="n">23</span>Hz
<span class="number"> 146</span><span class="n">0</span><span class="k2">:</span> <span class="n">1600x1200</span>, <span class="n">13b</span>it, <span class="n">25</span>Hz
<span class="number"> 147</span><span class="n">0</span><span class="k2">:</span> <span class="n">1600x1200</span>, <span class="n">13b</span>it, <span class="n">30</span>Hz
<span class="number"> 148</span><span class="n">0</span><span class="k2">:</span> <span class="n">1600x1200</span>, <span class="n">13b</span>it, <span class="n">29</span>Hz
<span class="number"> 149</span><span class="n">0</span><span class="k2">:</span> <span class="n">1600x1200</span>, <span class="n">13b</span>it, <span class="n">50</span>Hz
<span class="number"> 150</span><span class="n">0</span><span class="k2">:</span> <span class="n">1680x1050</span>, <span class="n">13b</span>it, <span class="n">59</span>Hz
<span class="number"> 151</span><span class="n">0</span><span class="k2">:</span> <span class="n">1680x1050</span>, <span class="n">13b</span>it, <span class="n">60</span>Hz
<span class="number"> 152</span><span class="n">0</span><span class="k2">:</span> <span class="n">1768x992</span>, <span class="n">13b</span>it, <span class="n">25</span>Hz
<span class="number"> 153</span><span class="n">0</span><span class="k2">:</span> <span class="n">1768x992</span>, <span class="n">13b</span>it, <span class="n">30</span>Hz
<span class="number"> 154</span><span class="n">0</span><span class="k2">:</span> <span class="n">1768x992</span>, <span class="n">13b</span>it, <span class="n">29</span>Hz
<span class="number"> 155</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1080</span>, <span class="n">13b</span>it, <span class="n">60</span>Hz
<span class="number"> 156</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1080</span>, <span class="n">13b</span>it, <span class="n">59</span>Hz
<span class="number"> 157</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1080</span>, <span class="n">13b</span>it, <span class="n">50</span>Hz
<span class="number"> 158</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1080</span>, <span class="n">13b</span>it, <span class="n">30</span>Hz
<span class="number"> 159</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1080</span>, <span class="n">13b</span>it, <span class="n">29</span>Hz
<span class="number"> 160</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1080</span>, <span class="n">13b</span>it, <span class="n">25</span>Hz
<span class="number"> 161</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1080</span>, <span class="n">13b</span>it, <span class="n">24</span>Hz
<span class="number"> 162</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1080</span>, <span class="n">13b</span>it, <span class="n">23</span>Hz
<span class="number"> 163</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1200</span>, <span class="n">13b</span>it, <span class="n">60</span>Hz
<span class="number"> 164</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1200</span>, <span class="n">13b</span>it, <span class="n">59</span>Hz
<span class="number"> 165</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1200</span>, <span class="n">13b</span>it, <span class="n">24</span>Hz
<span class="number"> 166</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1200</span>, <span class="n">13b</span>it, <span class="n">23</span>Hz
<span class="number"> 167</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1200</span>, <span class="n">13b</span>it, <span class="n">25</span>Hz
<span class="number"> 168</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1200</span>, <span class="n">13b</span>it, <span class="n">30</span>Hz
<span class="number"> 169</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1200</span>, <span class="n">13b</span>it, <span class="n">29</span>Hz
<span class="number"> 170</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1200</span>, <span class="n">13b</span>it, <span class="n">50</span>Hz
<span class="number"> 171</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1440</span>, <span class="n">13b</span>it, <span class="n">60</span>Hz
<span class="number"> 172</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1440</span>, <span class="n">13b</span>it, <span class="n">59</span>Hz
<span class="number"> 173</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1440</span>, <span class="n">13b</span>it, <span class="n">24</span>Hz
<span class="number"> 174</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1440</span>, <span class="n">13b</span>it, <span class="n">23</span>Hz
<span class="number"> 175</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1440</span>, <span class="n">13b</span>it, <span class="n">25</span>Hz
<span class="number"> 176</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1440</span>, <span class="n">13b</span>it, <span class="n">30</span>Hz
<span class="number"> 177</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1440</span>, <span class="n">13b</span>it, <span class="n">29</span>Hz
<span class="number"> 178</span><span class="n">0</span><span class="k2">:</span> <span class="n">1920x1440</span>, <span class="n">13b</span>it, <span class="n">50</span>Hz
<span class="number"> 179</span><span class="n">0</span><span class="k2">:</span> <span class="n">2048x1536</span>, <span class="n">13b</span>it, <span class="n">60</span>Hz
<span class="number"> 180</span><span class="n">0</span><span class="k2">:</span> <span class="n">2048x1536</span>, <span class="n">13b</span>it, <span class="n">59</span>Hz
<span class="number"> 181</span><span class="n">0</span><span class="k2">:</span> <span class="n">2048x1536</span>, <span class="n">13b</span>it, <span class="n">24</span>Hz
<span class="number"> 182</span><span class="n">0</span><span class="k2">:</span> <span class="n">2048x1536</span>, <span class="n">13b</span>it, <span class="n">23</span>Hz
<span class="number"> 183</span><span class="n">0</span><span class="k2">:</span> <span class="n">2048x1536</span>, <span class="n">13b</span>it, <span class="n">25</span>Hz
<span class="number"> 184</span><span class="n">0</span><span class="k2">:</span> <span class="n">2048x1536</span>, <span class="n">13b</span>it, <span class="n">30</span>Hz
<span class="number"> 185</span><span class="n">0</span><span class="k2">:</span> <span class="n">2048x1536</span>, <span class="n">13b</span>it, <span class="n">29</span>Hz
<span class="number"> 186</span><span class="n">0</span><span class="k2">:</span> <span class="n">2048x1536</span>, <span class="n">13b</span>it, <span class="n">50</span>Hz
<span class="number"> 187</span><span class="n">0</span><span class="k2">:</span> <span class="n">2560x1440</span>, <span class="n">13b</span>it, <span class="n">60</span>Hz
<span class="number"> 188</span><span class="n">0</span><span class="k2">:</span> <span class="n">2560x1440</span>, <span class="n">13b</span>it, <span class="n">59</span>Hz
<span class="number"> 189</span><span class="n">0</span><span class="k2">:</span> <span class="n">2560x1440</span>, <span class="n">13b</span>it, <span class="n">24</span>Hz
<span class="number"> 190</span><span class="n">0</span><span class="k2">:</span> <span class="n">2560x1440</span>, <span class="n">13b</span>it, <span class="n">23</span>Hz
<span class="number"> 191</span><span class="n">0</span><span class="k2">:</span> <span class="n">2560x1440</span>, <span class="n">13b</span>it, <span class="n">25</span>Hz
<span class="number"> 192</span><span class="n">0</span><span class="k2">:</span> <span class="n">2560x1440</span>, <span class="n">13b</span>it, <span class="n">30</span>Hz
<span class="number"> 193</span><span class="n">0</span><span class="k2">:</span> <span class="n">2560x1440</span>, <span class="n">13b</span>it, <span class="n">29</span>Hz
<span class="number"> 194</span><span class="n">0</span><span class="k2">:</span> <span class="n">2560x1440</span>, <span class="n">13b</span>it, <span class="n">50</span>Hz
<span class="number"> 195</span><span class="n">0</span><span class="k2">:</span> <span class="n">2560x1600</span>, <span class="n">13b</span>it, <span class="n">60</span>Hz
<span class="number"> 196</span><span class="n">0</span><span class="k2">:</span> <span class="n">2560x1600</span>, <span class="n">13b</span>it, <span class="n">59</span>Hz
<span class="number"> 197</span><span class="n">0</span><span class="k2">:</span> <span class="n">2560x1600</span>, <span class="n">13b</span>it, <span class="n">24</span>Hz
<span class="number"> 198</span><span class="n">0</span><span class="k2">:</span> <span class="n">2560x1600</span>, <span class="n">13b</span>it, <span class="n">23</span>Hz
<span class="number"> 199</span><span class="n">0</span><span class="k2">:</span> <span class="n">2560x1600</span>, <span class="n">13b</span>it, <span class="n">25</span>Hz
<span class="number"> 200</span><span class="n">0</span><span class="k2">:</span> <span class="n">2560x1600</span>, <span class="n">13b</span>it, <span class="n">30</span>Hz
<span class="number"> 201</span><span class="n">0</span><span class="k2">:</span> <span class="n">2560x1600</span>, <span class="n">13b</span>it, <span class="n">29</span>Hz
<span class="number"> 202</span><span class="n">0</span><span class="k2">:</span> <span class="n">2560x1600</span>, <span class="n">13b</span>it, <span class="n">50</span>Hz
<span class="number"> 203</span><span class="n">0</span><span class="k2">:</span> <span class="n">1440x900</span>, <span class="n">13b</span>it, <span class="n">60</span>Hz
<span class="number"> 204</span><span class="n">0</span><span class="k2">:</span> <span class="n">1400x1050</span>, <span class="n">13b</span>it, <span class="n">59</span>Hz
<span class="number"> 205</span><span class="n">0</span><span class="k2">:</span> <span class="n">1400x1050</span>, <span class="n">13b</span>it, <span class="n">60</span>Hz
<span class="number"> 206</span><span class="n">0</span><span class="k2">:</span> <span class="n">3840x2160</span>, <span class="n">13b</span>it, <span class="n">60</span>Hz
<span class="number"> 207</span><span class="n">0</span><span class="k2">:</span> <span class="n">3840x2160</span>, <span class="n">13b</span>it, <span class="n">59</span>Hz
<span class="number"> 208</span><span class="n">0</span><span class="k2">:</span> <span class="n">3840x2160</span>, <span class="n">13b</span>it, <span class="n">24</span>Hz
<span class="number"> 209</span><span class="n">0</span><span class="k2">:</span> <span class="n">3840x2160</span>, <span class="n">13b</span>it, <span class="n">23</span>Hz
<span class="number"> 210</span><span class="n">0</span><span class="k2">:</span> <span class="n">3840x2160</span>, <span class="n">13b</span>it, <span class="n">25</span>Hz
<span class="number"> 211</span><span class="n">0</span><span class="k2">:</span> <span class="n">3840x2160</span>, <span class="n">13b</span>it, <span class="n">30</span>Hz
<span class="number"> 212</span><span class="n">0</span><span class="k2">:</span> <span class="n">3840x2160</span>, <span class="n">13b</span>it, <span class="n">29</span>Hz
<span class="number"> 213</span><span class="n">0</span><span class="k2">:</span> <span class="n">3840x2160</span>, <span class="n">13b</span>it, <span class="n">50</span>Hz
<span class="number"> 214</span><span class="n">0</span><span class="k2">:</span> <span class="n">4096x2160</span>, <span class="n">13b</span>it, <span class="n">50</span>Hz
<span class="number"> 215</span><span class="n">0</span><span class="k2">:</span> <span class="n">4096x2160</span>, <span class="n">13b</span>it, <span class="n">60</span>Hz
<span class="number"> 216</span><span class="n">0</span><span class="k2">:</span> <span class="n">4096x2160</span>, <span class="n">13b</span>it, <span class="n">59</span>Hz
<span class="number"> 217</span><span class="n">0</span><span class="k2">:</span> <span class="n">4096x2160</span>, <span class="n">13b</span>it, <span class="n">24</span>Hz
<span class="number"> 218</span><span class="n">0</span><span class="k2">:</span> <span class="n">4096x2160</span>, <span class="n">13b</span>it, <span class="n">23</span>Hz
<span class="number"> 219</span><span class="n">0</span><span class="k2">:</span> <span class="n">4096x2160</span>, <span class="n">13b</span>it, <span class="n">25</span>Hz
<span class="number"> 220</span><span class="n">0</span><span class="k2">:</span> <span class="n">4096x2160</span>, <span class="n">13b</span>it, <span class="n">30</span>Hz
<span class="number"> 221</span><span class="n">0</span><span class="k2">:</span> <span class="n">4096x2160</span>, <span class="n">13b</span>it, <span class="n">29</span>Hz
<span class="number"> 222</span><span class="n">0</span><span class="k2">:</span> Config <a href="http://www.allegro.cc/manual/screen"><span class="a">screen</span></a> resolution is invalid <span class="k3">-</span> trying desktop res <span class="k2">(</span>fullscreen<span class="k2">)</span> <span class="k1">or</span> first resolution below desktop <span class="k2">(</span>windowed<span class="k2">)</span>
<span class="number"> 223</span><span class="n">0</span><span class="k2">:</span> Changing video mode to <span class="n">1400x1050</span>, windowed, <span class="n">32</span> bit colour
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Chris Katko)</author>
		<pubDate>Tue, 08 Sep 2020 17:08:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>That&#39;s fine, it&#39;s just a reminder to me that I need to update that code at some point.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Andrew Gillett)</author>
		<pubDate>Tue, 08 Sep 2020 17:09:11 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>One thing I notice is
</p><div class="source-code snippet"><div class="inner"><pre>  <a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_bitmap</span></a><span class="k2">(</span>dest<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
called for every sprite. That may incur a cost (and the driver update may have reduced that cost). If the target is always a render buffer, or the screen, etc, you should only be calling that once [per actual need] as the driver may be using the moving [current target] to decide when to cache / move memory around. (complete guess but it&#39;s definitely different than I&#39;ve ever coded my projects)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Chris Katko)</author>
		<pubDate>Tue, 08 Sep 2020 17:15:54 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I mentioned in a previous post:<br />&quot;Something strange I noticed is that when I request a list of graphics modes in Allegro 5, all the modes are reported as having 23 bit colour depth. However, when I print the actual bitmap colour depths, they are all 32.&quot;</p><p>This is the code which prints the modes:</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number"> 1</span><span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> i <span class="k3">&lt;</span> <a href="http://www.allegro.cc/manual/al_get_num_display_modes"><span class="a">al_get_num_display_modes</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>i<span class="k2">)</span>
<span class="number"> 2</span><span class="k2">{</span>
<span class="number"> 3</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY_MODE"><span class="a">ALLEGRO_DISPLAY_MODE</span></a> mode<span class="k2">;</span>
<span class="number"> 4</span>  <a href="http://www.allegro.cc/manual/al_get_display_mode"><span class="a">al_get_display_mode</span></a><span class="k2">(</span>i, <span class="k3">&amp;</span>mode<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 5</span>  Log<span class="k2">(</span><span class="s">"%dx%d, %dbit, %dHz\n"</span>, mode.width, mode.height, mode.format, mode.refresh_rate<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 6</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Andrew Gillett)</author>
		<pubDate>Tue, 08 Sep 2020 17:21:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>profile shows </p><p>7% of time was spent just in al_set_target() on my machine<br />14% on al_draw_bitmap</p><p>though i&#39;m not used to this MSVC UI for profiling</p><p>[edit]</p><p>24% was in waiting for events, so it&#39;s either vsync or set to only draw a set rate.</p><p>[edit]</p><p>I set al_set_new_display_option(ALLEGRO_VSYNC, 2, ALLEGRO_REQUIRE); //vsync off</p><div class="source-code snippet"><div class="inner"><pre><span class="n">600</span><span class="k2">:</span> Advance: <span class="n">0</span>.<span class="n">0</span>ms  Render1: <span class="n">7</span>.<span class="n">0</span>ms  Render2: <span class="n">0</span>.<span class="n">5</span>ms  Frame: <span class="n">7</span>.<span class="n">4</span>ms
<span class="n">600</span><span class="k2">:</span> Advance: <span class="n">0</span>.<span class="n">0</span>ms  Render1: <span class="n">7</span>.<span class="n">5</span>ms  Render2: <span class="n">0</span>.<span class="n">5</span>ms  Frame: <span class="n">8</span>.<span class="n">0</span>ms
<span class="n">600</span><span class="k2">:</span> Advance: <span class="n">0</span>.<span class="n">0</span>ms  Render1: <span class="n">7</span>.<span class="n">9</span>ms  Render2: <span class="n">0</span>.<span class="n">3</span>ms  Frame: <span class="n">8</span>.<span class="n">3</span>ms
<span class="n">600</span><span class="k2">:</span> Advance: <span class="n">0</span>.<span class="n">0</span>ms  Render1: <span class="n">9</span>.<span class="n">9</span>ms  Render2: <span class="n">0</span>.<span class="n">3</span>ms  Frame: <span class="n">10</span>.<span class="n">3</span>ms
<span class="n">600</span><span class="k2">:</span> Advance: <span class="n">0</span>.<span class="n">0</span>ms  Render1: <span class="n">7</span>.<span class="n">3</span>ms  Render2: <span class="n">0</span>.<span class="n">3</span>ms  Frame: <span class="n">7</span>.<span class="n">6</span>ms
<span class="n">600</span><span class="k2">:</span> Advance: <span class="n">0</span>.<span class="n">0</span>ms  Render1: <span class="n">9</span>.<span class="n">5</span>ms  Render2: <span class="n">0</span>.<span class="n">3</span>ms  Frame: <span class="n">9</span>.<span class="n">8</span>ms
<span class="n">600</span><span class="k2">:</span> Advance: <span class="n">0</span>.<span class="n">0</span>ms  Render1: <span class="n">7</span>.<span class="n">3</span>ms  Render2: <span class="n">0</span>.<span class="n">3</span>ms  Frame: <span class="n">7</span>.<span class="n">7</span>ms
<span class="n">600</span><span class="k2">:</span> Advance: <span class="n">0</span>.<span class="n">0</span>ms  Render1: <span class="n">9</span>.<span class="n">5</span>ms  Render2: <span class="n">0</span>.<span class="n">5</span>ms  Frame: <span class="n">10</span>.<span class="n">0</span>ms
<span class="n">600</span><span class="k2">:</span> Advance: <span class="n">0</span>.<span class="n">0</span>ms  Render1: <span class="n">7</span>.<span class="n">9</span>ms  Render2: <span class="n">0</span>.<span class="n">4</span>ms  Frame: <span class="n">8</span>.<span class="n">2</span>ms
<span class="n">600</span><span class="k2">:</span> Advance: <span class="n">0</span>.<span class="n">0</span>ms  Render1: <span class="n">7</span>.<span class="n">7</span>ms  Render2: <span class="n">0</span>.<span class="n">3</span>ms  Frame: <span class="n">8</span>.<span class="n">0</span>ms
</pre></div></div><p>

I&#39;m getting over 100 FPS even with al_set_target_bitmap (still uses 8% cpu time!). Granted, it&#39;s a GTX 1060.</p><p>Still, it&#39;s showing plenty of time taken in the event queue so maybe I&#39;ll need to force no vsync with my drivers. That, or you did something wrong with the event queue/timers and it&#39;s forcing it to wait.</p><p>[edit] Still blowing 25% time waiting for events with vsync forced off. Take a look through in your event handler / timing code when you can, I&#39;m out of time for the moment.</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="c">//25% in this block</span>
<span class="number">  2</span><span class="c">//psector.cpp:354</span>
<span class="number">  3</span>    <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_is_event_queue_empty"><span class="a">al_is_event_queue_empty</span></a><span class="k2">(</span>eventQueue<span class="k2">)</span><span class="k2">)</span>
<span class="number">  4</span>      <span class="k2">{</span>
<span class="number">  5</span>        <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> event<span class="k2">;</span>
<span class="number">  6</span>
<span class="number">  7</span>        <a href="http://www.allegro.cc/manual/al_wait_for_event"><span class="a">al_wait_for_event</span></a><span class="k2">(</span>eventQueue, <span class="k3">&amp;</span>event<span class="k2">)</span><span class="k2">;</span>
<span class="number">  8</span>
<span class="number">  9</span>        <span class="k1">switch</span> <span class="k2">(</span>event.type<span class="k2">)</span>
<span class="number"> 10</span>        <span class="k2">{</span>
<span class="number"> 11</span>          <span class="k1">case</span> ALLEGRO_EVENT_DISPLAY_CLOSE:
<span class="number"> 12</span>            quit <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 13</span>            <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 14</span>          <span class="k1">case</span> ALLEGRO_EVENT_DISPLAY_LOST:
<span class="number"> 15</span>            Log<span class="k2">(</span><span class="s">"ALLEGRO_EVENT_DISPLAY_LOST\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>            <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 17</span>          <span class="k1">case</span> ALLEGRO_EVENT_DISPLAY_HALT_DRAWING:
<span class="number"> 18</span>            Log<span class="k2">(</span><span class="s">"ALLEGRO_EVENT_DISPLAY_HALT_DRAWING\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>            <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 20</span>          <span class="k1">case</span> ALLEGRO_EVENT_DISPLAY_RESUME_DRAWING:
<span class="number"> 21</span>            Log<span class="k2">(</span><span class="s">"ALLEGRO_EVENT_DISPLAY_RESUME_DRAWING\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 22</span>            <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 23</span>          <span class="k1">case</span> ALLEGRO_EVENT_TIMER:
<span class="number"> 24</span>            <span class="k3">+</span><span class="k3">+</span>timer_value<span class="k2">;</span>
<span class="number"> 25</span>            <span class="k3">+</span><span class="k3">+</span>totalTicks<span class="k2">;</span>
<span class="number"> 26</span>            <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 27</span>        <span class="k2">}</span>
<span class="number"> 28</span>      <span class="k2">}</span>
</div></div><p>

You know, the second I look at that, it looks completely normal. I was expecting something more... squirrelly.</p><p>[edit]</p><p>Wait, no... how... if you&#39;re waiting for Allegro to fire off an event, it&#39;s literally impossible to exceed that speed. I don&#39;t think that&#39;s how you&#39;d setup timing for a benchmark.</p><p>Here you set a timer based on the refresh rate of the screen:
</p><div class="source-code snippet"><div class="inner"><pre><span class="c">//psector.cpp:232</span>
  alTimer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_timer"><span class="a">al_create_timer</span></a><span class="k2">(</span><span class="n">1</span>.<span class="n">0</span> <span class="k3">/</span> update_rate<span class="k2">)</span><span class="k2">;</span>
  <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>eventQueue, <a href="http://www.allegro.cc/manual/al_get_timer_event_source"><span class="a">al_get_timer_event_source</span></a><span class="k2">(</span>alTimer<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
  <a href="http://www.allegro.cc/manual/al_start_timer"><span class="a">al_start_timer</span></a><span class="k2">(</span>alTimer<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

and that&#39;s the only thing triggering the exit from the while loop above.</p><p>p.s. profilers rule. <img src="http://www.allegro.cc/forums/smileys/cool.gif" alt="8-)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Chris Katko)</author>
		<pubDate>Tue, 08 Sep 2020 17:57:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Great work CK!</p><p>Just one thing,
</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/618223/1047244#target">Chris Katko</a> said:</div><div class="quote"><p> Well this looks wrong. I sure as heck don&#39;t have a &quot;23bit&quot; or &quot;13bit&quot; color screen.
</p></div></div><p>The <span class="source-code">format</span> member is not a bit depth it&#39;s a pixel format, one of <a href="https://liballeg.org/a5docs/trunk/graphics.html#allegro_pixel_format">these</a>. So, 13 is ALLEGRO_PIXEL_FORMAT_RGB_565 and 23 is ALLEGRO_PIXEL_FORMAT_XRGB_8888. Hopefully that makes more sense.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Hull)</author>
		<pubDate>Tue, 08 Sep 2020 20:01:05 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The game runs at a maximum of 60fps. The timings I&#39;ve been looking at are those measured by my own timing system, which measures the render1 and render2 times and outputs them once the level has been running for 10 seconds. You&#39;re right in saying that this system isn&#39;t ideal for profiling using the MSVC profiler. Commenting out &quot;if (timer_value &gt; 0)&quot; and &quot;if (timer_value == 0 || ++framesSkipped == 4)&quot; should allow it to run flat-out.</p><p>UPDATE:<br />I added the optimisation to only call al_set_target_bitmap when it needs to change. I see a boost to Render1 performance but strangely, al_flip_display consistently takes longer. I have split it out from the Render2 timing, which confirms that all the Render2 time is taken up by al_flip_display.</p><pre>
Direct3D
Without targetBitmap optimisation
	Render1: 9.3ms  Render2: 0.0ms  Flip: 0.5ms Frame: 9.8ms
	Render1: 9.2ms  Render2: 0.0ms  Flip: 0.6ms Frame: 9.9ms
	Render1: 9.3ms  Render2: 0.0ms  Flip: 0.7ms Frame: 9.9ms
	Render1: 8.9ms  Render2: 0.0ms  Flip: 0.5ms Frame: 9.5ms
	Render1: 9.0ms  Render2: 0.0ms  Flip: 0.5ms Frame: 9.5ms

With targetBitmap optimisation
	Render1: 6.5ms  Render2: 0.0ms  Flip: 0.9ms Frame: 7.5ms
	Render1: 6.9ms  Render2: 0.0ms  Flip: 1.0ms Frame: 7.9ms
	Render1: 6.9ms  Render2: 0.0ms  Flip: 0.9ms Frame: 7.9ms
	Render1: 7.4ms  Render2: 0.0ms  Flip: 1.0ms Frame: 8.4ms
	Render1: 6.7ms  Render2: 0.0ms  Flip: 1.0ms Frame: 7.7ms
</pre><p>

I also added an option for it to run flat out, without waiting for a timer event. When I enable that, I get these results:</p><pre>
With RUN_FLAT_OUT and targetBitmap optimisation
	Render1: 7.9ms  Render2: 0.0ms  Flip: 8.0ms Frame: 16.0ms
	Render1: 7.6ms  Render2: 0.0ms  Flip: 8.0ms Frame: 15.7ms
	Render1: 7.4ms  Render2: 0.0ms  Flip: 7.7ms Frame: 15.2ms
	Render1: 7.4ms  Render2: 0.0ms  Flip: 7.3ms Frame: 14.7ms
	Render1: 6.0ms  Render2: 0.0ms  Flip: 8.7ms Frame: 14.8ms
</pre><p>

This is with vsync off using ALLEGRO_REQUIRE, although as you say the driver does not necessarily honour that.</p><p>Updated project:<br /><a href="https://drive.google.com/file/d/1RfEbTlI3yn2lzxaClDGe9Sb3j0ZYBPO9/view?usp=sharing">https://drive.google.com/file/d/1RfEbTlI3yn2lzxaClDGe9Sb3j0ZYBPO9/view?usp=sharing</a></p><p>See these lines in updated project:<br />#define RUN_FLAT_OUT 0 (psector.cpp)<br />#define SET_TARGET_BITMAP_OPTIMISATION 1 (sprites.cpp)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Andrew Gillett)</author>
		<pubDate>Tue, 08 Sep 2020 21:31:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/618223/1047253#target">Andrew Gillett</a> said:</div><div class="quote"><p>
I added the optimisation to only call al_set_target_bitmap when it needs to change. I see a boost to Render1 performance but strangely, al_flip_display consistently takes longer. I have split it out from the Render2 timing, which confirms that all the Render2 time is taken up by al_flip_display.
</p></div></div><p>
That does still does seem like vsync (or another hard limiter). So the question is now, isn&#39;t so much performance but &quot;is there something wrong in your code, or does everyone else have the same FPS limit when using Allegro in Windows?&quot;</p><p>Also, do you have Intel, AMD, or nVidia hardware?</p><p>Thanks,<br />--Chris</p><p>[edit] I dev in Linux and I&#39;ve never had these problems so I&#39;m guessing it&#39;s a Windows only issue unless there&#39;s another squirrelly timing issue hidden.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Chris Katko)</author>
		<pubDate>Fri, 11 Sep 2020 14:35:27 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Intel Core i5-3570K with integrated Intel HD Graphics 4000 GPU
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Andrew Gillett)</author>
		<pubDate>Fri, 11 Sep 2020 16:46:38 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Is it a laptop, with some sort of power saving mode?</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/618223/1047253#target">Andrew Gillett</a> said:</div><div class="quote"><p>
This is with vsync off using ALLEGRO_REQUIRE, although as you say the driver does not necessarily honour that.
</p></div></div><p>
Oddly enough, with REQUIRE, it&#39;s supposed to fail/crash if it can&#39;t force it. But who knows if that actually works.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Chris Katko)</author>
		<pubDate>Fri, 11 Sep 2020 20:20:31 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>No, it&#39;s a desktop.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Andrew Gillett)</author>
		<pubDate>Fri, 11 Sep 2020 20:33:07 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Allegro can&#39;t always override the driver&#39;s decision about VSYNC. You need to disable VSYNC in your driver for your application to be sure. ALLEGRO_VSYNC is just a suggestion, even with ALLEGRO_REQUIRE, because the driver is in control.</p><p>16ms is 60HZ, which indicates VSYNC.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sat, 12 Sep 2020 00:51:51 +0000</pubDate>
	</item>
</rss>
