changeset 3081:26684891c976 draft

(svn r3670) -Codechange: [OSX] rewrote a part of the cocoa video driver to speed it up by 1000% in fullscreen rewrote QZ_DrawScreen to only redraw dirty rectangles (instead of everything) This reduce the OpenTTD time spent on this function from 75% to 6,7% (in main menu) Note: window mode is unaffected by this commit Note: the mouse pointer can now leave artefacts in debug mode
author bjarni <bjarni@openttd.org>
date Fri, 24 Feb 2006 22:05:20 +0000
parents 8e809a9ecb5c
children 6777f4f231be
files video/cocoa_v.m
diffstat 1 files changed, 31 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/video/cocoa_v.m
+++ b/video/cocoa_v.m
@@ -1470,15 +1470,43 @@
 	uint width;
 	uint pitch;
 	uint y;
-
-	QZ_WaitForVerticalBlank();
+	uint num_dirty_rects;
+	uint length_drawn;
+	uint left;
+	uint i;
 
 	src = _cocoa_video_data.pixels;
 	dst = (uint8*)_cocoa_video_data.realpixels;
 	height = _cocoa_video_data.height;
 	width  = _cocoa_video_data.width;
 	pitch  = _cocoa_video_data.pitch;
-	for (y = 0; y < height; y++) memcpy(dst + y * pitch, src + y * width, width);
+	num_dirty_rects = _cocoa_video_data.num_dirty_rects;
+
+	/* Check if we need to do anything */
+	if (_cocoa_video_data.num_dirty_rects == 0 ) {
+		return;
+	}
+
+	if (num_dirty_rects >= MAX_DIRTY_RECTS) {
+		num_dirty_rects = 1;
+		_cocoa_video_data.dirty_rects[0].left = 0;
+		_cocoa_video_data.dirty_rects[0].top = 0;
+		_cocoa_video_data.dirty_rects[0].right = _cocoa_video_data.width;
+		_cocoa_video_data.dirty_rects[0].bottom = _cocoa_video_data.height;
+	}
+
+	QZ_WaitForVerticalBlank();
+	/* Build the region of dirty rectangles */
+	for (i = 0; i < num_dirty_rects; i++) {
+
+		y = _cocoa_video_data.dirty_rects[i].top;
+		left = _cocoa_video_data.dirty_rects[i].left;
+		length_drawn = _cocoa_video_data.dirty_rects[i].right - left + 1;
+		height = _cocoa_video_data.dirty_rects[i].bottom;
+		for (; y <= height; y++) memcpy(dst + y * pitch + left, src + y * width +left, length_drawn);
+	}
+
+	_cocoa_video_data.num_dirty_rects = 0;
 }
 
 static int QZ_ListFullscreenModes(OTTDPoint* mode_list, int max_modes)